c51单片机用一位八段共阴数码管显示4×4矩阵键盘的输入数。其中数码管是10个管脚,4×4矩阵键盘是8个管脚。数码管接在P0口,矩阵键盘接在P1口。请给出接线说明和c程序
时间: 2024-06-09 19:10:54 浏览: 114
接线说明:
数码管接线:
1. 共阴数码管的共阴极连接到GND。
2. a~g与dp8个数码管的8个阴极分别接到P0.0~P0.7。
3. P0口需要上拉。
矩阵键盘接线:
1. 4×4矩阵键盘的4行和4列共8个管脚分别接到P1.0~P1.3和P1.4~P1.7。
2. P1口需要上拉。
C程序:
```c
#include <reg52.h>
#include <intrins.h>
typedef unsigned char uchar;
typedef unsigned int uint;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x67,0x77,0x7c,0x39,0x5e,0x79,0x71
}; //0~F的显示码
uchar keyvalue=0;
uchar code keytable[]={
0xee,0xde,0xbe,0x7e,
0xed,0xdd,0xbd,0x7d,
0xeb,0xdb,0xbb,0x7b,
0xe7,0xd7,0xb7,0x77
}; //4x4矩阵键盘的键值
void delay(uint i){ //延时函数
while(i--);
}
void KeyDown(){ //矩阵键盘扫描函数
uchar i,j;
for(i=0;i<4;i++){
P1=0x0f^(0x01<<i); //将P1口的i行置低电平
_nop_(); //空操作,延时一下
j=P1; //读取P1口的状态
j=j&0x0f; //只保留低4位
if(j!=0x0f){ //判断是否有键按下
delay(1000); //延时去抖动
j=P1; //再次读取P1口的状态
j=j&0x0f; //只保留低4位
if(j!=0x0f){ //判断是否有键按下
keyvalue=keytable[i*4+j]; //获取键值
while((j=P1)&0x0f!=0x0f); //等待键松开
break;
}
}
}
}
void Display(uchar dat){ //数码管显示函数
LSA=0;LSB=0;LSC=0;P0=table[dat/1000%10];delay(1000);
LSA=1;LSB=0;LSC=0;P0=table[dat/100%10];delay(1000);
LSA=0;LSB=1;LSC=0;P0=table[dat/10%10];delay(1000);
LSA=1;LSB=1;LSC=0;P0=table[dat%10];delay(1000);
}
void main(){
P1=0xff; //P1口初始状态为高电平
while(1){
KeyDown(); //矩阵键盘扫描
if(keyvalue!=0){ //如果有键按下
Display(keyvalue); //在数码管上显示键值
keyvalue=0; //清零键值
}
}
}
```
阅读全文