实验目的:按下键盘1时,点亮LED灯1。
键盘原理图如下图所示,可见,由于接GND,当键盘按下时,P3相应的端口为低电平。
键盘按下时会出现抖动,时间通常为5-10ms,代码中通过延时函数delay_10us将抖动过滤掉。
我们要实现的功能是按下键盘1,LED1点亮,再按下键盘1,LED1熄灭。为了防止一直按着键盘不松手,LED1被反复点亮熄灭,代码中通过key来确保按下键盘只执行一次操作。
#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit KEY1 = P3^1; //定义键盘对应的端口
sbit KEY2 = P3^0;
sbit KEY3 = P3^2;
sbit KEY4 = P3^3;
sbit LED1 = P2^0; //LED灯对应的端口
#define KEY1_PRESS 1
#define KEY2_PRESS 2
#define KEY3_PRESS 3
#define KEY4_PRESS 4
#define KEY_UNPRESS 0
void delay_10us(u16 ten_us){
while(ten_us--);
}
static u8 key=1;
u8 key_scan(u8 mode){
if(mode)key=1; //key的目的是防止一直按按键不松手
if(key==1 &&(KEY1==0||KEY2==0||KEY3==0||KEY4==0)){//低电平表示键盘被按下
delay_10us(1000);
key=0;
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=1;
}
return KEY_UNPRESS;
}
void main(){
u8 key=0;
while(1){
key = key_scan(0);
if(key==KEY1_PRESS){//当键盘1按下时,LED灯1被点亮
LED1 = !LED1;
}
}
}