标题:
本版4*3键盘扫描问题
[打印本页]
作者:
baikeeditor
时间:
2013-6-7 14:33
标题:
本版4*3键盘扫描问题
在按键情况较复杂的情况,如有长按键,组合键,连键等一些复杂功能的按键时候,我们跟倾向于用状态机来实现键盘的扫描;
//avr
单片机
中
4*3
扫描状态机实现
char read_keyboard_FUN2()
{
static char key_state = 0, key_value, key_line,key_time;
char key_return = No_key,i;
switch (key_state)
{
case 0: //
最初的状态,进行
3*4
的键盘扫描
key_line = 0b00001000;
for (i=1; i<=4; i++) //
扫描键盘
{
PORTD = ~key_line; //
输出行线电平
PORTD = ~key_line; //
必须送
2
次!!!(注
1
)
key_value = Key_mask &PIND; //
读列电平
if (key_value == Key_mask)
key_line <<= 1; //
没有按键,继续扫描
else
{
key_state++;//
有按键,停止扫描
break; //
转消抖确认状态
}
}
break;
case 1: //
此状态来判断按键是不是抖动引起的
if (key_value == (Key_mask & PIND))//
再次读列电平,
{
key_state++; //
转入等待按键释放状态
key_time=0;
}
else
key_state--; //
两次列电平不同返回状态
0
,(消抖处理)
break;
case 2: //
等待按键释放状态
PORTD = 0b00000111; //
行线全部输出低电平
PORTD = 0b00000111; //
重复送一次
if ( (Key_mask & PIND) == Key_mask)
{
key_state=0; //
列线全部为高电平返回状态
0
key_return= (key_line | key_value);//
获得了键值
}
else if(++key_time>=100)//
如果长时间没有释放
{
key_time=0;
key_state=3;//
进入连键状态
key_return=(key_line | key_value);
}
break;
case 3://
对于连键,每隔
50ms
就得到一次键值,
windowsxp
系统就是这样做的
PORTD = 0b00000111; //
行线全部输出低电平
PORTD = 0b00000111; //
重复送一次
if ( (Key_mask & PIND) == Key_mask)
key_state=0; //
列线全部为高电平返回状态
0
else if(++key_time>=5) //
每隔
50MS
为一次连击的按键
{
key_time=0;
key_return=(key_line | key_value);
}
break;
}
return key_return;
}
问题点:
请问
key_value= Key_mask & PIND;
什么意思?
Key_mask
是做什么用的?
如何初始化定义?
作者:
cuicaifeng
时间:
2013-7-30 13:15
应该是没有用到那么引脚吧
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0