矩阵键盘动态扫描

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

#include
#define uchar unsigned char
#define uint unsigned int
#define Kport P1 //键盘扫描端口
uchar cnt,temp;
uchar a=0;
uint counter=0;
uchar code Tab[10]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar str[]={0,1,2,6};
//4×4 键盘扫描程序
uchar KeyValueScan(void);
uchar KeyCheck(void);

void delay(void)
{
uint i;
for(i=0;i<900;i++);
}
void delay20ms(void)
{
unsigned char i,j;
for(i=0;i<100;i++)
for(j=0;j<60;j++)
;
}
void display()
{
uchar j;
temp=0xfe;
for(j=0;j<4;j++)
{
P2=temp;
P0=Tab[str[j]];
temp<<=1;
temp |=1;
delay();
}
}
void main(void)
{
uchar tmp;
uchar i;
TMOD=0x01;
TH0=0X3C;
TL0=0XB0;
EA=1;
ET0=1;
while(1)
{
if(cnt==20)
{
cnt=0;
counter = str[0]*1000+str[1]*100+str[2]*10+str[3];
counter++;
if(counter ==9999)
{
counter = 126;
}
str[0]=counter/1000;
str[1]=counter%1000/100;
str[2]=counter%100/10;
str[3]=counter%10;
}

tmp=KeyCheck();
if(tmp==255)
{
tmp=KeyValueScan();
if(tmp<10)
{
str[i]=tmp;
i++;
if(i==4)
i=0;
}
if(tmp==10) TR0=1;
if(tmp==11) TR0=0;

}
display(); //调用检测结果的显示程序

}

}
/*=================4×4=键=盘=扫=描=程=序=================*/
/*==========================================================
;4×4键盘扫描程序KeyValueScan(void)
;输入参数:无
;输出参数:扫描键值
;函数说明:没有键按下,不能退出程序。
==========================================================*/
uchar KeyValueScan(void)
{
uchar i;
uchar tmp=0;
uchar row_num=0x00; //行号初值
uchar row_scan=0xef; //行扫描初值

while(1)
{
tmp=KeyCheck(); //检查有无键按下?
if( tmp == 0 )
{
display();
}
else
{
delay20ms(); //延时去抖
tmp=KeyCheck();
if( tmp != 0 ) //确定有键按下
{
for(row_num=0;row_num<4;row_num++)
{
Kport=row_scan; //行扫描值送P1
tmp=Kport;
tmp&=0x0f;
for(i=0;i<4;i++)
{
if((tmp&0x01) == 0)
{
tmp=4*i;
tmp+=row_num; //得到键值
i=KeyCheck();
while( i==255 ) //等待按键的释放?
{
i=KeyCheck();
display();//自己体会
}
return(tmp); //返回键值
}
tmp>>=1;
}
row_scan<<=1; //扫描下一行
row_scan|=0x0f; //C语言移位指令不同于汇编
}
}
}
}
}

//判断有无键按下
uchar KeyCheck(void)
{
uchar tmp;
Kport=0x0f; //P1.0~P1.3是列P1.4~P1.7是行(‘0’输出的为行)
tmp=Kport;
tmp=~tmp;
tmp&=0x0f;
if( tmp == 0)
{
return(0); //无键按

下返回'0'
}
else
{
return(255); //有键按下返回'255'
}
}
void Time0(void) interrupt 1 using 1
{
TR0=0;
cnt++;
TH0=0X3C;
TL0=0XB0;
TR0=1;

}

相关文档
最新文档