MAX7219 串行8位LED数码管显示驱动芯片 总结

<p>一、小结:</p>
<p>1.对MAX7219的操作实际是对它的寄存器的操作。</p>
<blockquote>
<p>把寄存器的地址和该地址中应该存放的数据发送给MAX7219即可实现对7219的控制。8个数位寄存器用来存放每个数码管要显示的数据,6个控制寄存器用了存放控制命令。每次都应该发送16位的数据。数据格式如下:</p>
<p><a href="http://www.benp366.com/attachments/month_1006/f201061224451.png"><img title="image" border="0" alt="image" width="693" height="84" style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" src="http://www.benp366.com/attachments/month_1006/s201061224455.png" /></a></p>
<p>显然,高字节的第四位为寄存器地址,低字节为寄存器的内容。</p>
</blockquote>
<p>2.数据传输方式。</p>
<blockquote>
<p>单片机与7219之间的通信时通过DIN、LOAD、CLK三个接口实现的</p>
<p><a href="http://www.benp366.com/attachments/month_1006/q201061224523.png"><img title="image" border="0" alt="image" width="710" height="413" style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" src="http://www.benp366.com/attachments/month_1006/d201061224614.png" /></a></p>
<p>16-bit的串行数据包中的每一位(从高位到低位)在每个CLK的上升沿被移入16-bit的内部移位寄存器中,(对于7219而言此过程中LOAD可以为0也可以为1,但对于7221而言CS反必须为0)。接着,在LOAD的上升沿,这些数据被锁存(latched into)到数位寄存器(digit register)或控制寄存器(control register)。LOAD的上升沿必须在这16个CLK上升沿之后出现,并且要在下一个CKL之前,否则数据将会丢失。</p>
<p>寄存器地址表:</p>
<p><a href="http://www.benp366.com/attachments/month_1006/y201061224618.png"><img title="image" border="0" alt="image" width="335" height="393" style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" src="http://www.benp366.com/attachments/month_1006/h201061224629.png" /></a></p>
<div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:8f968b32-08cc-43d4-b49a-62fcfeb726e7" class="wlWriterEditableSmartContent" style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px">奔跑 标签: <a rel="tag" href="http://www.benp366.com/%e5%8d%95%e7%89%87%e6%9c%ba+%e6%95%b0%e7%a0%81%e7%ae%a1+MAX7219">单片机 数码管 MAX7219</a></div>
<p>另外还有考虑译码模式,扫描范围,亮度设置等。我这里使用硬件八位全译码方式。</p>
</blockquote>
<p>3. 程序代码</p>
<blockquote>
<p>/****************************************************/ <br />
/*—————&nbsp;&nbsp; 7219相关的定义&nbsp;&nbsp;&nbsp; ————–*/ <br />
/****************************************************/ <br />
#define DecodeMode 0x09&nbsp;&nbsp;&nbsp;&nbsp; //译码模式 <br />
#define NoOp&nbsp;&nbsp; 0x00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //空操作寄存器 <br />
#define Intensity 0x0a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //亮度 <br />
#define ScanLimit 0x0b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //扫描界限 <br />
#define ShutDown 0x0c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //掉电模式&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
#define DisplayTest 0x0f&nbsp;&nbsp;&nbsp; //显示测试</p>
<p>#define ShutdownMode 0x00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //掉电方式工作 <br />
#define NormalOperation 0x01&nbsp;&nbsp; //正常操作方式 <br />
#define DecodeDigit 0xff&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //硬件译码位数设置:高电平有效:0xff-硬件8位全译码:decode for digits 7-0 <br />
#define IntensityGrade 0x0f&nbsp;&nbsp;&nbsp; //显示亮度级别设置:16级 从0-15 <br />
#define ScanDigit 0x05&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //扫描位数设置:8位全扫描0X07,0x00-仅扫描第一位,现扫描6位 <br />
#define TestMode 0x01&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //显示测试模式:Display Test Mode <br />
#define TextEnd 0x00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //显示测试结束,正常工作:Normal Operation</p>
</blockquote><blockquote>
<p>/***********************************************************************/ <br />
/***************&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MAX7219&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ******************/ <br />
/***********************************************************************/ <br />
//gb 数据的串行送入,把一个字节从高位到低位按位送入7219。 <br />
//gb 7219工作方式:在LOAD状态(LOAD=0)下每个CLOCK的上升沿读入数据;并且在连续16个CLOCK上升沿以后,在数据丢失之前必须产生一个LOAD上升沿,在该上升沿数据会送入数码管和控制寄存器。</p>
<p>/*************第一块7219 的读写子程序***************/</p>
<p>/*———向7219送入一个字节———-*/ <br />
void SendChar1 (unsigned char ch)&nbsp;&nbsp;&nbsp; <br />
{ <br />
&nbsp;&nbsp;&nbsp; unsigned char i; <br />
&nbsp;&nbsp;&nbsp; _nop_(); <br />
&nbsp;&nbsp;&nbsp; for (i=0;i&lt;8;i++) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(ch&amp;0x80)dis_DIN1=1; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else&nbsp;&nbsp;&nbsp;&nbsp; dis_DIN1=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dis_CLK=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //上升沿送出 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dis_CLK=1; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ch=ch&lt;&lt;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
}</p>
<p>/*———-向7219写入操作码和操作数———-*/ <br />
void WriteWord1 (unsigned char addr,unsigned char num)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 前8位是操作码(地址码),后8位是操作数 <br />
&nbsp;&nbsp; { <br />
&nbsp;&nbsp;&nbsp; dis_LOAD1=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //gb 在LOAD=0时允许读入数据 <br />
&nbsp;&nbsp;&nbsp; _nop_(); <br />
&nbsp;&nbsp;&nbsp; SendChar1 (addr); <br />
&nbsp;&nbsp;&nbsp; _nop_(); <br />
&nbsp;&nbsp;&nbsp; SendChar1 (num); <br />
&nbsp;&nbsp;&nbsp; _nop_(); <br />
&nbsp;&nbsp;&nbsp; dis_LOAD1=1;&nbsp; //锁存数据 <br />
&nbsp;&nbsp; }</p>
</blockquote>
<p>======================================================================</p>
<p>参考资料:</p>
<p>1. 内部逻辑结构</p>
<p>它主要由8个数位寄存器和6个控制寄存器组成:</p>
<p>1)数位寄存器7~0:它决定该位LED显示内容。</p>
<p>2)译码方式寄存器:它决定数位寄存器的译码方式,它的每一位对应一个数位。其中,1代表B码方式;0表示不译方式。若用于驱动LED数码管,应将数位寄存器设置为B码方式;当用于驱动条形图显示器时,应设置为不译码方式。</p>
<p>3)扫描位数寄存器:设置显示数据位的个数。该寄存器的D2~D0(低三位)指定要扫描的位数,支持0~7位,各数位均以1.3kHz的扫描频率被分路驱动。</p>
<p>4)亮度控制寄存器:该寄存器通常用于数字控制方式,利用其D3~D0位控制内部脉冲宽度调制DAC的占空比来控制LED段电流的平均值,实现LED的亮度控制。D3~D0取值可从0000~1111,对应电流占空比则从1/32变化到31/32,共16级,D3~D0的值越大,LED显示越亮。而亮度控制寄存器中的其他各位未使用,可置任意值。</p>
<p>5)显示测试寄存器:它用来检测外挂LED数码管各段的好坏。当D0置为1时,LED处于显示测试状态,所有8位LED的段被扫描点亮,电流占空比为31/32;若D0为0,则处于正常工作状态。D7~D1位未使用,可任意取值。</p>
<p>6)关断寄存器:用于关断所有显示器。当D0为0时,关断所有显示器,但不会消除各寄存器中保持的数据;当D0设置为1时,正常工作。剩下各位未使用,可取任意值。</p>
<p>7)无操作寄存器:它主要用于多MAX7219级联,允许数据通过而不对当前MAX7219产生影响。</p>
<p>2. 引脚说明</p>
<p>MAX7219是共阴极LED显示驱动器,采用24脚DIP和SO两种封装,其引脚排列见图1。其功能说明如下。</p>
<p>1)DIN:串行数据输入端。在CLK的上升沿,数据被装入到内部的16位移位寄存器中。</p>
<p>2)DIG7~DIG0:8位数值驱动线。输出位选信号,从每位LED显示器公共阴极吸入电流。</p>
<p>3)GND:接地端。</p>
<p>4)LOAD:装载数据控制端。在LOAD的上升沿,最后送入的16位串行数据被锁存到数据或控制寄存器中。</p>
<p>5)DOUT:串行数据输出端。进入DIN的数据在16.5个时钟后送到DOUT端,以便在级联时传送到下一片MAX7219。</p>
<p>6)SEG A~SEG G:LED七段显示器段驱动端。</p>
<p>7)SEG H:小数点驱动端。</p>
<p>8)Vcc:+5V电源端。</p>
<p>9)Iset:LED段峰值电流提供端。它通过一只电阻与电源相连,以便给LED段提供峰值电流。</p>
<p>10)CLK:串行时钟输入端。最高输入频率为10MHz,在CLK的上升沿,数据被移入内部移位寄存器;在CLK的下降沿,数据被移至DOUT端。</p>

分享到: 更多
版权申明:

本站保留所有原创文章的版权,本站地址:奔跑的博客[http://www.elecbench.com]

原创文章转载时请注明出处,并添加文章所在页面的链接:http://www.elecbench.com/171/

本站所有 2010年3月4日 以后发表、未标明为“转载”的文章均是本站原创。

发表评论


(设置自己的个性头像)

*

申请属于你的免费顶级域名