一、设计目的
- 掌握 I/0以及矩阵式键盘扫描的基本原理;
- 掌握一个完整的C语言程序结构;
- 熟悉矩阵式键 盘扫描的编程。
二、设计环境
- Keil开发uVision开发环境;
- Proteus软件。
三、设计及调试
(1) 设计内容:
- 判断4*4 键盘是否有键被按下,无键按下时显示0,有键按下时显示1 (在数码管第一位显示)。
- 识别哪个键被按下,第1行的按键数值在第1位数码管上显示,第2行的按键数值在第2位数码管上显示,以此类推,显示4行的按键值。
(2) 设计硬件电路
AT89C51单片机,复位电路,晶振电路,四位共阴数码管,4*4键盘,数据总线。
(3) 实验过程及调试关键步骤
首先按要求在proteus中进行仿真,将所有元件排列无误后开始编写程序。因为要实现键盘检测与显示所以先对键盘检测进行测试,测试无误后对键盘显示开始编写,因为要精确到某行某列,所以要设置一个中间参数对P2口进行对比,每行进行循环,直到找到对应的行列进行break跳出循环操作,并且调试好delay延时函数的时间,最终能清晰明了的显示出来。
四、实验结果与分析
(1) 程序
#include<reg52.h>
#define uchar unsigned char
char digit[]={0x3f,0x06};
void delay(uchar n)
{
uchar i,j;
for(i=0;i<255;i++)
for(j=0;j<n;j++);}
int checkbutton(){
uchar i;
P2=0xf0;
i=P2;
i=i&0xf0;
if(i==0xf0)
return 0;
else
return 1;}
void shuma(){
P1=0xef;
if(checkbutton()==0)
P3=digit[0];
else
P3=digit[1];}
void main(){
shuma();
delay(5);}
#include<reg52.h>
#define uchar unsigned char
uchar digit[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7c,0x07,0x7f,0x67,0x77,0x7c,0x39,
0x5e,0x79,0x71,0x73};
uchar p2[]={0xfe,0xfd,0xfb,0xf7};
uchar p1[]={0xef,0xdf,0xbf,0x7f};
void delay(uchar n){
uchar i,j;
for(i=0;i<255;i++)
for(j=0;j<n;j++);}
int checkbutton(){
uchar i;
P2=0xf0;
i=P2;
i=i&0xf0;
if(i==0xf0)
return 0;
else
return 1;}
void shuma(){
uchar i,j;
uchar m=-4;
checkbutton();
if(checkbutton()==0) {
for(i=0;i<4;i++){
P1=p1[i];
P3=digit[0];
delay(1);}}
else
for(i=0;i<4;i++){
m=m+4;
P2=p2[i];
P1=p1[i];
j=P2;
j=j&0xf0;
if(j==0xe0){
P3=digit[1+m];
delay(10);
break;}
if(j==0xd0){
P3=digit[2+m];
delay(10);
break;}
if(j==0xb0){
P3=digit[3+m];
delay(10);
break;}
if(j==0x70){
P3=digit[4+m];
delay(10);
break;} }}
void main(){
while(1){
shuma();}}
(2) 实现结果及现象
- 如果4*4 键盘有键被按下显示1,无键按下时显示0 (在数码管第一位显示)。
- 没有键被按下则显示0。识别哪个键被按下,第1行的按键数值在第1位数码管上显示,第2行的按键数值在第2位数码管上显示,以此类推,显示4行的按键值。
按下第一行第四列时
按下第四行第二列时
(3) 实验结果的分析与总结,有无改进方案?
- 实验结果的分析与总结:当按键按下时进行了按键是否按下检测,检测成功后就会转到查找与显示程序上,最后将该行第几列在数码管对应的位选上显示出来,因为是仿真的缘故,没有加上松手检测,在实际应用上可能无法准确显示。
- 改进方案:添加上松手检测,并且可以考虑采用中断的方式进行检测与显示,简化程序时间复杂度。