/******************************************************************************************
键盘3*4扫描程序
入口参数:
出口参数:
键码:ee de be,7e,ed,dd,bd,7d,eb,db,bb,7b
0 1 2 3 4 5 6 7 8 9 a b
*********************************************************************************************/
void delay(uchar d);
uchar KeyV()
{ uchar readKey,a;
P2=0xf8; //确定行列位置
if(P2==0xf8)
return(keynum); //无键按下返回0
if(P2==0xf8) //再次判断。目的是确保检测正确
return(keynum);
else
{ delay(0); //调用延时函数 ,目的是去前沿键抖。
for(a=0;a<3;a++) //以下为经典的计算键值(判断闭合键所在的位置)
{ P2=_cror_(0xfb,a);
if(P24==0) break;
if(P25==0) break;
if(P26==0) break;
if(P27==0) break;
}
readKey=P2; //取得键值
for(;P2!=0xf8;P2=0xf8) ; //等待键松开,目的是去后沿键抖
flag=1;
return(readKey); //带键值返回主调函数
}
}
/*****************************************************************************************
计算返回数字键值模块,好让后面的程序调用的时候直接判断按键
可以执行其他的分支
*******************************************************************************************/
uchar keycode(void)
{ uchar key_code;
while(1)
{
key_code=KeyV();
switch(key_code)
{
case 0xee:keynum=0;break;
case 0xde:keynum=1;break;
case 0xbe:keynum=2;break;
case 0x7e:keynum=3;break;
case 0xed:keynum=4;break;
case 0xdd:keynum=5;break;
case 0xbd:keynum=6;break;
case 0x7d:keynum=7;break;
case 0xeb:keynum=8;break;
case 0xdb:keynum=9;break;
case 0xbb:keynum=0x0A;break;
case 0x7b:keynum=0x0B;break;
default:break;
}
return(keynum);
}
}
#include
unsigned char code table[]={0xC0,0xF9,0xA4,0xB0,0x99, //0~4
0x92,0x82,0xF8,0x80,0x90, //5~9
0x88,0x83,0xA7,0xA1,0x86,0x8E}; //A~F
void KeyScan();
void delay10ms(unsigned char time);
void Dispaly(unsigned char k);
unsigned char key,temp;
void main() //主程序
{
while(1)
{
KeyScan();
}
}
void KeyScan() //按键扫描子程序
{
P1=0xFF;
P1_3=0;
temp=P1;
temp&=0xF0;
if(temp !=0xF0)
{
delay10ms(1);
temp=P1;
temp&=0xF0;
if(temp !=0xF0)
{
temp=P1;
temp&=0xF0;
switch(temp)
{
case 0x70:
key=1;break;
case 0xB0:
key=2;break;
case 0xD0:
key=3;break;
}
Dispaly(key);
}
}
P1=0xFF;
P1_2=0;
temp=P1;
temp&=0xF0;
if(temp !=0xF0)
{
delay10ms(1);
temp=P1;
temp&=0xF0;
if(temp !=0xF0)
{
temp=P1;
temp&=0xF0;
switch(temp)
{
case 0x70:
key=4;break;
case 0xB0:
key=5;break;
case 0xD0:
key=6;break;
}
Dispaly(key);
}
}
P1=0xFF;
P1_1=0;
temp=P1;
temp&=0xF0;
if(temp !=0xF0)
{
delay10ms(1);
temp=P1;
temp&=0xF0;
if(temp !=0xF0)
{
temp=P1;
temp&=0xF0;
switch(temp)
{
case 0x70:
key=7;break;
case 0xB0:
key=8;break;
case 0xD0:
key=9;break;
}
Dispaly(key);
}
}
P1=0xFF;
P1_0=0;
temp=P1;
temp&=0xF0;
if(temp !=0xF0)
{
delay10ms(1);
temp=P1;
temp&=0xF0;
if(temp !=0xF0)
{
temp=P1;
temp&=0xF0;
switch(temp)
{
case 0x70:
key=14;break;
case 0xB0:
key=0;break;
case 0xD0:
key=15;break;
}
Dispaly(key);
}
}
}
//延时程序
void delay10ms(unsigned char time)
{
unsigned char a,b,c;
for(a=0;a for(b=0;b<10;b++)
for(c=0;c<120;c++)
;
}
void Dispaly(unsigned char k) //显示程序
{
P0=table[k];
P2_1=0;
}