编写一个51单片机的按键扫描函数,要求:可以去抖动,有按键按下返回键值,无键按下返回无效值
时间: 2024-05-09 20:19:09 浏览: 13
以下是一个基本的按键扫描函数,该函数采用简单的去抖动技术,并返回按下的键值或无效值。
```
#include <reg51.h>
#define KEY_NONE 0
#define KEY_1 1
#define KEY_2 2
#define KEY_3 3
#define KEY_4 4
unsigned char scan_key()
{
unsigned char key_value = KEY_NONE;
unsigned char key_scan = P1;
if ((key_scan & 0x0F) != 0x0F) //检测是否有按键按下
{
delay_ms(10); //去抖动
if ((key_scan & 0x0F) != 0x0F) //再次检测按键状态
{
//按键按下的处理
switch (key_scan & 0x0F)
{
case 0x0E: key_value = KEY_1; break;
case 0x0D: key_value = KEY_2; break;
case 0x0B: key_value = KEY_3; break;
case 0x07: key_value = KEY_4; break;
default: key_value = KEY_NONE; break;
}
}
}
return key_value;
}
void delay_ms(unsigned int ms) //延时函数
{
unsigned int i, j;
for (i = 0; i < ms; i++)
{
for (j = 0; j < 110; j++);
}
}
int main()
{
unsigned char key = KEY_NONE;
while (1)
{
key = scan_key();
if (key != KEY_NONE)
{
//按键按下的处理
}
}
return 0;
}
```