//扫描一次键盘,如果有按键且不是重复的,则返回键值
unsigned char getkey(unsigned char *lastkey, unsigned char *pressed)
{
unsigned char key, keymask;
//这里扫描一次键盘,如果有键按下则获得键值
delay_ms(10);
keymask = 0b11101111;
portc = 0xff;
portc &= keymask;
#asm("nop");
key = pinc;
if ((key & 0b00001111) == 0b00001111) //没有键按下
{
*pressed = 0;
keymask = 0b11011111;
portc = 0xff;
portc &= keymask;
#asm("nop");
key = pinc;
if (((key & 0b00001111) == 0b00001111))
{
*pressed = 0;
keymask = 0b10111111;
portc = 0xff;
portc &= keymask;
#asm("nop");
key = pinc;
if (((key & 0b00001111) == 0b00001111))
{
*pressed = 0;
keymask = 0b01111111;
portc = 0xff;
portc &= keymask;
#asm("nop");
key = pinc;
if (((key & 0b00001111) == 0b00001111))
{
*pressed = 0;
}
else
{
*pressed = 1;
}
}
else *pressed = 1;
}
else *pressed = 1;
}
else *pressed = 1;
if ((*pressed) && (key != *lastkey))
{
*lastkey = key;
//pressed = 0;
beep();
return key;
}
else
{
if (!*pressed)
{
*lastkey = 0;
}
}
return 0;
}
==================================
上面是自己写的键盘函数,用cvavr,不会iccavr,
非阻塞函数,运行一次扫描一遍,根据函数返回确定是否
有键按下以及键值。其中lastkey是全局变量,可以用来
抗抖动,或者结合定时器来识别按键的长按还是短按。