您的位置:首页 > 其它

4X4键盘扫描演示程序

2011-05-04 23:30 225 查看
由于需要做一个单片机按键 通过串口发送按键信息的小程序 自己用AVR 模拟了一下 发送到LCD1602上

4x4一个16个键 正好两个字节 发送到串口 可以支持多个按键同时按下。

void KeyInit()
{
DDRA = 0x0f;  //4个输出 4个输入
}
unsigned int KeyScan()
{
unsigned char temp;
unsigned int value;
PORTA = 0x01;    //扫描第一行
delay_nms(1);
temp = PINA;
value = temp>>4;

PORTA = 0x02;   //扫描第二行
delay_nms(1);
temp = PINA;
value += temp&0xf0;

PORTA = 0x04;    //扫描第三行
delay_nms(1);
temp = PINA;
value += (unsigned int)(temp&0xf0)<<4;

PORTA = 0x08;    //扫描第四行
delay_nms(1);
temp = PINA;
value += (unsigned int)(temp&0xf0)<<8;
return value;
}
void main(void)
{
unsigned int keyvalue;
unsigned int beforekey;
unsigned char i;
INIT_1602();
KeyInit();
while(1)
{
if( KeyScan()!=0)  //有按键
{
delay_nms(10);  //防抖
keyvalue=KeyScan();			//取值
if( keyvalue!=0)
{

if(beforekey!=keyvalue)   //新按键值
{
beforekey=keyvalue;
for(i=0;i<16;i++)
{
if(keyvalue&(1<<i))
Write_1602_Byte(i,0,49) ;
else
Write_1602_Byte(i,0,48) ;
}
}
}
}
else if( KeyScan()==0)
{
if(beforekey!=0) //按键松开 发一次值
{clear_1602();
beforekey=0;}
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: