MAX7219驅(qū)動共陰極LED原理圖及程序
1、MAX7219簡介
MAX7219是一種串入、并出的共陰極LED數(shù)碼管顯示驅(qū)動器,每片可驅(qū)動8位LED數(shù)碼管顯示,與單片機的接口只需3根線,內(nèi)帶BCD譯碼器,及顯示測試、移位、鎖存器等,輸出電流達40mA,外圍只需一只亮度調(diào)整電阻。
MAX7219引腳圖
2、引腳功能說明
1)引腳功能
DIN:串行數(shù)據(jù)輸入端,CLK的上升沿時數(shù)據(jù)被載入內(nèi)部16位移位寄存器中
CLK:串行時鐘輸入端,最高工作頻率可達10MHz
LOAD:片選端,低電平接收DIN端的數(shù)據(jù),高電平時數(shù)據(jù)被所存
DIG0~7:LED的位控制端A~DP:LED的端控制端
DOUT:串行數(shù)據(jù)輸出端,用于芯片的級聯(lián)
ISET:硬件亮度調(diào)整端,在該引腳與VCC之間跨接一個電阻,LED的亮度即可通過該電阻來調(diào)節(jié),流過LED的段驅(qū)動平均電流為流過此電阻電流的100倍,此電阻值范圍為:10~80K之間。
2)內(nèi)部寄存器說明
A、譯碼方式選擇寄存器地址:09H
賦值:FFH 表示使用MAX7219內(nèi)部的BCD譯碼器
00H 表示不使用MAX7219內(nèi)部的BCD譯碼器
B、亮度調(diào)節(jié)寄存器地址:0AH
賦值:00H~0FH 可改變MAX7219所驅(qū)動的LED的亮度,其變化范圍在1/32~31/32之間
C、掃描位數(shù)設(shè)定寄存器地址:0BH
賦值:00H 所有位不顯示
01H~07H 依次對應(yīng)于1~8位及前面位全部顯示(即需顯示的位應(yīng)為“1”)
D、待機模式開關(guān)寄存器地址:0CH
賦值:00H LED全滅
01H LED正常顯示
E、顯示器測試寄存器地址:0FH
賦值:00H LED為正常顯示狀態(tài)
01H LED測試狀態(tài),即LED全亮
F、8位LED顯示數(shù)據(jù)寄存器地址:01H~08H
對這些寄存器賦值(即需顯示的內(nèi)容),就會在對應(yīng)的1~8位LED數(shù)碼管上顯示出來
由于電源中雜波或附近的電磁等干擾信號,使MAX7219在上電后不顯示或亂顯示;為了消除這種現(xiàn)象應(yīng)在MAX7219的VCC端與地之間接一只104pf的瓷片電容,在LOAD端于地之間接一只10K的電阻。最號還在電源與MAX7219的VCC端之間串一只去高頻的電感。
而在電源方面,最好使用變壓器供電,而不要用開關(guān)電源供電。
加在DIN引腳上的串行數(shù)據(jù)必須在LOAD腳為低電平時,以每2字節(jié)一次,在SCK腳信號的每個上升沿移入1位數(shù)據(jù),且高位在前低位在后,然后在LOAD信號的上升沿MAX7219所存數(shù)據(jù)。
3、LED數(shù)碼管引腳圖如下:
顯示段碼表如下:
4、原理圖
5、C源程序
#include《reg51.h》
sbit CLK=P1^7; //MAX7219時鐘信號線
sbit LD=P1^6; //數(shù)據(jù)加載線
sbit DIN=P1^5; //數(shù)據(jù)輸入線
unsigned char code disp_table[]={0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b,
0x77,0x1f,0x4e,0x3d,0x01,0x00}; //非譯碼方式時的共陰數(shù)碼管顯示編碼,0~9,E,o,r,d,-,息滅
void w_max7219(unsigned char addr,unsigned char wdata); //向MAX7219寫數(shù)據(jù)函數(shù)聲明
void init_max7219(); //MAX7219初始化函數(shù)聲明
void TImer_ms(unsigned char TIm); //毫秒級延時函數(shù)聲明
/******************************************************************************************
函數(shù)名稱:main
函數(shù)說明:主函數(shù)
入口參數(shù):
出口參數(shù):
其 它:
******************************************************************************************/
main()
{
init_max7219(); //MAX7219初始化函數(shù)
w_max7219(0x01,disp_table[1]); //向MAX7219第一位寄存器寫顯示數(shù)據(jù)1
w_max7219(0x02,disp_table[2]); //向MAX7219第二位寄存器寫顯示數(shù)據(jù)2
w_max7219(0x03,disp_table[3]); //向MAX7219第三位寄存器寫顯示數(shù)據(jù)3
w_max7219(0x04,disp_table[4]); //向MAX7219第四位寄存器寫顯示數(shù)據(jù)4
w_max7219(0x05,disp_table[5]); //向MAX7219第五位寄存器寫顯示數(shù)據(jù)5
w_max7219(0x06,disp_table[6]); //向MAX7219第六位寄存器寫顯示數(shù)據(jù)6
w_max7219(0x07,disp_table[7]); //向MAX7219第七位寄存器寫顯示數(shù)據(jù)7
w_max7219(0x08,disp_table[8]); //向MAX7219第八位寄存器寫顯示數(shù)據(jù)8
while(1);
}
/**********************************************************************************************
函數(shù)名稱:init_max7219
函數(shù)功能:MAX7219初始化
入口參數(shù):
出口參數(shù):
其 它:
**********************************************************************************************/
void init_max7219()
{
w_max7219(0x0a,0x07); //顯示亮度,取值范圍0~f
w_max7219(0x0b,0x07); //8位掃描顯示,取值范圍0x01~0x07
w_max7219(0x09,0x00); //譯碼方式,0x00為不譯碼,0xff為譯碼[!--empirenews.page--]
w_max7219(0x0c,0x01); //操作方式,0x00為低功耗模式,0x01為正常操作模式
w_max7219(0x0f,0x00); //顯示狀態(tài),0x00為正常顯示,0x01為顯示測試
TImer_ms(2);
}
/*********************************************************************************************
函數(shù)名稱:w_max7219
函數(shù)功能:向MAX7219寫入數(shù)據(jù)
入口參數(shù):addr MAX7219內(nèi)部寄存器地址,wdata 寫入內(nèi)部寄存器的操作數(shù)值
出口參數(shù):
其 它:
*********************************************************************************************/
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內(nèi)部寄存器地址,再向內(nèi)部寄存器寫入操作數(shù)值
else temp=wdata;
for(j=0;j《8;j++)
{
CLK=0;
if((temp&0x80)==0x80) DIN=1; //先發(fā)送數(shù)據(jù)的最高位
else DIN=0;
for(k=5;k》0;k--); //時鐘頻率高的單片機需曾加延時時間,此處為12MHz
CLK=1;
for(k=5;k》0;k--);
temp《《=1;
}
i+=8;
}
LD=1;
}
/*-------------------------------------------------------------------------------------------
函數(shù)名稱: TImer_ms
函數(shù)說明: 1ms延時子程序
入口參數(shù): tim為接收主調(diào)傳來需延時的毫秒數(shù),取值范圍1~256,定時時間1~256ms
出口參數(shù):
其 它:
------------------------------------------------------------------------------------------*/
void timer_ms(unsigned char tim)
{
unsigned char i;
while(tim--)
{
for(i=0;i《200;i++); //延時1ms
}
}