C51单片机矩阵键盘输入&数码管静态显示
创作时间:
作者:
@小白创作中心
C51单片机矩阵键盘输入&数码管静态显示
引用
CSDN
1.
https://m.blog.csdn.net/weixin_42411288/article/details/142202548
实验目的
学会矩阵键盘的检测,掌握数码管静态显示原理。
实验现象
依次按下4*4矩阵键盘上从第1到第20个键,同时在六位数码管上依次显示0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。
实验说明
本开发板上数码管为共阴极。静态数码管显示原理(视频中有详细介绍):这里就共阴极数码管显示原理进行讲解,一位数码管内一共有8个发光二极管,对共阴极来说其8个发光二极管的阴极在数码管内部全部接在一起,也就是“共阴”说法的来源,阳极是独立的,设计电路时一般把阴极接地,当我们从外部给任一个阳极加一个高电平时这个发光二极管就亮了,如果想要出一个8字,并且把右下角的小数点也点亮的话,那可以给8个阳极全送高电平,想让数码管显示几就给相对应的发光二极管送高电平,因此我们在显示数字的时候首先做的就是给0-9十个数字编好码,在要它亮什么数字的时候直接把这个编码送到它的阳极就行了。另外说一下,一般的数码管每一段亮至少需要10个毫安的电流,而单片机的IO口送不出如此大的电流,所以我们需要加数码管的驱动电路,可以用上拉电阻的方法,也可以使用专门的驱动芯片,本开发板使用的74HC573,其输出电流较大,足够点亮数码管。本开发板上的六位数码管中每个相同段号(段指a,b,c,d,e,f,g,h)全部是接在一起的,其中每一个位(阴极)是独立的,所以在做静态显示的时候所有的数码管只能显示相同的数字,当然可以控制哪几位显示,如果让它们显示不同的数字那就得给每一个数码管加一套驱动电路了。但这样做是没有必要的,后面我们会讲到关于数码管动态显示原理。
下面给出本开发板共阴极数码管数字编码。
矩阵键盘的四行分别与P3.0-P3.3连接,四列分别与P3.4-P3.7连接。
硬件电路
程序代码
#include <reg52.h>
//sbit beep=P2^3; //位定义蜂鸣器控制I/O
sbit dula=P2^6; //位定义数码管段选控制I/O
sbit wela=P2^7; //位定义数码管位选控制I/O
unsigned char x,temp,key;
unsigned char code table[]=
{
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71 };
void delay(unsigned char x)
{
unsigned char i,j;
for(i=x;j>0;j--)
for(j=110;j>0;j--);
}
void LED_display(unsigned int num)
{
dula=1;
P0=table[num]; //发送显示的数值
dula=0;
P0=0xFF; //消影
wela=1;
P0=0xC0;
wela=0;
}
void Key_1H()
{
P3=0xfe; //给P3.0送低电平,其余为高电平(第一行)
temp=P3; //将P3口的数据读回来
temp=temp&0xf0; //把P3口的数据与11111110相与
if(temp!=0xf0) //如果有按键按下则一定不相等,进入下一步检测
{
delay(10); //延时去抖动
if(temp!=0xf0) //再次判断是否有按键按下
{
temp=P3; //判断有按键按下,读取P3口的数据
switch(temp) //根据p3口的数据,判断是第几列的按键按下
{
case 0xee: //如果P3数据等于0xee则说明是第一行第1列按键被按下1110 1110
key=0;
break;
case 0xde: //如果P3数据等于0xde则说明是第一行第2列按键被按下1101 1110
key=1;
break;
case 0xbe:
key=2; //1011 1110
break;
case 0x7e:
key=3;
break;
}
while(temp!=0xf0) //检测按键是否被释放
{
temp=P3;
temp=temp&0xf0;
//beep=0; //蜂鸣器一直响
}
//beep=1; //关闭蜂鸣器
LED_display(key); //显示按键数值
P1=0xfe; //第2行亮2个灯
}
}
}
void Key_2H()
{
P3=0xfd; //给P3.0送低电平,其余为高电平(第一行)
temp=P3; //将P3口的数据读回来
temp=temp&0xf0; //把P3口的数据与11111110相与
if(temp!=0xf0) //如果有按键按下则一定不相等,进入下一步检测
{
delay(10); //延时去抖动
if(temp!=0xf0) //再次判断是否有按键按下
{
temp=P3; //判断有按键按下,读取P3口的数据
switch(temp) //根据p3口的数据,判断是第几列的按键按下
{
case 0xed: //如果P3数据等于0xee则说明是第一行第1列按键被按下
key=4;
break;
case 0xdd: //如果P3数据等于0xde则说明是第一行第2列按键被按下
key=5;
break;
case 0xbd:
key=6;
break;
case 0x7d:
key=7;
break;
}
while(temp!=0xf0) //检测按键是否被释放
{
temp=P3;
temp=temp&0xf0;
//beep=0; //蜂鸣器一直响
}
//beep=1; //关闭蜂鸣器
LED_display(key); //显示按键数值
P1=0xfc; //第2行亮2个灯
}
}
}
void Key_3H()
{
P3=0xfb; //给P3.0送低电平,其余为高电平(第一行)
temp=P3; //将P3口的数据读回来
temp=temp&0xf0; //把P3口的数据与11111110相与
if(temp!=0xf0) //如果有按键按下则一定不相等,进入下一步检测
{
delay(10); //延时去抖动
if(temp!=0xf0) //再次判断是否有按键按下
{
temp=P3; //判断有按键按下,读取P3口的数据
switch(temp) //根据p3口的数据,判断是第几列的按键按下
{
case 0xeb: //如果P3数据等于0xee则说明是第一行第1列按键被按下
key=8;
break;
case 0xdb: //如果P3数据等于0xde则说明是第一行第2列按键被按下
key=9;
break;
case 0xbb:
key=10;
break;
case 0x7b:
key=11;
break;
}
while(temp!=0xf0) //检测按键是否被释放
{
temp=P3;
temp=temp&0xf0;
//beep=0; //蜂鸣器一直响
}
//beep=1; //关闭蜂鸣器
LED_display(key); //显示按键数值
P1=0xf8; //第3行亮3个灯
}
}
}
void Key_4H()
{
P3=0xf7; //给P3.0送低电平,其余为高电平(第一行)
temp=P3; //将P3口的数据读回来
temp=temp&0xf0; //把P3口的数据与11111110相与
if(temp!=0xf0) //如果有按键按下则一定不相等,进入下一步检测
{
delay(10); //延时去抖动
if(temp!=0xf0) //再次判断是否有按键按下
{
temp=P3; //判断有按键按下,读取P3口的数据
switch(temp) //根据p3口的数据,判断是第几列的按键按下
{
case 0xe7: //如果P3数据等于0xee则说明是第一行第1列按键被按下
key=12;
break;
case 0xd7: //如果P3数据等于0xde则说明是第一行第2列按键被按下
key=13;
break;
case 0xb7:
key=14;
break;
case 0x77:
key=15;
break;
}
while(temp!=0xf0) //检测按键是否被释放
{
temp=P3;
temp=temp&0xf0;
//beep=0; //蜂鸣器一直响
}
//beep=1; //关闭蜂鸣器
LED_display(key); //显示按键数值
P1=0xf0; //第2行亮2个灯
}
}
}
void main()
{
dula=0;
wela=0; //先关闭两个锁存器
while(1)
{
Key_1H();
Key_2H();
Key_3H();
Key_4H();
}
}
本文原文来自CSDN
热门推荐
生育津贴与停保有关且影响大,三种情况中断后不再享受
医疗器械CE审核:采购控制,把好质量安全第一关!
C语言如何编写输入函数
是否需要因瞬间眩晕去看神经科医生
四川精选:适合中小学生出游的亲子景点与教育实践基地一览
如何优化产品原型的用户流程
探索不同IP地址之间的关系:解析网络世界的地址架构
《小巷人家》:隐藏在生活细节中的教育真谛
刀郎《山歌响起的地方》2025巡回演唱会-济南站
以400余件史料,为我们重新认识岳飞悲剧的真相
赵构与岳飞:忠诚与背叛,无奈与抉择
温文尔雅小家碧玉展现大家闺秀风范
盐水猪肝怎么做好吃?四种详细做法,让你轻松掌握这道经典下酒菜
猪肝的营养价值及危害
Velocity如何提升前端开发效率与用户体验
斜杠青年探行:大学生群体的时间管理与社会焦虑困境
重庆渣滓洞白公馆门票价格及预约指南:预约是否限当天
法定存款中的活期存款:了解其特点和优势
揭秘:轩辕一词的深刻含义是什么?
石中隐玉格男命详解:命盘揭示万中无一的贤妻命运
如何在Chrome浏览器中禁用图片加载功能
什么是反对称矩阵?它有哪些独特性质?
什么是白肉和红肉
从用户反馈到迭代升级:建立企业官网持续优化机制
倪海厦:一个简单护眼法,缓解眼部干涩、疲劳,让眼睛逐渐明亮!
从“四缺”到 “四有”,竞逐低空经济发展新赛道
团队责任机制:提升团队效能的关键工具
中美驱逐舰力量对比:中国海军58艘驱逐舰,与美国差距几何?
汽车后视镜调整技巧:提升行车安全视野的全方位指南
唐朝广州为“通海夷道”起点