基于51单片机I/O 以及矩阵式键盘显示

51单片机 同时被 2 个专栏收录
4 篇文章 0 订阅
1 篇文章 0 订阅

一、设计目的

  1. 掌握 I/0以及矩阵式键盘扫描的基本原理;
  2. 掌握一个完整的C语言程序结构;
  3. 熟悉矩阵式键 盘扫描的编程。

二、设计环境

  1. Keil开发uVision开发环境;
  2. Proteus软件。

三、设计及调试
(1) 设计内容:

  1. 判断4*4 键盘是否有键被按下,无键按下时显示0,有键按下时显示1 (在数码管第一位显示)。
  2. 识别哪个键被按下,第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) 实现结果及现象

  1. 如果4*4 键盘有键被按下显示1,无键按下时显示0 (在数码管第一位显示)。
    在这里插入图片描述
    在这里插入图片描述
  2. 没有键被按下则显示0。识别哪个键被按下,第1行的按键数值在第1位数码管上显示,第2行的按键数值在第2位数码管上显示,以此类推,显示4行的按键值。
    在这里插入图片描述
    按下第一行第四列时
    在这里插入图片描述
    按下第四行第二列时
    在这里插入图片描述

(3) 实验结果的分析与总结,有无改进方案?

  1. 实验结果的分析与总结:当按键按下时进行了按键是否按下检测,检测成功后就会转到查找与显示程序上,最后将该行第几列在数码管对应的位选上显示出来,因为是仿真的缘故,没有加上松手检测,在实际应用上可能无法准确显示。
  2. 改进方案:添加上松手检测,并且可以考虑采用中断的方式进行检测与显示,简化程序时间复杂度。
  • 1
    点赞
  • 0
    评论
  • 3
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值