單片機(jī)的學(xué)習(xí)可以分為幾個(gè)階段:?jiǎn)纹瑱C(jī)的I/O口的學(xué)習(xí)、單片機(jī)內(nèi)部的資源(定時(shí)器、中斷、串口驅(qū)動(dòng)等等)的學(xué)習(xí)和常用外圍器件的驅(qū)動(dòng)程序等等幾個(gè)步驟。之后你就可以用所學(xué)過(guò)的東西作些項(xiàng)目了。這里作者主要介紹單片機(jī)常用外圍器件的驅(qū)動(dòng)以及簡(jiǎn)單應(yīng)用,并陸續(xù)介紹了幾種通用串行總線的驅(qū)動(dòng)方法。 總結(jié) 1 MAX7219 簡(jiǎn)介 MAX7219是MAXIM公司生產(chǎn)的串行輸入/輸出共陰極數(shù)碼管顯示驅(qū)動(dòng)芯片,一片MAX7219可驅(qū)動(dòng)8個(gè)7段(包括小數(shù)點(diǎn)共8段)數(shù)字LED、LED條線圖形顯示器、或64個(gè)分立的LED發(fā)光二級(jí)管。該芯片具有10MHz傳輸率的三線串行接口可與任何微處理器相連,只需一個(gè)外接電阻即可設(shè)置所有LED的段電流。。它的操作很簡(jiǎn)單,MCU只需通過(guò)模擬SPI三線接口就可以將相關(guān)的指令寫入MAX7219的內(nèi)部指令和數(shù)據(jù)寄存器,同時(shí)它還允許用戶選擇多種譯碼方式和譯碼位。此外它還支持多片7219串聯(lián)方式,這樣MCU就可以通過(guò)3根線(即串行數(shù)據(jù)線、串行時(shí)鐘線和芯片選通線)控制更多的數(shù)碼管顯示。MAX7219的外部引腳分配如圖1所示及內(nèi)部結(jié)構(gòu)如圖2所示。 
圖1 MAX7219的外部引腳分配 
圖2 MAX7219的內(nèi)部引腳分配 各引腳的功能為: DIN:串行數(shù)據(jù)輸入端 DOUT:串行數(shù)據(jù)輸出端,用于級(jí)連擴(kuò)展 LOAD:裝載數(shù)據(jù)輸入 CLK:串行時(shí)鐘輸入 DIG0~DIG7:8位LED位選線,從共陰極LED中吸入電流 SEG A~SEG G DP 7段驅(qū)動(dòng)和小數(shù)點(diǎn)驅(qū)動(dòng) ISET: 通過(guò)一個(gè)10k電阻和Vcc相連,設(shè)置段電流 MAX7219有下列幾組寄存器:(如圖3) MAX7219內(nèi)部的寄存器如圖3,主要有:譯碼控制寄存器、亮度控制寄存器、掃描界限寄存器、關(guān)斷模式寄存器、測(cè)試控制寄存器。編程時(shí)只有正確操作這些寄存器,MAX7219才可工作。 
圖 3 MAX7219內(nèi)部的相關(guān)寄存器 分別介紹如下: (1) 譯碼控制寄存器(X9H) 如圖4所示,MAX7219有兩種譯碼方式:B譯碼方式和不譯碼方式。當(dāng)選擇不譯碼時(shí),8個(gè)數(shù)據(jù)為分別一一對(duì)應(yīng)7個(gè)段和小數(shù)點(diǎn)位;B譯碼方式是BCD譯碼,直接送數(shù)據(jù)就可以顯示。實(shí)際應(yīng)用中可以按位設(shè)置選擇B譯碼或是不譯碼方式。 圖4 MAX7219的譯碼控制寄存器 (2) 掃描界限寄存器(XBH) 如圖5所示,此寄存器用于設(shè)置顯示的LED的個(gè)數(shù)(1~8),比如當(dāng)設(shè)置為0xX4時(shí),LED 0~5顯示。 
圖5 MAX7219的掃描界限控制寄存器 (3) 亮度控制寄存器(XAH) 共有16級(jí)可選擇,用于設(shè)置LED的顯示亮度,從0xX0~0xXF (4) 關(guān)斷模式寄存器(XCH) 共有兩種模式選擇,一是關(guān)斷狀態(tài),(最低位 D0=0)一是正常工作狀態(tài)(D0=1)。 (5) 顯示測(cè)試寄存器(XFH) 用于設(shè)置LED是測(cè)試狀態(tài)還是正常工作狀態(tài),當(dāng)測(cè)試狀態(tài)時(shí)(最低位 D0=1)各位顯示全亮,正常工作狀態(tài)(D0=0)。 各寄存器具體操作見驅(qū)動(dòng)程序詳解。 2 讀寫時(shí)序說(shuō)明 MAX7129是SPI總線驅(qū)動(dòng)方式。它不僅要向寄存器寫入控制字,還需要讀取相應(yīng)寄存器的數(shù)據(jù)。 要想與MAX7129通信,首先要先了解MAX7129的控制字。MAX7129的控制字格式如圖6。 
圖6 控制字(即地址及命令字節(jié)) 如圖,工作時(shí),MAX7219規(guī)定一次接收16位數(shù)據(jù),在接收的16位數(shù)據(jù)中:D15~D12可以與操作無(wú)關(guān),可以任意寫入,D11~D8決定所選通的內(nèi)部寄存器地址,D7~D0為待顯示數(shù)據(jù)或是初始化控制字。在CLK脈沖作用下,DIN的數(shù)據(jù)以串行方式依次移入內(nèi)部16位寄存器,然后在一個(gè)LOAD上升沿作用下,鎖存到內(nèi)部的寄存器中。注意在接收時(shí),先接收最高位D16,最后是D0,因此,在程序發(fā)送時(shí)必須先送高位數(shù)據(jù),在循環(huán)移位。工作時(shí)序圖見圖7。 由于51是8位單片機(jī)故需要分兩次來(lái)送數(shù)據(jù)。具體操作見驅(qū)動(dòng)程序詳解。 
圖7 數(shù)據(jù)讀寫時(shí)序 驅(qū)動(dòng)程序
//管腳定義
sbit LOAD=P2^1; //MAX7219片選 12腳
sbit DIN=P2^0; //MAX7219串行數(shù)據(jù) 1腳
sbit CLK=P2^2; //MAX7219串行時(shí)鐘 13腳
//寄存器宏定義
#define DECODE_MODE 0x09 //譯碼控制寄存器
#define INTENSITY 0x0A //亮度控制寄存器
#define SCAN_LIMIT 0x0B //掃描界限寄存器
#define SHUT_DOWN 0x0C //關(guān)斷模式寄存器
#define DISPLAY_TEST 0x0F //測(cè)試控制寄存器
//函數(shù)聲明
void Write7219(unsigned char address,unsigned char dat);
void Initial(void);
//地址、數(shù)據(jù)發(fā)送子程序
void Write7219(unsigned char address,unsigned char dat)
{
unsigned char i;
ACC=address;
LOAD=0; //拉低片選線,選中器件
//發(fā)送地址
for (i=0;i<8;i++) //移位循環(huán)8次
{
CLK=0; //清零時(shí)鐘總線
DIN=A7; //每次取最高位 送max7219
CLK=1; //時(shí)鐘上升沿,發(fā)送地址
address<<=1; //左移一位
}
//發(fā)送數(shù)據(jù)
ACC=dat;
for (i=0;i<8;i++)
{
CLK=0;
DIN=A7;
dat<<=1;
CLK=1; //時(shí)鐘上升沿,發(fā)送數(shù)據(jù)
}
LOAD=1; //發(fā)送結(jié)束,上升沿鎖存數(shù)據(jù)
}
//MAX7219初始化,設(shè)置MAX7219內(nèi)部的控制寄存器
void Initial(void)
{
Write7219(SHUT_DOWN,0x01); //開啟正常工作模式(0xX1)
Write7219(DISPLAY_TEST,0x00); //選擇工作模式(0xX0)
Write7219(DECODE_MODE,0x00); //選用不譯碼模式
Write7219(SCAN_LIMIT,0x07); //8只LED全用
Write7219(INTENSITY,0x04); //設(shè)置初始亮度
}
單片機(jī)源程序如下:
- #include<reg52.h>
- #include<max7219.h>
- /*-------------------------------------------------
- 此函數(shù)是向MAX7219寫數(shù)據(jù)(操作字或者顯示數(shù)據(jù))
- address是內(nèi)部寄存器的地址;
- dat是操作字或者顯示的數(shù)據(jù)
- -------------------------------------------------*/
- void Write_7219(uchar address,uchar dat)
- { uchar i;
- ACC=address;
- LOAD=0; //拉低片選線,選中器件
- //發(fā)送地址
- for (i=0;i<8;i++) //移位循環(huán)8次
- {
- CLK=0; //清零時(shí)鐘總線
- DIN=A7; //每次取最高位 送max7219
- CLK=1; //時(shí)鐘上升沿,發(fā)送地址
- address<<=1; //左移一位
- }
- //發(fā)送數(shù)據(jù)
- ACC=dat;
- for (i=0;i<8;i++)
- {
- CLK=0;
- DIN=A7;
- CLK=1; //時(shí)鐘上升沿,發(fā)送數(shù)據(jù)
- dat<<=1;
- }
- LOAD=1; //發(fā)送結(jié)束,上升沿鎖存數(shù)據(jù)
- }
- /*-------------------------------------------------
- 這個(gè)是MAX7219的初始化程序
- DECODE_MODE 0x09 //譯碼控制寄存器
- INTENSITY 0x0A //亮度控制寄存器
- SCAN_LIMIT 0x0B //掃描界限寄存器
- SHUT_DOWN 0x0C //關(guān)斷模式寄存器
- DISPLAY_TEST 0x0F //測(cè)試控制寄存器
- -------------------------------------------------*/
- void Init_7219(void)
- {
- Write_7219(SHUT_DOWN,0x01); //開啟正常工作模式(0xX1)
- Write_7219(DISPLAY_TEST,0x00); //選擇工作模式(0xX0)
- Write_7219(DECODE_MODE,0x00); //選用不譯碼模式
- Write_7219(SCAN_LIMIT,0x07); //8只LED全用
- Write_7219(INTENSITY,0x04); //設(shè)置初始亮度
- }
- /*
- void mul_write_7219( uchar *point) //寫多個(gè)數(shù)據(jù)
- {
- uchar i;
-
- for (i=0;i<8;i++)
- {
- Write_7219(i+1,*point);
- point++;
- }
-
- }
- */
復(fù)制代碼
全部資料51hei下載地址:
MAX7219、STC12C5A60S2 資料.7z
(165.28 KB, 下載次數(shù): 30)
2020-4-29 18:33 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|