#include <REGX52.H> void Delay(unsigned int xms) { unsigned char i, j; while(xms--) { i = 2; j = 239; do { while (--j); } while (--i); } } unsigned char MatrixKey()//如果按键按下不放,程序会停留在此函数,松手的一瞬间, { //返回按键键码,没有按键按下时,返回0 unsigned char KeyNumber=0;//KeyNumber 按下按键的键码值 P1=0xFF; P1_3=0; if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=1;} if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=5;} if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=9;} if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=13;} P1=0xFF; P1_2=0; if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=2;} if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=6;} if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=10;} if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=14;} P1=0xFF; P1_1=0; if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=3;} if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=7;} if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=11;} if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=15;} P1=0xFF; P1_0=0; if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=4;} if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=8;} if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=12;} if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=16;} return KeyNumber; }
时间: 2023-12-05 07:04:41 浏览: 99
单片机reg52.h
4星 · 用户满意度95%
这是一段51单片机的矩阵键盘扫描程序,通过逐行扫描的方式检测按键是否按下,并返回按键键码值。具体实现过程如下:
1. 选择第一行,将第三个IO口置低,检测第七、六、五、四个IO口是否有低电平信号,如果有,则表示该行有按键按下,通过Delay函数延时处理按键防抖动,然后在等待按键松开后返回对应的键码值,没有按键按下则返回0。
2. 选择第二行、第三行、第四行,重复步骤1的操作,检测按键是否按下,返回对应的键码值。
需要注意的是,程序中的Delay函数实现了一个简单的延时功能,用于处理按键防抖动。这段程序的逐行扫描方式存在按键冲突的问题,需要通过其他方式来解决。同时,程序中没有加入超时机制,如果按键一直按下不松开,程序会一直停留在该函数中。
阅读全文