当我们用单片机或者其他的控制器点亮数码管或者数码点阵的时候,总是感觉引脚不够用。因为需要占用大量IO口,比如,我们为了驱动4位数码管一共需要使用12个IO口。如果需要驱动8位数码管则至少需要16个IO口。很明显,这样做不经济。除此之外,系统资源占用过多也是个大问题。为了实现数码管的动态扫描显示,需要不停地高速操作IO口,这对单任务的单片机比如51单片机来说问题并不太大,因为单任务的单片机的执行时序是由晶振来决定的,动态扫描的时间间隔可以控制地非常精确,数码管的显示会很稳定,不会出现闪烁的现象。但对于运行着多任务的Linux操作系统的树莓派来说,对IO口的大量反复操作以及大量使用sleep语句会导致CPU占用过多,最后导致动态扫描的间隔时间不均匀,体现为数码管显示不稳定,有明显闪烁的现象。使用GPIO直接驱动数码管时,上面这两个问题是不可避免的。想解决这两个问题,我们需要借助外部芯片的帮助。
接下来我将用几个篇幅来介绍如何使用显示驱动芯片74HC595来驱动数码管的方法。同时我们也可以学习到串行数据传输的方法以及一些数字芯片通用的一些概念,比如时钟引脚,上升沿,锁存,移位寄存等。理解了这些通用的概念对学习使用其他芯片是很有帮助的。
74HC595是具有8位移位寄存器和一个存储器,三态输出功能。移位寄存器和存储器是分别的时钟。数据在SHCP的上升沿输入,在STCP的上升沿进入到存储寄存器中去。如果两个时钟连在一起,则移位寄存器总是比存储寄存器早一个脉冲。移位寄存器有一个串行移位输入(DS),和一个串行输出(Q7’),和一个异步的低电平复位(MR),存储寄存器有一个并行8位的,具备三态的总线输出,当使能OE时(为低电平),存储寄存器的数据输出到总线。
74595的数据端:
QA--QH: 八位并行输出端,可以直接控制数码管的8个段。
QH': 级联输出端。将它接下一个595的SI端。
SI: 串行数据输入端。
74595的控制端说明:
595具体使用的步骤:
第一步:目的:将要准备输入的位数据移入74HC595数据输入端上。
方法:送位数据到_595。
第二步:目的:将位数据逐位移入74HC595,即数据串入
方法:SCK_595产生一上升沿,将PSI_595上的数据移入74HC595中.从低到高
第三步:目的:并行输出数据。即数据并出
方法:P1.1产生一上升沿,将由SI_595上已移入数据寄存器中的数据
送入到输出锁存器。
说明: 从上可分析:从SCK_595产生一上升沿(移入数据)和RCK_595产生一上升沿(输出数据)是二个独立过程,实际应用时互不干扰。即可输出数据的 同时移入数据。看下整个过程的演示动画,或许你就能更加清楚了。
程序如下,复制就能用。
1 sbit SI_595=P2^0;
2 sbit RCK_595=P2^2;
3 sbit SCK_595=P2^1
;
4 void HC595SendData(unsigned char SendVal)//发送数据
5 {
6 unsigned char i;
7 for (i=0; i<8; i++)
8 {
9 if ((SendVal<
10 else SI_595=0;
11 SCK_595=0;//从SCK_595产生一上升沿(移入数据)
12 _nop_();
13 _nop_();
14 SCK_595=1;
15 }
16 }
17 void HC595ShowData()//RCK_595产生一上升沿(输出数据)
18 {
19 RCK_595=0;
20 _nop_();
21 _nop_();
22 RCK_595=1;
23 }
24