|
cpu:M128
//6行:PD0~PD5
//5列:PE0~PE4
void delay_1ms(void)
{
unsigned int i=0;
for (i=1; i<1142; i++);
}
void delay_nms(unsigned int n)
{
unsigned int i=0;
for (i=0; i<n; i++)
delay_1ms();
}
uchar keyscan(void)
{
uchar key_h=0;//行扫描
uchar key_l=0;//列扫描
uchar keycode=0;//按键返回值
uchar a=0;
uchar done=0;//按键扫描结束标志
PORTD=0x00;
DDRD=0xFF;//PD0~PD5行设置为输出
PORTE=0xFF;
DDRE=0xE0;//PE7输出,PE6输出LCM.PE0~PE4列设置为输入:1110,0000=0xE0
delay_1ms();// 延时
a=PINE;
a=PINE;//要读两次才可以
if ((a&0x1f)!=0x1f)
{
delay_nms(10);//延时消抖动;
a=PINE;
a=PINE;
if ((a&0x1f)!=0x1f)
{
key_h=0xfe;//起始的行扫描码1111,1110=0xfe
while (!done)
{
PORTD=key_h;
a=PINE;
a=PINE;
key_l=a&0x1f;
if (key_l!=0x1f)
{
done=1;
while ((key_l&0x01)!=0x00)
{
keycode++;
key_l>>=1;
}
}
else//此行没找到开始下一行的扫描
{
keycode+=5;
key_h=(key_h<<=1)|0x01;//行扫描码,最低位补1
done=0;
}
}
return keycode;
}
}
return 0xff;
}
返回的键值从下往上,从左到右依次是:0~29. |
|