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
热门推荐
如何书写物业不作为的投诉信
血流漂杵说明只装备木制兵器?从出土文物,看商代中国军队青铜武器装备情况
初中英语语法详解:副词的位置
半月板三度损伤一定要做手术吗?深度解析:半月板三度损伤,手术还是保守治疗更合适?
老母鸡汤怎么炖好喝又营养
温和的洗发水:功效、误解与选择指南
56万字《孤勇:左宗棠新传》出版 刘江华:力争有新意有故事和真实可信
收藏!最全面的“引经药”讲解(附歌诀)
win11桌面存储路径从D盘改回C盘的方法介绍
因果报应:一种深植人心的社会信仰
宗教中的“因果报应”仅是文化心理现象,实际上不存在这种东西
建立人际关系网和你
Markdown 排版SSH 免密登入实践指南
规模化猪场的生物安全管理措施有哪些?
马桶出蓝色水怎么弄?解析问题及解决方案
癌症患者服用仑伐替尼好吗
牙疼服用甲硝唑期间饮酒的危害:可能引发严重双硫仑样反应
发烧烧“麻”了?警惕呼吸性碱中毒
挑选适合你的CPU:Intel vs AMD全面解析与推荐
《人民的名义》:大结局中的3个疑点,你看懂了吗?
如今社会,烧香拜佛,真的能改变一个人命运吗?
女性肝血管瘤的形成原因及治疗建议
DHCP动态分配地址,基于接口和全局模式。(最全详细过程)
基坑施工开挖要求
九球VS斯诺克:撞球界的终极对决,你更喜欢哪种比赛?
深入解析:如何正确定义数据寄存器以满足现代编程需求
詹姆斯攻防一体的秘密:湖人新阵容如何释放老詹潜能
入户门对着阳台的化解方法!
电视机路由器高级设置方法(优化网络连接)
【马桶安装】马桶怎么安装 马桶安装注意事项