按键输入程序:unsigned char MatrixKey() { unsigned char KeyNumber=0; P1=0xFF; P1_0=0; if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=13;} if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=9;} if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=5;} if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=1;} P1=0xFF; P1_1=0; if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=14;} if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=10;} if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=6;} if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=2;} P1=0xFF; P1_2=0; if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=15;} if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=11;} if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=7;} if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=3;} P1=0xFF; P1_3 =0; if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=16;} if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=12;} if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=8;} if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=4;} return KeyNumber; }
时间: 2023-06-25 18:06:19 浏览: 58
这段程序是用来读取矩阵键盘输入的。它首先将P1口(8051单片机的一个I/O口)设置为高电平,然后依次将P1的每一位输出为低电平,检测键盘的输出,最后返回对应的按键编号。其中,Delay(20)表示延时20毫秒,while(P1_x==0)表示当P1_x为低电平时,一直等待。这里的P1_x表示P1口的第x位。
相关问题
#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; }
这是一段51单片机的矩阵键盘扫描程序,通过逐行扫描的方式检测按键是否按下,并返回按键键码值。具体实现过程如下:
1. 选择第一行,将第三个IO口置低,检测第七、六、五、四个IO口是否有低电平信号,如果有,则表示该行有按键按下,通过Delay函数延时处理按键防抖动,然后在等待按键松开后返回对应的键码值,没有按键按下则返回0。
2. 选择第二行、第三行、第四行,重复步骤1的操作,检测按键是否按下,返回对应的键码值。
需要注意的是,程序中的Delay函数实现了一个简单的延时功能,用于处理按键防抖动。这段程序的逐行扫描方式存在按键冲突的问题,需要通过其他方式来解决。同时,程序中没有加入超时机制,如果按键一直按下不松开,程序会一直停留在该函数中。
请帮我为以下代码添加注释#include <REGX52.H> NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7c,0x39,0x5e,0x79,0x71}; int MatrixKeyNum; void Delay(unsigned int xms) { unsigned char i, j; while(xms--) { i = 2; j = 239; do { while (--j); } while (--i); } } void Nixie(unsigned char Location,Number) { switch(Location) { case 1:P2_4=1;P2_3=1;P2_2=1;break; case 2:P2_4=1;P2_3=1;P2_2=0;break; case 3:P2_4=1;P2_3=0;P2_2=1;break; case 4:P2_4=1;P2_3=0;P2_2=0;break; case 5:P2_4=0;P2_3=1;P2_2=1;break; case 6:P2_4=0;P2_3=1;P2_2=0;break; case 7:P2_4=0;P2_3=0;P2_2=1;break; case 8:P2_4=0;P2_3=0;P2_2=0;break; } P0=NixieTable[Number]; } unsigned char MatrixKey() { unsigned char KeyNumber=0; 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; } void main() { while(1) { MatrixKeyNum=MatrixKey(); if(MatrixKeyNum) Nixie(1,MatrixKeyNum); } }
这段代码是一个基于单片机的数码管键盘输入程序,以下是代码的注释:
```C
//引入头文件regx52.h
#include <REGX52.H>
//定义数码管的显示表
NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7c,0x39,0x5e,0x79,0x71};
//定义全局变量MatrixKeyNum
int MatrixKeyNum;
//定义延时函数
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
//定义数码管显示函数
void Nixie(unsigned char Location,Number)
{
switch(Location)
{
case 1:P2_4=1;P2_3=1;P2_2=1;break;
case 2:P2_4=1;P2_3=1;P2_2=0;break;
case 3:P2_4=1;P2_3=0;P2_2=1;break;
case 4:P2_4=1;P2_3=0;P2_2=0;break;
case 5:P2_4=0;P2_3=1;P2_2=1;break;
case 6:P2_4=0;P2_3=1;P2_2=0;break;
case 7:P2_4=0;P2_3=0;P2_2=1;break;
case 8:P2_4=0;P2_3=0;P2_2=0;break;
}
P0=NixieTable[Number];
}
//定义矩阵键盘扫描函数
unsigned char MatrixKey()
{
unsigned char KeyNumber=0;
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;
}
//主函数
void main()
{
while(1)
{
MatrixKeyNum=MatrixKey();
if(MatrixKeyNum) Nixie(1,MatrixKeyNum);
}
}
```
阅读全文