cpubbs 发表于 2006-1-1 10:51:24

[转帖]MAX7219用法

MAX7219用法

/******************************************************************************
MAX7219:

1.数据定义:
    | D15 D14 D13 D12 | D11 D10 D09 D08 | D07 D06 D05 D04 D03 D02 D01 D00 |
       *   *   *   *      [地址]                   [数据]

2. 时序图:
         CP0      CP1       ...      ...      CP14       CP15
         ____   ____      ____      ____      ____      ____   
CLK:____|    |____|    |____|    |____|    |____|    |____|    |_________

          D15      D14      .....   .....   D01      D00
DIN:__=======____=======___=======___=======___=======___======__________
   
   ____                                                          __________
LOAD: |__________________________________________________________|

3. 寄存器地址定义:
    寄存器:                地址:      16进制   
   REGISTER       D15-D12   D11D10D09D08      HEX
   NO-OP 非操作         * * * *   0    0    0    0       0x0
   DIGIT0 数码管0       * * * *   0    0    0    1       0x1
   DIGIT1 数码管1       * * * *   0    0    1    0       0x2
   DIGIT2 数码管2       * * * *   0    0    1    1       0x3
   DIGIT3 数码管3       * * * *   0    1    0    0       0x4
   DIGIT4 数码管4       * * * *   0    1    0    1       0x5
   DIGIT5 数码管5       * * * *   0    1    1    0       0x6
   DIGIT6 数码管6       * * * *   0    1    1    1       0x7
   DIGIT7 数码管7       * * * *   1    0    0    0       0x8
   译码方式      * * * *   1    0    0    1       0x9
   亮度控制             * * * *   1    0    1    0       0xA
   扫描范围             * * * *   1    0    1    1       0xB
   停机方式             * * * *   1    1    0    0       0xC
   显示测试             * * * *   1    1    0    1       0xD

****************************************************************************/


/* 向 MAX7219 发送命令(16 bit) */
void    sent_LED( uint n )
{
uint   i;
   
    i = (uchar)( n );

    CLK = 0;
    LOAD = 0;
    DIN = 0;

    for ( i=0x8000; i>=0x0001; i=i>>1 )
    {
   if ( ( n & i ) == 0 ) DIN = 0; else DIN = 1;   
   CLK = 1;
   CLK = 0;
    }
    LOAD = 1;   
   
}

/******************************************************************************
初始化 MAX7219
******************************************************************************/
void    csh_MAX7219()
{
    sent_LED( 0x0C01 ); /* 置LED为正常状态 */
    sent_LED( 0x0A04 ); /* 置LED亮度为9/32 */
    sent_LED( 0x0B07 ); /* 置LED扫描范围DIGIT0-7 */
    sent_LED( 0x0900 ); /* 置LED显示为不译码方式 */
}

/******************************************************************************
清除显示:
void    cls()
******************************************************************************/
void    cls()
{
uint    i;
    for (i=0x0100; i<=0x0800; i+=0x0100 ) sent_LED( i ); /* DIGIT0-7 = 0
*/
}

/* 定义显示数字0-9数组 */
uint code LED_code_09={0x7E,0x30,0x6D,0x79,0x33,0x5B,0x5F,0x70,0x7F,0x7B};
/* 定义显示位置L0-L3数组 */
uint code LED_code_L07=
{0x0100,0x0200,0x0300,0x0400,0x0500,0x0600,0x0700,0x0800};
/******************************************************************************
显示数字0-9:
void    disp_09( uchar H, uchar n )
输入:    H 显示位置0-7
    n 显示数值0-9
    DP 显示小数点 1xxxxxxx :ON/0xxxxxxx:OFF
******************************************************************************/
void    disp_09( uchar H, uchar n )
{
    if ( ( n & 0x80 ) == 0 )
    {
    sent_LED( LED_code_L07[ H ] | LED_code_09[ n ] );
    }
    else
    {
    sent_LED( LED_code_L07[ H ] | LED_code_09[ n & 0x7F ] | 0x80 );
    }
}

cpubbs 发表于 2006-1-1 10:54:56

<P>再发另外一个转载的程序:</P>
<P>#include "led_ascii.h"<BR><BR>#define no_op 0x00<BR>#define digit0 0x01<BR>#define digit1 0x02<BR>#define digit2 0x03<BR>#define digit3 0x04<BR>#define digit4 0x05<BR>#define digit5 0x06<BR>#define digit6 0x07<BR>#define digit7 0x08<BR>#define decodemode 0x09<BR>#define intensity 0x0a<BR>#define scanlimit 0x0b<BR>#define shutdown 0x0c<BR>#define displaytest 0x0f   <BR>sfr p3=0xb0;<BR>sbit din=p3^7;<BR>sbit load=p3^6;<BR>sbit clk=p3^5;<BR>//uc code led[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};<BR>//ASCII字符显示数据;<BR><BR>extern void delay100ms(void);<BR><BR>//uc p={0x00};<BR>/*void delay(void)<BR>{<BR>    uc i;<BR>    ui j;<BR>    j=1500;<BR>    while(j--)<BR>    {<BR>      for(i=0;i&lt;125;i++)<BR>      {;}<BR>    }<BR>}<BR>*/<BR>/*---------------------------------------<BR>向MAX7219发送一个字节;<BR>---------------------------------------*/<BR>void shift8(uc d)<BR>{<BR>    uc i,j;<BR>    j=0x80;<BR>    load=0;<BR>    for(i=0;i&lt;8;i++)<BR>    {<BR>      clk=0;<BR>      if((d&amp;j)!=0)<BR>      din=1;<BR>      else<BR>      din=0;                <BR>      clk=1;<BR>      j&gt;&gt;=1;<BR>    }<BR>}<BR>/*---------------------------------------<BR>向MAX7219发送一个显示数据d,显示在addr行/列;<BR>---------------------------------------*/<BR>void load16(uc addr,uc d)<BR>{<BR>   <BR>    shift8(addr);<BR>    shift8(d);<BR>    clk=0;<BR>    load=1;<BR>}<BR>/*---------------------------------------<BR>向MAX7219发送8个字节;即一屏数据;<BR>---------------------------------------*/<BR>void disp_MAX7219(uc idata *p)<BR>{<BR>    uc idata i;<BR>    for(i=digit0;i&lt;0x09;i++)<BR>    {<BR>      load16(i,*p++);<BR>    }<BR>}<BR>/*---------------------------------------<BR>向MAX7219发送8个字节,以显示一个ASCII码;<BR>---------------------------------------*/<BR>void disp_MAX7219_ascii(uc code *p)<BR>{<BR>    uc idata i;<BR>    for(i=digit0;i&lt;0x09;i++)<BR>    {<BR>      load16(i,*p++);<BR>    }<BR>}<BR>/*---------------------------------------<BR>显示ASCII字符<BR>---------------------------------------*/<BR><BR>Disp_ascii(uc ch)<BR>{<BR>    ui i;<BR>    i=ch;<BR>    i-=0x20;<BR>    i*=8;<BR>    disp_MAX7219_ascii(&amp;led);<BR>}<BR>/*---------------------------------------<BR>清屏<BR>---------------------------------------*/<BR><BR>void clear(void)<BR>{<BR>    uc i,j;<BR>    j=0x01;<BR>    for(i=0;i&lt;8;i++,j++)<BR>    load16(j,0x00);<BR>}    <BR>/*---------------------------------------<BR>初始化MAX7219,并清屏<BR>---------------------------------------*/<BR><BR>void Init_MAX7219(void)<BR>{<BR>    load16(decodemode,0x00);    //设置无解码方式<BR>    load16(intensity,0x09);      //设置亮度为10/16<BR>    load16(scanlimit,0x07);      //8段全扫描<BR>    load16(shutdown,0x01);      //设置开寄存器<BR>    load16(displaytest,0x01);<BR>    delay100ms();<BR>    delay100ms();<BR>    load16(displaytest,0x00);<BR>    clear();<BR>}<BR><BR>/*---------------------------------------<BR>演示程序;全屏显示后,一点一点的依次显示;一直循环下去<BR>---------------------------------------*/<BR><BR>/*<BR>void main(void)<BR>{<BR>    uc i,j,k;<BR>    ini();<BR>    while(1)<BR>    {<BR>      for(j=digit0,k=0;j&lt;decodemode;j++,k++)<BR>      {      <BR>            for(i=0;i&lt;8;i++)<BR>            {<BR>                p=led|p;<BR>                load16(j,p);<BR>                delay();<BR>            }<BR>      }<BR>      clear();<BR>      for(i=0;i&lt;8;i++)<BR>      p=0;<BR>    }<BR>}<BR>*/ <BR></P>

cpubbs 发表于 2006-1-1 10:57:00

<P>使用方法三:</P>
<P>专用数码管显示电路(MAX7219)</P>
<P>  常用的专用数码管显示电路有8279和MAX7219,前者因近年来停产而很少人使用;后者因使用方便灵活,连线简单,不占用数据存储器空间,使用的人则越来越多。<BR>  MAX7219是八位串行共阴LED数码管动态扫描驱动电路,其峰值段电流可达40mA,最高串行扫描速率为10MHz,典型扫描速率为1300Hz,仅使用单片机3个I/O口,即可完成对八位LED数码管的显示控制和驱动, 线路非常简单,控制方便,外围电路仅需一个电阻设定峰值段电流,同时可以通过软件设定其显示亮度;还可以通过级联,完成对多于八位的数码管的控制显示。值得一提的是,当工作于关闭(SHUTDOWN)方式时,不仅单片机仍可对其传送数据和修改控制方式,而且芯片耗电仅为150uA。下图是MAX7219的典型连接方法:</P>
<P>http://www.ldled.com/ledjs/ci5.gif</P>
<P>下面是MAX7219的C51源程序:</P>
<P> #include &lt;reg52.h&gt;<BR> #include &lt;stdio.h&gt;<BR> typedef unsigned char uchar;<BR> sbit DIN=P1^0;<BR> sbit CLK=P1^1;<BR> sbit LOAD=P1^2;<BR> <BR> void send(uchar add,uchar dat) //发送16字节子函数<BR> { uchar ADS,i,j;<BR> LOAD=0;<BR> i=0;<BR> while(i&lt;16)<BR> {<BR>   if(i&lt;8)<BR>    {ADS=add;}<BR>   else {ADS=dat;}<BR>     for(j=8;j&gt;=1;j--)<BR>     { <BR><BR>      DIN=ADS&amp;0x80;<BR>      ADS=ADS&lt;&lt;1;<BR>      CLK=1;<BR>      CLK=0;<BR>     }<BR>    i=i+8;<BR>   }<BR>  LOAD=1;<BR> }</P>
<P> main()<BR> { <BR>  send(0x0c,0x01);   //初始化MAX7219<BR>  send(0x0b,0x07);<BR>  send(0x0a,0xf5);<BR>  send(0x09,0xff);<BR>  while(1)<BR>  {<BR>  send(0x01,0x81);   //在八个数码管上显示1-8,带小数点显示<BR>  send(0x02,0x82);<BR>  send(0x03,0x83);<BR>  send(0x04,0x84);<BR>  send(0x05,0x85);<BR>  send(0x06,0x86);<BR>  send(0x07,0x86);<BR>  send(0x08,0x88);<BR>  }<BR> }<BR></P>

algor 发表于 2006-1-22 00:12:03

<P>大家应该好好利用,加一下外围,就可以做个小样品了。楼主辛苦!</P>
页: [1]
查看完整版本: [转帖]MAX7219用法