51单片机 | 独立按键实验

时间:2025-03-07 19:19:54
/* 实验名称:独立按键实验 接线说明: 实验现象:下载程序后,按下“独立按键”模块中 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状态翻转 } }