【51单片机】矩阵按键实现数码管显示
目录
- 前言
- 数码管
- 共阴极数码管
- 共阳极数码管
- 共阴极数码管表
- 数码管硬件设计
- 数码管显示软件设计
- 矩阵按键
- 按键介绍
- 按键消抖
- 矩阵按键硬件设计
- 矩阵按键实现数码管显示软件设计
- 总结
前言
闲的没事看一看玩一玩·········
矩阵按键
数码管
数码管是一种导体发光器件,其基本单元是发光二极管。按发光二极管单元连接方式可分为共阳极数码管和共阴极数码管
共阴极数码管
共阴极数码管是指将所有发光二极管的阴极接到一起形成共阴极的数码管,共阴极的数码管在应用时将公共级的COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应的字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。
但是,IC芯片驱动能力往往是较小的,如果采用共阴极接法,因为它的驱动在非公共端,就有可能受限于IC芯片输出电流不够而显示昏暗,要外加上拉电阻或者是增加三极管加大驱动能力。
共阳极数码管
共阳极数码管是指将所有发光二极管的阳极接到一起形成公共阳极 (COM) 的数码管,共阳极数码管在应用时应将公共极COM接到 +5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮
与共阴极相反,一般共阳极数码管更为常用,因为将驱动数码管的工作交到公共端(一般接驱动电源),加大驱动电源的功率自然要比加大IC芯片I/O口的驱动电流简单许多。另一方面,这样也能减轻主芯片的负担。
共阴极数码管表
我的开发板上使用的数码管是2个4位一体的共阴极数码管(即8个LED的阳极全部并联在一起引出,阴极分别引出A、B…DP),如果要让共阴极数码管显示数字0,即对应的段ABCDEF要给它高电平,其他的段给低电平。下面是共阴极数码管的 0 - F 段码数据表示。
0x3f | 0x06 | 0x5b | 0x4f | 0x66 | 0x6d |
---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | 5 |
0x7d | 0x07 | 0x7f | 0x6f | 0x77 | 0x7c |
6 | 7 | 8 | 9 | A | B |
0x39 | 0x5e | 0x79 | 0x71 | 0x00 | |
C | D | E | F | 无显示 |
数码管硬件设计
开发板上的晶体数码管模块电路图如下:
上面的数码管电路使用的是两个四位一体的共阴数码管组成,假设我们控制SMG1最左边的那个数码管默认显示0,因为单片机的IO口外部都增加了外部上拉电阻,因此P22、P23、P24引脚默认就是高电平,根据38译码器输出特点,此时Y7脚(LED8)输出有效,即低电平。而数码管的段选a-dp连接在了74HC245驱动芯片输出口,由P0端口控制。所以只要控制P0口输出高电平,SMG1最左边的那个数码管默认就可以显示。(如果有兴趣的话可以去了解一下38译码器的工作原理)。
74HC245作为驱动芯片使用,目的是让数码管能获得更大的电流,为防止因电流过大烧坏数码管,在74HC245芯片输出管脚又串联了2个4位的100欧排阻后连接数码管段码a-dp脚。
数码管显示软件设计
#include "reg52.h"
typedef unsigned int u16;//对系统默认数据进行重定义
typedef unsigned char u8;
#define SMG_A_DP_PORT P0//使用宏定义数码管段码口//定义数码管位选信号控制脚
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;//共阴极数码管显示0~F的段码数据
u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//延时函数
void delay_10us(u16 ten_us)
{while(ten_us--);
}//功能函数
void smg_display(void)
{u8 i=0;for(i=0;i<8;i++){switch(i)//λѡ{case 0: LSC=1;LSB=1;LSA=1;break;case 1: LSC=1;LSB=1;LSA=0;break;case 2: LSC=1;LSB=0;LSA=1;break;case 3: LSC=1;LSB=0;LSA=0;break;case 4: LSC=0;LSB=1;LSA=1;break;case 5: LSC=0;LSB=1;LSA=0;break;case 6: LSC=0;LSB=0;LSA=1;break;case 7: LSC=0;LSB=0;LSA=0;break;}SMG_A_DP_PORT=gsmg_code[i];//传送段选数据delay_10us(100000);SMG_A_DP_PORT=0x00;}
}void main()
{while(1){smg_display();}
}
矩阵按键
按键介绍
按键是一种电子开关,使用时按下开关按钮就可以使开关接通,当松手时,开关断开。
按键管脚两端距离长的表示默认是导通状态,距离短的默认是断开状态,如果按键按下,初始导通状态变为断开,初始断开状态变为导通。
按键消抖
由于机械弹性的作用,按键开关在闭合时不会马上稳定的接通,在断开时也不会一下子断开,因而在闭合和断开的一瞬间均伴随着一连串的抖动。抖动时间的长短由按键的机械特性决定的,一般为 5ms 到 10ms。按键稳定闭合时间的长短则由操作人员的按键动作决定的,一般为零点几秒到数秒。按键抖动会引起按键被误读多次。为确保CPU对按键的一次闭合仅做一次处理,必须进行消抖。
消抖一般分为硬件消抖和软件消抖两种方式。
我们一般采用的是软件消抖,简单来说就是先读取按键的状态,如果得到按键按下之后,延时 10ms,再次读取按键的状态,如果按键还是按下状态,那么说明按键已经按下了,其中延时10ms就是软件消抖处理。
矩阵按键硬件设计
我的开发板上的是44的矩阵按键,模块电路图如下
从图中可以看出,44 矩阵按键引出的8根控制线直接连接到51单片机的P1口上。电路中的P17连接矩阵键盘的第一行,P13连接矩阵键盘的第一列。
矩阵按键实现数码管显示软件设计
#include"reg52.h"typedef unsigned int u16;//对系统默认数据进行重定义
typedef unsigned char u8;#define KEY_MATRIX_PORT P1//使用宏定义矩阵按键控制口#define SMG_A_DP_PORT P0//使用宏定义数码管段码口//共阴极数码管显示0~F的段码数据u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//延时函数
void delay_10us(u16 ten_us)
{while(ten_us--);
}u8 key_matrix_ranks_scan(void)
{u8 key_value=0;KEY_MATRIX_PORT=0xf7;//给第一列赋值为0,其余全为1if(KEY_MATRIX_PORT!=0xf7)//判断第一列按键是否按下{delay_10us(1000);//消抖switch(KEY_MATRIX_PORT)//保存第一列按键按下后的键值{case 0x77: key_value=1;break;case 0xb7: key_value=5;break;case 0xd7: key_value=9;break;case 0xe7: key_value=13;break;}}while(KEY_MATRIX_PORT!=0xf7);//等待按键松开KEY_MATRIX_PORT=0xfb;//给第二列赋值为0,其余全为1if(KEY_MATRIX_PORT!=0xfb)//判断第二列按键是否按下{delay_10us(1000);//消抖switch(KEY_MATRIX_PORT)//保存第二列按键按下后的键值{case 0x7b: key_value=2;break;case 0xbb: key_value=6;break;case 0xdb: key_value=10;break;case 0xeb: key_value=14;break;}}while(KEY_MATRIX_PORT!=0xfb);//等待按键松开KEY_MATRIX_PORT=0xfd;//第三列赋值为0,其余全为1if(KEY_MATRIX_PORT!=0xfd)//判断第三列按键是否按下{delay_10us(1000);//消抖switch(KEY_MATRIX_PORT)//保存第三列按键按下后的键值{case 0x7d: key_value=3;break;case 0xbd: key_value=7;break;case 0xdd: key_value=11;break;case 0xed: key_value=15;break;}}while(KEY_MATRIX_PORT!=0xfd);//等待按键松开KEY_MATRIX_PORT=0xfe;//第四列赋值为0,其余全为1if(KEY_MATRIX_PORT!=0xfe)//判断第四列按键是否按下{delay_10us(1000);//消抖switch(KEY_MATRIX_PORT)//保存第三列按键按下后的键值{case 0x7e: key_value=4;break;case 0xbe: key_value=8;break;case 0xde: key_value=12;break;case 0xee: key_value=16;break;}}while(KEY_MATRIX_PORT!=0xfe);//等待按键松开return key_value;
}void main()
{u8 key=0;while(1){key=key_matrix_ranks_scan();if(key!=0){SMG_A_DP_PORT=gsmg_code[key-1];//得到的按键值减1换算成数组下标对应0~F段码}}
}
总结
实验的核心就是通过行列扫描,然后判断每一列中的按键按下的情况,并返回对应的键值。复习了硬件的知识,玩一玩还阔以~
【51单片机】矩阵按键实现数码管显示相关推荐
- 自学51单片机 - 矩阵按键实验
自学51单片机 - 矩阵按键实验 1.开发板原理图 2.程序 2.1 行列式扫描法 2.2 线翻转扫描法 3.结果 1.开发板原理图 2.程序 2.1 行列式扫描法 /**************** ...
- 4*4矩阵按键控制数码管显示0-F
4*4矩阵按键原理图如下: 根据原理图,汇编程序代码如下: 4*4矩阵按键控制数码管显示0-F.刚学单片机汇编,是根据单片机C语言思路来写的,写的不好,如果发现有错误或会导致程序跑飞的,麻烦帮我指出, ...
- 74hc164驱动数码管c语言程序,基于51单片机的74HC164驱动数码管显示程序与仿真
基于51单片机的74HC164驱动数码管显示程序与仿真 基于51单片机的74HC164驱动一位数码管显示程序与仿真 #include #include #define uchar unsigned c ...
- 51单片机AD转换pcf8591+数码管显示+Proteus仿真二
51单片机AD转换pcf8591+数码管显示+Proteus仿真二
- 基于51单片机的8位数码管显示的可调时电子时钟
基于51单片机的8位数码管显示的可调时电子时钟 本人大二本科生,第一次发东西,功能比较简单,代码有点复杂,希望能有大神指正. 基于51单片机的不可调时间的时钟显示,晶振为11.0592MHZ,60H ...
- 51单片机DS18B20测温数码管显示例程(Proteus仿真+程序)
编号:19 51单片机DS18B20测温数码管显示例程 功能描述: 本设计由STM32单片机+DS18B20温度传感器+四段数码管显示模块组成. 1.主控制器是51单片机 2.DS18B20温度传感器 ...
- 51单片机 | 矩阵按键实验
文章目录 一.矩阵按键介绍 二.硬件设计 三.软件设计 四.实验现象 开发板上板载了一个 4*4 矩阵键盘.本节所要实现的功能是:通过开发板上的矩阵键盘控制静态数码管显示对应的键值 0-F. 一. ...
- 51单片机——矩阵按键逐行扫描短按长按一直按方案1.2
1.删减了<51单片机--独立按键.矩阵按键多种方案1.1>里的一些不怎么用的代码. 2.添加了逐行扫描按键(需要定时器20毫秒配合使用). 3.支持按键短按.长按.一直按,代码里只做了短 ...
- 51单片机独立按键联动数码管LED蜂鸣器
目录: LED工作原理.电路及源码 蜂鸣器工作原理.电路及源码 数码管工作原理.电路及源码 独立按键工作原理.电路及源码 总结 LED原理,电路及源码 LED原理 LED就是发光二级管,有单向导电性, ...
最新文章
- oracle导出脚本文件怎么打开,Windows下的Oracle导出脚本 -电脑资料
- 编程面试题:编写一个会造成数据库死锁的应用
- css 下边框 90%,css怎么设置下边框
- swift VFL - 父视图是scrollview 注意点
- 网站颜色搭配[收藏]
- 《人工智能:一种现代方法(AIMA)》绪论 智能Agent 思维导图
- IDEA格式化HTML页面
- 智能优化算法:基于Powell优化的鸽群优化算法
- vue省市区三级联动-封装集成
- [手机分享]黑莓手机7系列分享之——黑莓7290
- web前端 vue 面试题(一)
- 实用小技巧 利用Python一秒将全部中文名转为拼音
- 免费把你的 GoogleDrive 和 OneDrive 变成图床
- 图解通信原理与案例分析-17:2G GPRS通用分组无线业务详解
- Visual studio 2017中 Javascript对于Xrm对象模型没有智能提示的解决办法
- 20-观察者模式Quarkus实现
- 原生JS写《像素鸟》的小游戏(下落的小鸟)
- 宜信容器云排错工具集
- 开源html5在线音乐网站,一个漂亮的开源HTML5音乐播放器——APlayer
- 关于学习C语言的心得体会吧!