这里以蓝桥杯的单片机板子作为参考
法一:查询方式
只要查询其引脚电平是否发生变化,就可以判断按键是否被按下。
其具体的实现函数为:
//按键扫描函数
uchar key_scan(void)
{
uchar key;
P3 &= 0x0F;
switch (P3)
{
case 0x0E:
key = 7;
break;
case 0x0D:
key = 6;
break;
case 0x0B:
key = 5;
break;
case 0x07:
key = 4;
break;
default:
key = 0x0F;
break;
}
return key;
}
void key_action(void)
{
uchar key;
key = key_scan();
if(key != 0x0F)
{
delay_ms(10);
key = key_scan();
if(key != 0x0F)
{
switch(key)
{
case 7:
led_on();
break;
case 6:
led_off();
break;
case 5:
relay_on();
break;
case 4:
relay_off();
break;
default:
break;
}
while(P3 != 0x0F);
}
}
}
法二:中断方式
中断方式的区别在于对改端口的引脚变化进行实时检测,从而及时地判断引脚是否被按下。
其具体的实现函数为:
void int0_handler(void) interrupt 1
{
static ms_count = 0;
if(++ms_count == 10) //10ms进行按键检测
{
ms_count = 0;
key_flag = 1;
}
display();
}
void key_check(void)
{
uchar key = 0;
static bit key_ready = 0; //按键数据存储完毕标志位
static uchar key_save = 0; //保存键值
static uchar key_time = 0; //记录按键的次数
if(key = key_scan())
{
key_time ++;
if(key_time == KEY_LAST)
{
key_time = 0;
key_ready = 1;
key_save = key;
}
}
else if(!(key_scan()) && (key_ready == 1)) //wait for key up
{
key_ready = 0;
key_action(key_save);
}
}
具体工程情况详见附件。
7.int_control_display.zip
(35.55 KB, 下载次数: 7)
3.key.zip
(29.64 KB, 下载次数: 5)
|