×
嵌入式 > 技术百科 > 详情

MAX7219驱动共阴极LED原理图及程序

发布时间:2020-06-18 发布时间:
|

MAX7219是一种串入、并出的共阴极LED数码管显示驱动器,每片可驱动8位LED数码管显示,与单片机的接口只需3根线,内带BCD译码器,及显示测试、移位、锁存器等,输出电流达40mA,外围只需一只亮度调整电阻。


2、引脚功能说明


1)引脚功能


DIN:串行数据输入端,CLK的上升沿时数据被载入内部16位移位寄存器中


CLK:串行时钟输入端,最高工作频率可达10MHz


LOAD:片选端,低电平接收DIN端的数据,高电平时数据被所存


DIG0~7:LED的位控制端A~DP:LED的端控制端


DOUT:串行数据输出端,用于芯片的级联


ISET:硬件亮度调整端,在该引脚与VCC之间跨接一个电阻,LED的亮度即可通过该电阻来调节,流过LED的段驱动平均电流为流过此电阻电流的100倍,此电阻值范围为:10~80K之间。


2)内部寄存器说明


A、译码方式选择寄存器地址:09H


      赋值:FFH 表示使用MAX7219内部的BCD译码器

     00H 表示不使用MAX7219内部的BCD译码器

B、亮度调节寄存器地址:0AH


       赋值:00H~0FH 可改变MAX7219所驱动的LED的亮度,其变化范围在1/32~31/32之间

C、扫描位数设定寄存器地址:0BH


       赋值:00H 所有位不显示

       01H~07H 依次对应于1~8位及前面位全部显示(即需显示的位应为“1”)

D、待机模式开关寄存器地址:0CH


      赋值:00H LED全灭

      01H LED正常显示

E、显示器测试寄存器地址:0FH


       赋值:00H LED为正常显示状态

      01H LED测试状态,即LED全亮


F、8位LED显示数据寄存器地址:01H~08H


对这些寄存器赋值(即需显示的内容),就会在对应的1~8位LED数码管上显示出来

由于电源中杂波或附近的电磁等干扰信号,使MAX7219在上电后不显示或乱显示;为了消除这种现象应在MAX7219的VCC端与地之间接一只104pf的瓷片电容,在LOAD端于地之间接一只10K的电阻。最号还在电源与MAX7219的VCC端之间串一只去高频的电感。


而在电源方面,最好使用变压器供电,而不要用开关电源供电。


加在DIN引脚上的串行数据必须在LOAD脚为低电平时,以每2字节一次,在SCK脚信号的每个上升沿移入1位数据,且高位在前低位在后,然后在LOAD信号的上升沿MAX7219所存数据。


5、C源程序


#include《reg51.h》


sbit CLK=P1^7; //MAX7219时钟信号线


sbit LD=P1^6; //数据加载线


sbit DIN=P1^5; //数据输入线


unsigned char code disp_table[]={0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b,


0x77,0x1f,0x4e,0x3d,0x01,0x00}; //非译码方式时的共阴数码管显示编码,0~9,E,o,r,d,-,息灭


void w_max7219(unsigned char addr,unsigned char wdata); //向MAX7219写数据函数声明


void init_max7219(); //MAX7219初始化函数声明


void TImer_ms(unsigned char TIm); //毫秒级延时函数声明


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


函数名称:main


函数说明:主函数


入口参数:


出口参数:


其 它:


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


main()


{


init_max7219(); //MAX7219初始化函数


w_max7219(0x01,disp_table[1]); //向MAX7219第一位寄存器写显示数据1


w_max7219(0x02,disp_table[2]); //向MAX7219第二位寄存器写显示数据2


w_max7219(0x03,disp_table[3]); //向MAX7219第三位寄存器写显示数据3


w_max7219(0x04,disp_table[4]); //向MAX7219第四位寄存器写显示数据4


w_max7219(0x05,disp_table[5]); //向MAX7219第五位寄存器写显示数据5


w_max7219(0x06,disp_table[6]); //向MAX7219第六位寄存器写显示数据6


w_max7219(0x07,disp_table[7]); //向MAX7219第七位寄存器写显示数据7


w_max7219(0x08,disp_table[8]); //向MAX7219第八位寄存器写显示数据8


while(1);


}


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


函数名称:init_max7219


函数功能:MAX7219初始化


入口参数:


出口参数:


其 它:


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


void init_max7219()


{


w_max7219(0x0a,0x07); //显示亮度,取值范围0~f


w_max7219(0x0b,0x07); //8位扫描显示,取值范围0x01~0x07


w_max7219(0x09,0x00); //译码方式,0x00为不译码,0xff为译码


w_max7219(0x0c,0x01); //操作方式,0x00为低功耗模式,0x01为正常操作模式


w_max7219(0x0f,0x00); //显示状态,0x00为正常显示,0x01为显示测试


TImer_ms(2);


}


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


函数名称:w_max7219


函数功能:向MAX7219写入数据


入口参数:addr MAX7219内部寄存器地址,wdata 写入内部寄存器的操作数值


出口参数:


其 它:


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


void w_max7219(unsigned char addr,unsigned char wdata)


{


unsigned char temp,i=1,j,k;


LD=0;


while(i《16)


{


if(i《8) temp=addr; //先写入MAX7219内部寄存器地址,再向内部寄存器写入操作数值

else temp=wdata;


for(j=0;j《8;j++)


{


CLK=0;


if((temp&0x80)==0x80) DIN=1; //先发送数据的最高位


else DIN=0;


for(k=5;k》0;k--); //时钟频率高的单片机需曾加延时时间,此处为12MHz


CLK=1;


for(k=5;k》0;k--);


temp《《=1;


}


i+=8;


}


LD=1;


}


/*-------------------------------------------------------------------------------------------


函数名称: TImer_ms


函数说明: 1ms延时子程序


入口参数: tim为接收主调传来需延时的毫秒数,取值范围1~256,定时时间1~256ms


出口参数:


其 它:


------------------------------------------------------------------------------------------*/


void timer_ms(unsigned char tim)


{


unsigned char i;


while(tim--)


{


for(i=0;i《200;i++); //延时1ms


}


}





『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
Semtech的LoRa技术携手Chipsafer将牧场连接至云端