51单片机 | 独立按键实验
/*
实验名称:独立按键实验
接线说明:
实验现象:下载程序后,按下“独立按键”模块中 K1 键,控制 D1 指示灯亮灭
*/
#include ""
//对系统默认数据类型进行重定义
typedef unsigned char u8;
typedef unsigned int u16;
//定义独立按键控制脚
sbit KEY1 = P3^1;
sbit KEY2 = P3^0;
sbit KEY3 = P3^2;
sbit KEY4 = P3^3;
//定义LED1控制脚
sbit LED1 = P2^0;
//使用宏定义独立按键按下的值
#define KEY1_PRESS 1
#define KEY2_PRESS 2
#define KEY3_PRESS 3
#define KEY4_PRESS 4
#define KEY_UNPRESS 0
/*
函 数 名 : delay_10us
函数功能 : 延时函数,ten_us=1 时,大约延时 10us
输 入 : ten_us
*/
void delay_10us(u16 ten_us)
{
while (ten_us--);
}
/*
函 数 名 : key_scan
函数功能 : 检测独立按键是否按下,按下则返回对应键值
输 入 : mode=0 :单次扫描按键
mode=1 :连续扫描按键
输出: KEY1_PRESS :K1按下
KEY2_PRESS :K2按下
KEY3_PRESS :K3按下
KEY4_PRESS :K4按下
KEY1_UNPRESS :未有按键按下
说明:独立按键控制脚默认是高电平(1),按下时,则为低电平(0)
*/
u8 key_scan(u8 mode)
{
static u8 key = 1;
if (mode == 1) key = 1; //连续扫描按键
//任意按键按下
if (key == 1 && (KEY1 == 0 || KEY2 == 0 || KEY3 == 0 || KEY4 == 0))
{
key = 0;
delay_10us(1000); //消抖处理
if (KEY1 == 0)
return KEY1_PRESS;
else if (KEY2 == 0)
return KEY2_PRESS;
else if (KEY3 == 0)
return KEY3_PRESS;
else if (KEY4 == 0)
return KEY4_PRESS;
}
//无按键按下
else if (KEY1 == 1 && KEY2 == 1 && KEY3 == 1 && KEY4 == 1)
{
//无按键按下时key由0变为1,此时,再按下按键才会进行上述判断
key=1;
}
return KEY_UNPRESS;
}
void main()
{
u8 key = 0;
while (1)
{
//单次扫描按键
key = key_scan(0);
if (key == KEY1_PRESS)//检测按键K1是否按下
LED1 = !LED1; //LED1状态翻转
}
}