中断扫描工作方式键盘程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;
}
}