51单片机开发:独立键盘实验

实验目的:按下键盘1时,点亮LED灯1。

键盘原理图如下图所示,可见,由于接GND,当键盘按下时,P3相应的端口为低电平。

键盘按下时会出现抖动,时间通常为5-10ms,代码中通过延时函数delay_10us将抖动过滤掉。

我们要实现的功能是按下键盘1,LED1点亮,再按下键盘1,LED1熄灭。为了防止一直按着键盘不松手,LED1被反复点亮熄灭,代码中通过key来确保按下键盘只执行一次操作。

cpp 复制代码
#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;
	 }
  }
}
相关推荐
俊基科技1 小时前
A-59U工业级多模语音处理模块在矿山矿井通信与呼叫报警系统中的应用
嵌入式硬件·嵌入式开发·硬件开发·ai降噪·回音消除·拾音降噪
周周记笔记3 小时前
GD32F450xx MCU Datasheet 解读:硬件测试工程师的测试方法论
单片机·嵌入式硬件
AOI小白新手上路7 小时前
江科协51单片机16-1 AD/DA ADC 三通道综合显示(LCD1602 版)改造说明
单片机·嵌入式硬件·51单片机
HUI-4747 小时前
EG1135|SSOP‑16 同步整流降压控制器,大功率外置 MOS 降压优选
单片机·嵌入式硬件·硬件工程
单片机仿真设计8 小时前
【proteus仿真】基于 STM32 单片机恒温箱控制系统设计(仿真图+程序)
stm32·单片机·嵌入式硬件·proteus·毕设
国科安芯8 小时前
星载CAN总线通信网络中抗辐射MCU的通信可靠性设计分析
网络·人工智能·分布式·单片机·嵌入式硬件·架构
AOI小白新手上路10 小时前
江科协51单片机16-1 DA数模转换实验(PWM 呼吸灯)
单片机·嵌入式硬件·51单片机
hongmai66688810 小时前
告别Wi-Fi,专注Mesh:ESP32-H2-MINI-1U-H2S模组规格与应用
单片机·嵌入式硬件·物联网·5g·h.265
Yiran_G10 小时前
BLE通信距离怎么判断?从发射功率、PHY到天线设计分析
单片机·嵌入式硬件
女神下凡11 小时前
芯参谋(11): 各种存储芯片电路设计
开发语言·嵌入式硬件