中断扫描工作方式键盘程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

中断扫描工作方式键盘程序

#include

/*定义0〜9,A〜F十六个字符的字型码表*/

unsigned char table[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,

0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71}; /*10ms延时程序*/

void delay10ms(void)

{

unsigned char i,j;

for(i=20;i>0;i--)

for(j=248;j>0;j--);

}

/*键盘扫描子程序*/ unsigned char scan_key(void)

{

unsigned char n,scan,col,rol,tmp;

bit flag=0; //设有键按下标志位

scan=0xef;

P0=0x0f;

//P0 口低四位做输入口,先输出全1

for(n=0;n<4;n++) //循环扫描 4 列,从0 列开始

P0=scan; //逐列送出低电平

tmp=~P0; //读行值,并取反tmp=tmp&0x0f;

col=n; //保存列号到col flag=1;

/* 判断哪一行有键按下,并保存行号到rol*/ if(tmp==0x01)

{ rol=0; break;} else if(tmp==0x02)

{ rol=1; break;} else if(tmp==0x04)

{ rol=2; break;} else if(tmp==0x08)

{ rol=3; break;} else

flag=0; scan=(scan<<1)+1; }

if(flag==0)

return -1;

else

return(rol*4+col); //第0 行有键按下

//第 1 行有键按下

//第 2 行有键按下

} void main()

{

P1=0x00; EA=1;

//开总中断 EX0=1;

//开外部中断 0 中断 IT0=1;

//设定外部中断 0 为边沿触发方式 P0=0x0f;

//P0 口高四位为 0,用于检测是否有键按下 while(1);

//等待外部中断 0 中断 }

/*外部中断 0 中断服务函数 */ void scan_key_led(void) interrupt 0

{

char k;

unsigned char key,tmp;

delay10ms();

P0=0x0f;

tmp=P0;

if(tmp!=0x0f)

{

key=scan_key( );

值送 key

while(k!=-1)

//判断闭合键是否释放,直到其释放 {

delay10ms(); // 延时等待

//延时 10ms 去抖 //所有列输出低电平 再次读键盘状态 //有键按下,调用键盘扫描程序,并把键

k=scan_key( );

}

P1=table[key]; // 字型码送P1 口,数码管显示被按下键对应的字符

P0=0x0f;

}

}

相关文档
最新文档