51单片机数码管显示
创始人
2024-05-15 14:48:42
0

文章目录

  • 前言
  • 一、数码管简介
  • 二、数码管原理图
  • 三、数码管显示原理
  • 四、静态数码管代表编写
  • 五、动态数码管
  • 总结

前言

这篇文章将介绍数码管的显示其中包含了动态数码管和静态数码管两种。

一、数码管简介

数码管其实就是由多个发光二极管封装在一起组成“8”字型的器件当分别点亮这些发光二极管时就可以组成不同的数字显示出来。

二、数码管原理图

下图我们可以知道8个数码管通过了一个74HC245芯片和单片机的P01-P07相连接。
74HC138译码器通过P22-P24输出的相对于的电平选择控制哪个具体的数码管。
在这里插入图片描述
74HC138是一款高速CMOS器件,74HC138引脚兼容低功耗肖特基TTL(LSTTL)系列。74HC138译码器可接受3位二进制加权地址输入(A0, A1和A2),并当使能时,提供8个互斥的低有效输出(Y0至Y7)。
这样我们就可以只通过3个引脚就可以选择控制8个数码管了。
下面是74138译码器的真值表,当P22-P24都输出0时就选择了第一个数码管,P22为1时P23-P24输出0时选择第二个数码管,以此类推。看不懂的同学建议去看看数字电路的知识。
在这里插入图片描述

三、数码管显示原理

一个数码管就是由8个LED组成的想要实现对应的数字或者字母那么就去点亮对应的LED灯即可。
比如想要显示数字0那么就熄灭LED g和LED dp,其他的数码管都分别点亮起来这里就能得到想要显示的数字0。
这样的话我们能得到一个二进制数:0011 1111,这个二进制数就代表了熄灭LED g和LED dp,这里LED灯为高电平点亮。这个二进制数转为16进制数就是0x3f。
当要显示0时将0x3f赋值给P0即可。
P0 = 0x3f(显示数字0)
这个0x3f被称为段码,因为数码管就是由8个LED段组成的。
在这里插入图片描述
这里给出其他数字的段码显示:

//共阴极数码管显示0~F的段码数据
u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

四、静态数码管代表编写

#include //共阴极数码管显示0~F的段码数据
u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void main()
{	P0=gsmg_code[0];//将数组第1个数据赋值给数码管段选口//显示数字0while(1){}		
}

五、动态数码管

动态数码管的原理就是利用了人眼的识别比较弱识别不到数码管的快速变换而达到的。
代码实现:
我们在while1里面不断的去扫描这8个数码管将对应的数据显示到数码管上面,这样我们的人眼就认为数码管可以做到分别显示不同的数值了。

#include //共阴极数码管断码
unsigned char gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//定义数码管位选信号控制脚
//74138的三个输入引脚
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;/*延时函数
单位:ms
x:延时的数值
*/
void delayms(unsigned int x)
{unsigned char i;while(x--){for(i=0;i<113;i++);}
}/*
数码管显示函数
pos:在第几位显示
dat:要显示的数据
*/
void select_display(unsigned char pos, unsigned char dat)
{switch(pos)//位选(选择在第几个位置显示 原理参照74138的真值表){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;}P0 = gsmg_code[dat];delayms(1);//等待数据显示稳定P0 = 0x00;//消影
}void main()
{while(1){select_display(0, 0);select_display(1, 1);select_display(2, 2);select_display(3, 3);select_display(4, 4);select_display(5, 5);select_display(6, 6);select_display(7, 7);}
}

总结

其实数码管就是8个LED灯组成的,只要我们会二进制和16进制的转换那么数码管就是不难的。
这里需要提一点的就是动态数码管需要记得消影处理,不进行消影处理将会导致数码管显示重影。

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
修复 爱普生 EPSON L4... L4151 L4153 L4156 L4158 L4163 L4165 L4166 L4168 L4...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...