51单片机数码管滚动显示学号_单片机第二课——动态数码管的显示

一,LED数码管显示的原理

数码管的发光原理实际是七段LED灯(不包括小数点)或者八段LED灯被点亮的结果。八段依次是 a,b,c,d,e,f,g,dp(表示点)。LED数码管是常见的显示器件,在很多场合都可以看到,比如,闹钟的显示,家电的显示功能,车站等等。我们看到的数码管为“8”字形,数码管又分为共阴极和共阳极两种。

1.共阴极:就是将八段数码管的阴极(负极)接地在一起,需要高电平点亮。如下图所示

74f20b99e983013388567ea9ac6eb565.png
6c6c32cb605996aaa3fda36999fc4aa4.png

2.共阳极:就是将八段数码管的阳极(正极)接(+5v)在一起,需要低电平点亮。如下图所示

37b5e6a2554005dcc9dfe94887b4fe3e.png

3.数码管的具体显示

①共阴数码管的点亮

为使数码管的不同段显示不同的字符,需要点亮和熄灭不同段的LED灯,才可以实现。对于共阴极数码管来说,只需要给高电平LED灯就会被点亮,对应的断码就会亮起。给低电平相应的断码就会熄灭。

以显示“0”为例 只需要给“dp”和“g”给低电平熄灭就可以了

断码的顺序为:dp g f e d c b a

082aa4fbcb0236cea11460147954459a.png
6183ec2d8ee6d7ae224eafee9758acda.png

“0”断码用16进制表示为:3FH

其他字符的断码以此类推:如下表所示

cbe9aa1e1ee62f18b1f3c64448db854f.png

②共阳数码管的点亮

为使数码管的不同段显示不同的字符,需要点亮和熄灭不同段的LED灯,才可以实现。对于共阳极数码管来说,只需要给低电平LED灯就会被点亮,对应的断码就会亮起。给高电平相应的断码就会熄灭。

以显示“0”为例 只需要给“dp”和“g”给高电平熄灭就可以了

断码的顺序为:dp g f e d c b a

1 1 0 0 0 0 0 0

d64554dcf349ad7b57c0b60c0d91f674.png
7f6c8e50c40de09b9226f7ea9c7e9b49.png

“0”断码用16进制表示为:C0H

其他字符的断码以此类推:如下表所示

2ea846479d64340e9604408bfc919410.png

二.动态数码管的显示(共阴)

  1. 思路: 建立显存、断码、位码表格,将软件延时部分设计成子函数的结构,在主函数中利用查表的方法来获得相应的位码和段码,这种思路经常用于显示变化的字符。
  2. 显示的状态(左移动态显示,类似于常见的广告牌)
be25d680fbb45f7e55c22d18d9f3f343.png

3.原理图(protues仿真图)

9c1db2fe16b7d5f1a6fc1d13ca23074e.png

4.设计方法

在多个数码管的显示中点亮数码管需要 位码段码共同作用才能点亮

位码(低电平有效):表示要点亮的数码管的位置。

断码(上面讲过了):就是要点亮哪一段数码管

举例说明:

6fbaffdec72ad4c9597963bb08e9fce1.png

如果要在上面的六个数码管中点亮第一个数码管,且让它显示“1”,首先确定它的位置是第六个。用八个二进制表示,最低位从0开始,最高位为7 那么它的位码为:11111110 (低电平有效)

断码为0x06

其他的以此类推

先要数码管动态显示要建一个数组。下图为断码

98c028693127ddc2eb32f7022befd3e3.png

源代码:

#include#include#define uchar unsigned char#define uint unsigned intsbit duan=P2^6; sbit wei=P2^7; uchar code tab[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f, 0x6f,0x77,0x7c,0x39,0x5e,0x79,0x00,0x40}; //共阴极数码管段码表uchar idata dis_buf[6]={17,17,17,17,17,17}; //显示缓冲区数据(十进制)void delayms(uint i) //延时1ms函数{ uint j; for(;i>0;i--) for(j=120;j>0;j--) {;}}void main() //主函数{ uchar k,m,n,bitcode,segcode; while(1) { for(n=0;n<17;n++) { dis_buf[0]=dis_buf[1]; //数据移动 dis_buf[1]=dis_buf[2]; dis_buf[2]=dis_buf[3]; dis_buf[3]=dis_buf[4]; dis_buf[4]=dis_buf[5]; dis_buf[5]=n; for(m=0;m<100;m++) //100次扫描,大约600ms { bitcode=0xfe; //起始位码 for(k=0;k<6;k++) { P0=0xff; //消影 wei=1; wei=0; segcode=dis_buf[k]; //取数据 P0=tab[segcode]; //送段码 duan=1; duan=0; P0=bitcode; //送位码 wei=1; wei=0; delayms(1); bitcode=_crol_(bitcode,1); //更新位码,准备显示下一位 } } } }}

关注我获得更多干货哦!记得转发和收藏让更多想要学的伙伴看到!!!!

有问题,可以在评论区打出来哦!!!

  • 10
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值