就二数码管+5个按键,按键复用段位
下面是protues
点击此处下载
ourdev_581898BCZ6IK.rar(文件大小:16K) (原文件名:单.rar)
/***********************************************************************
* 函数名称: GetKeyCode()
* 函数功能: 获得按键物理编码
1列8行
**********************************************************************
unsigned char GetKeyCode(void)
{
static unsigned char key_state, key_value, key_line;
unsigned char key_return = 0;
unsigned char i;
unsigned char Key_temp=0;
switch (key_state)
{
case 0: //初始状态
key_line = 0x01;
for (i=0; i<8; i++) // 扫描键盘
{
P1=key_line; // 输出行线电平
key_value = Key; // 读列电平,
if (key_value == 0) // 低电平.无键按下
{
key_line <<= 1; // 没有按键,继续扫描下一位
}
else // 有按键,停止扫描,转消抖确认状态
{
key_state=1;
break; //退出for循环
}
}
break;
case 1:
P1=key_line; //将上次的值再次赋给P1口,再次检测Key
Key_temp=Key; //再次读列电平
if (key_value == Key_temp ) //与状态0的相同,确认按键
{
switch (key_line) // 键盘编码,返回编码值
{
case 0x02: key_return = KEY_1; break;
case 0x01: key_return = KEY_2; break;
case 0X80: key_return = KEY_3; break;
case 0X20: key_return = KEY_4; break;
case 0X40: key_return = KEY_5; break;
default : key_return = NO_KEY;break;
}
key_state++; // 转入等待按键释放状态
}
else key_state=0; // 两次列电平不同返回状态0,(消抖处理)
break;
case 2: // 等待按键释放状态
if ( Key== 0) key_state=0;
break;
}
return key_return;
}
按键检测部分,始终不行!~
一周热门 更多>