AVR事无巨细系列八,数码管闪亮
事无巨细,AVR学习系列 BBS.CEAPRK.COM 发布
作者:LOSINGAMONG 数码管闪亮 E-mail:Losingamong@qq.com
事无巨细,数码管闪亮
仍然是深夜,仍然精力充沛,遂来写写数码管的显示。篇幅也许会很长,各位看客最
好端杯茶慢慢消遣。
言归正传,我们先看看什么是数码管(图片来自网络):
上图就是各种长相各种样子...
事无巨细,AVR学习系列 BBS.CEAPRK.COM 发布
作者:LOSINGAMONG 数码管闪亮 E-mail:Losingamong@qq.com
事无巨细,数码管闪亮
仍然是深夜,仍然精力充沛,遂来写写数码管的显示。篇幅也许会很长,各位看客最
好端杯茶慢慢消遣。
言归正传,我们先看看什么是数码管(图片来自网络):
上图就是各种长相各种样子的数码管了,肯定很眼熟了吧。
简单讲讲它的构造:一般数码管都称为“X 位 X 段数码管”:比如一位八段数码管、两
位八段数码管、四位八段数码管等。“位”即是指这排数码管共有几位(即有几个“8.”),
“段”则是指每一位数码管由几段组成,很容易数出来,是八段(小数点也算一段)如上图
左下则是一位八段数码管,而最上边的就是四位八段数码管了。应该很容易理解。而这些“段”,
其实是一个个长条形状的发光二极管(LED),所以数码管点亮的时候,本质上就是这八个发
光二极管的某几个在被点亮,就组成了我们需要的字符。
我们来看看它的工作原理,如下图(来自 google,鄙视百度充满广告的搜索结果)
Bb
s
.
Ce
p
a
r
k.
co
m
事无巨细,AVR学习系列 BBS.CEAPRK.COM 发布
作者:LOSINGAMONG 数码管闪亮 E-mail:Losingamong@qq.com
上图展出了常用的两种数码管的引脚排列和内部结构。总所周知,点亮发光二极管就是
要给予它足够大的正向压降。所以点亮数码管其实也就是给它内部相应的发光二极管正向压
降。如上图左(一共 a、b、c、d、e、f、g、DP 八段),如果要显示“1”则要点亮 b、c 两
段 LED;显示“A”则点亮 a、b、c、e、f、g 这六段 LED;我们还知道,既然 LED 加载的是
正向压降,它的两端电压必然会有高低之分:如果八段 LED电压高的一端为公共端,我们称
之为共阳极数码管(如上图中);如果八段 LED 电压低的一段为公共端,则称之为共阴极数
码管(上图右)。所以,要点亮共阳极数码管,则要在公共端给予高于非公共端的电平;反
之点亮共阴极数码管,则要在非公共端给予较高电平。
一般共阳极数码管更为常用,为什么呢?这是因为数码管的非公共端往往接在 IC 芯片
的 IO上,而 IC芯片的驱动能力往往是比较小的,如果采用共阴极数码管,它的驱动端在非
公共端,就有可能受限于 IC 芯片输出电流不够而显示昏暗(比如 51 单片机),要外加上拉
电阻或者是三极管加大驱动能力。所以使用共阳数码管的好处是:将驱动数码管的工作交到
公共端(一般接驱动电源),加大驱动电源的功率自然要比加大 IC 芯片 IO 口的驱动电流简
单许多。另一方面,这样也能减轻 MCU的负担。
现在来看我们 CEPARK板子上用来驱动数码管的一种芯片:74HC595。
先了解两个简单的概念,我尽量用易懂的白话阐述:
串行口:既传输数据只用两个 IO,输出 IO和输入 IO,通过时钟的配合一次只做一位数
据的传输,比如传输一个字符类型的八位数据,就要八次时钟配合八次传输。
并行口:相比于串行口,并行口一次可以传输多位数据(8位、16 位甚至 32位),但是
要占用大量 IO 口(也是 8 个、16 个、或者 32 个 IO),原理与串行口类似:数据在数个 IO
上有效后,一次时钟配合传输这数位数据。
明显,串行口节省 IO,但是传输速度慢。并行口速度快,但是占用大量 IO。那到底哪
种更被广泛使用呢?对,串行口。传输速度取决于 CPU 的主频,传输位数取决于 IO 口的个
数。相比于主频来说,MCU的 IO要宝贵的多,当今时代,CPU的主频符合摩尔定理增长定理:
即每十八个月就可以大幅增长。但是因为制造技术的限制,IO 数就远远没有这么快的增长
了。
现在来看 74HC595,双列直插封装(DIP),是一种移位寄存器内部带有移位存储器和数
据存储器,数据存储器的数据直接展现在它的输出 IO 上。它最主要的功能,就是将串行数
据输出转变为并行数据输出,达到一种扩展 IO的功能。见下图(来自官方 PDF):
Bb
s
.
Ce
p
a
r
k.
co
m
事无巨细,AVR学习系列 BBS.CEAPRK.COM 发布
作者:LOSINGAMONG 数码管闪亮 E-mail:Losingamong@qq.com
上图展示了 74HC595的管脚,其中
14脚,串行数据输入脚
1~7,15脚刚好是八位的并行输出口
13脚,输出使能端,高电平有效,即该引脚给予高电平是,74HC595 才能输出数据
12 脚,存储时钟,在每个上升沿,将移位寄存器的数据存储至存储寄存器,即将
74HC595 的数据刷新输出。
11脚,移位时钟,也是在每个上升沿,将 14脚即串行数据输入脚的数据移至移位寄存
器。注意首先写入数据的最高位。
9脚,串行输出脚,注意该脚的数据是从移位寄存器的最高位移过来的。一般用于两级
74HC595的级联,CEPARK AVR的板子便是如此。
现在阐述一下 74HC595的工作过程:通过移位时钟的配合,将串行输入口的数据逐位移
进移位寄存器。移位完成之后,通过存储时钟将移位寄存器的数据移至存储寄存器,此时输
出 IO 对外显示相应电平。特别说明 9 脚(SQH),该脚的数据是从 7 脚(QH)移上来的,即
进行八次移位后,数据在第九次移位第一次来到 9 脚。理解这点,才能理解 CEPARK AVR 的
工作原理。
好,现在我们可以看看 CEPARK AVR的数码管显示模块的原理图:
Bb
s
.
Ce
p
a
r
k.
co
m
事无巨细,AVR学习系列 BBS.CEAPRK.COM 发布
作者:LOSINGAMONG 数码管闪亮 E-mail:Losingamong@qq.com
很明显,论坛的板子用的是四位八段共阳极数码管。其中 9~12 脚分别为四位数码管各
自的公共端,要点亮某一位,就要给 9~12这四个脚的某一位高电平(共阳),1~8脚给相应
的低电平。图中的电阻为 470欧限流电阻,计算方法请参看《事无巨细,流水灯简入》一文。
下面是两片 74HC595级联,其中比较关键的几点:
1.注意看他们的 11脚和 12脚共用了 AVR单片机的 PB7和 PB4,即共用了移位时钟和存储
时钟,表示他们对数据的操作是同时进行的。
2.两片 74HC595的 9脚相连,表示要将上级 74HC595的串行数据再以串行的方式传输到下
级。但是不是直接传输,而是通过上级 74HC595 的移位寄存器。即如果要将数据写至下级
74HC595,则必须先把数据依次移到上级的 9脚,再配合时钟一位一位写入。(上级和下级以
数据流先后为准,此原理图数据先到达左边的 74HC595,遂其为上级)
这个显示模块的工作原理并不复杂,上级 74HC595提供段选信号,下级 74HC595提供位
Bb
s
.
Ce
p
a
r
k.
co
m
事无巨细,AVR学习系列 BBS.CEAPRK.COM 发布
作者:LOSINGAMONG 数码管闪亮 E-mail:Losingamong@qq.com
选信号。首先配合移位时钟先将八位位选信号(注意,一定是位选信号,因为先写入的数据
最终会存储在下级 74HC595 中!!!)写入上级 74HC595,然后通过 16 次移位将其移植下级
74HC595;再将八位段选信号写入上级 74HC595。完成之后给存储时钟上升沿,一次刷新两
级 74HC595的 IO电平状态。数码管即显示相应信息了。
这样的设计方法,会给程序的编写带来难度,电路连线更复杂,稍带电路成本增加。
但其好处足以掩盖上述缺点:
1.只用 3个 MUC的 IO就可以驱动 8位数码管,极大节省了 IO。(本应占用 16个 IO)
2.两级 74HC595 级联,时钟线共用使得段选和位选信号同时得到刷新,避免了因为分
步刷新而引起的数码管短暂乱码的现象。(这个读者要细细体会,我接触过的大部分的板子
是做不到这点的)
PS:在此多说一句,评判一个电子产品,质量,工作稳定性和成本,永远都是三个最重
要的要素,特别的这是个追求高效率,对价格敏感的时代。所以孰重孰轻,笔者相信读者经
过权衡,心中自然明了。
现在来看这次实验的源程序,功能是在八位数码管上从左到右依次显示“12345678”
八个数字。
#include
#include
#define uint unsigned int
#define uchar unsigned char
unsigned char const LedData[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //数码管端选数组,静态
unsigned char const LedPos[]=
{0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //数码管位选数组,静态
uchar n,m=0xfe;
void HC595send(uchar x);
Bb
s
.
Ce
p
a
r
k.
co
m
事无巨细,AVR学习系列 BBS.CEAPRK.COM 发布
作者:LOSINGAMONG 数码管闪亮 E-mail:Losingamong@qq.com
void init(void);
void HC595shift(void);
void HC595store(void);
void display(uchar pos,uchar dat); //以上为各个函数声明,
详细功
见下
int main(void)
{
init();
while(1)
{
for(n=1;n<9;n++) //循环显示,八次
{
display(n-1,n); //显示函数调用
HC595store();
}
}
}
void init(void) //IO 初始化函数
{
DDRB=0xff;//B 口全部输出
PORTB=0x00;//B 口全部低电平
}
void HC595send(uchar x) //HC595 字节写入函数
{
uchar n,temp;
for(n=0;n<8;n++)
{
Bb
s
.
Ce
p
a
r
k.
co
m
事无巨细,AVR学习系列 BBS.CEAPRK.COM 发布
作者:LOSINGAMONG 数码管闪亮 E-mail:Losingamong@qq.com
temp=x&0x80;
if(temp!=0)
{
PORTB|=(1<总结如下:
某位置 1:PORTX|=(1<
本文档为【AVR事无巨细系列八,数码管闪亮】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。