编写程序,通过点按矩阵键盘的按钮,2位数码管显示00~15 16个数字。在按钮未按下时,数码管不显示。
(1)硬件图
Proteus仿真图:
(2)软件设计
①头文件部分
#ifndef ShowNum_H
#define ShowNum_H
//delay延时函数
void delay(int j){
char i =250;
for(;j>0;j–){
while(–i);
i=100;
}
}
//key函数
int key(){
int keyval=-1;
P1=0x0f;
if(P1!=0x0f)
delay(2);
if(P1!=0x0f){
switch(P1){
case (0X0e):keyval=0;break;
case (0X0d):keyval=1;break;
case (0X0b):keyval=2;break;
case (0X07):keyval=3;break;
}
}
P1=0XF0;
switch(P1){
case (0Xe0):keyval=keyval+0;break;
case (0Xd0):keyval=keyval+4;break;
case (0Xb0):keyval=keyval+8;break;
case (0X70):keyval=keyval+12;break;
}
return keyval;
}
//showNum二位数码管显示函数
void showNumByCA(int num){
int box[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0xf82,0xf8,0x80,0x90,0x40};
unsigned char k;
for(k=0;k<40;k++){
int numR = num%10;
int numL = num/10;
P2=0xfd;
P0=box[numL];
delay(20);
P2=0xfe;
P0=box[numR];
delay(20);
}
}
#endif
②主程序部分
#include<reg51.h>
#include <ShowNum.h>
void main(){
int keyValue;
while(1){
keyValue=key();
if(keyValue==-1){
P2=0xff;
}else{
showNumByCA(keyValue);
}
delay(20);
P2=0xff;
}
}
(3)效果图
(4)实验结论及分析
1.模块化编程
本次实验加入了头文件(.h文件)。将实验中用到的所有函数(延时函数void delay(int j),判断按钮函数int key(),二位数码管显示函数void showNumByCA(int num))。通过这样设置,可使主程序耦合度最低,结构清晰。
2.程序的核心思想
①:利用判断按钮函数int key()得知按下的是哪个按钮。
②:①中得出的keyvalue传入二位数码管显示函数void showNumByCA(int num))。
③:显示数字完毕后,执行循环,程序步入①中。①②③①②③①…循环。
3.实验中遇到的问题
①:有时侯按钮按下时不识别。推测消抖的过程出现问题。
②:仿真显示数字完毕后不会自动熄灭。推测key()函数出现问题,导致二位数码管显示函数接收了错误的keyvalue值。