[转帖]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 );
}
} <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<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<8;i++)<BR> {<BR> clk=0;<BR> if((d&j)!=0)<BR> din=1;<BR> else<BR> din=0; <BR> clk=1;<BR> j>>=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<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<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(&led);<BR>}<BR>/*---------------------------------------<BR>清屏<BR>---------------------------------------*/<BR><BR>void clear(void)<BR>{<BR> uc i,j;<BR> j=0x01;<BR> for(i=0;i<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<decodemode;j++,k++)<BR> { <BR> for(i=0;i<8;i++)<BR> {<BR> p=led|p;<BR> load16(j,p);<BR> delay();<BR> }<BR> }<BR> clear();<BR> for(i=0;i<8;i++)<BR> p=0;<BR> }<BR>}<BR>*/ <BR></P> <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 <reg52.h><BR> #include <stdio.h><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<16)<BR> {<BR> if(i<8)<BR> {ADS=add;}<BR> else {ADS=dat;}<BR> for(j=8;j>=1;j--)<BR> { <BR><BR> DIN=ADS&0x80;<BR> ADS=ADS<<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> <P>大家应该好好利用,加一下外围,就可以做个小样品了。楼主辛苦!</P>
页:
[1]