1、MAX7219簡介
MAX7219是一種串入、并出的共陰極LED數碼管顯示驅動器,每片可驅動8位LED數碼管顯示,與單片機的接口只需3根線,內帶BCD譯碼器,及顯示測試、移位、鎖存器等,輸出電流達40mA,外圍只需一只亮度調整電阻。
MAX7219引腳圖
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所存數據。
3、LED數碼管引腳圖如下:
顯示段碼表如下:
4、原理圖
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
}
}
評論