單片機的學習可以分為幾個階段:單片機的I/O口的學習、單片機內部的資源(定時器、中斷、串口驅動等等)的學習和常用外圍器件的驅動程序等等幾個步驟。之后你就可以用所學過的東西作些項目了。這里作者主要介紹單片機常用外圍器件的驅動以及簡單應用,并陸續介紹了幾種通用串行總線的驅動方法。
總結
1 MAX7219 簡介
MAX7219是MAXIM公司生產的串行輸入/輸出共陰極數碼管顯示驅動芯片,一片MAX7219可驅動8個7段(包括小數點共8段)數字LED、LED條線圖形顯示器、或64個分立的LED發光二級管。該芯片具有10MHz傳輸率的三線串行接口可與任何微處理器相連,只需一個外接電阻即可設置所有LED的段電流。。它的操作很簡單,MCU只需通過模擬SPI三線接口就可以將相關的指令寫入MAX7219的內部指令和數據寄存器,同時它還允許用戶選擇多種譯碼方式和譯碼位。此外它還支持多片7219串聯方式,這樣MCU就可以通過3根線(即串行數據線、串行時鐘線和芯片選通線)控制更多的數碼管顯示。MAX7219的外部引腳分配如圖1所示及內部結構如圖2所示。

圖1 MAX7219的外部引腳分配

圖2 MAX7219的內部引腳分配
各引腳的功能為:
DIN:串行數據輸入端
DOUT:串行數據輸出端,用于級連擴展
LOAD:裝載數據輸入
CLK:串行時鐘輸入
DIG0~DIG7:8位LED位選線,從共陰極LED中吸入電流
SEG A~SEG G DP 7段驅動和小數點驅動
ISET: 通過一個10k電阻和Vcc相連,設置段電流
MAX7219有下列幾組寄存器:(如圖3)
MAX7219內部的寄存器如圖3,主要有:譯碼控制寄存器、亮度控制寄存器、掃描界限寄存器、關斷模式寄存器、測試控制寄存器。編程時只有正確操作這些寄存器,MAX7219才可工作。

圖 3 MAX7219內部的相關寄存器
分別介紹如下:
(1) 譯碼控制寄存器(X9H)
如圖4所示,MAX7219有兩種譯碼方式:B譯碼方式和不譯碼方式。當選擇不譯碼時,8個數據為分別一一對應7個段和小數點位;B譯碼方式是BCD譯碼,直接送數據就可以顯示。實際應用中可以按位設置選擇B譯碼或是不譯碼方式。
圖4 MAX7219的譯碼控制寄存器
(2) 掃描界限寄存器(XBH)
如圖5所示,此寄存器用于設置顯示的LED的個數(1~8),比如當設置為0xX4時,LED 0~5顯示。

圖5 MAX7219的掃描界限控制寄存器
(3) 亮度控制寄存器(XAH)
共有16級可選擇,用于設置LED的顯示亮度,從0xX0~0xXF
(4) 關斷模式寄存器(XCH)
共有兩種模式選擇,一是關斷狀態,(最低位 D0=0)一是正常工作狀態(D0=1)。
(5) 顯示測試寄存器(XFH)
用于設置LED是測試狀態還是正常工作狀態,當測試狀態時(最低位 D0=1)各位顯示全亮,正常工作狀態(D0=0)。
各寄存器具體操作見驅動程序詳解。
2 讀寫時序說明
MAX7129是SPI總線驅動方式。它不僅要向寄存器寫入控制字,還需要讀取相應寄存器的數據。
要想與MAX7129通信,首先要先了解MAX7129的控制字。MAX7129的控制字格式如圖6。

圖6 控制字(即地址及命令字節)
如圖,工作時,MAX7219規定一次接收16位數據,在接收的16位數據中:D15~D12可以與操作無關,可以任意寫入,D11~D8決定所選通的內部寄存器地址,D7~D0為待顯示數據或是初始化控制字。在CLK脈沖作用下,DIN的數據以串行方式依次移入內部16位寄存器,然后在一個LOAD上升沿作用下,鎖存到內部的寄存器中。注意在接收時,先接收最高位D16,最后是D0,因此,在程序發送時必須先送高位數據,在循環移位。工作時序圖見圖7。
由于51是8位單片機故需要分兩次來送數據。具體操作見驅動程序詳解。

圖7 數據讀寫時序
驅動程序
//管腳定義
sbit LOAD=P2^1; //MAX7219片選 12腳
sbit DIN=P2^0; //MAX7219串行數據 1腳
sbit CLK=P2^2; //MAX7219串行時鐘 13腳
//寄存器宏定義
#define DECODE_MODE 0x09 //譯碼控制寄存器
#define INTENSITY 0x0A //亮度控制寄存器
#define SCAN_LIMIT 0x0B //掃描界限寄存器
#define SHUT_DOWN 0x0C //關斷模式寄存器
#define DISPLAY_TEST 0x0F //測試控制寄存器
//函數聲明
void Write7219(unsigned char address,unsigned char dat);
void Initial(void);
//地址、數據發送子程序
void Write7219(unsigned char address,unsigned char dat)
{
unsigned char i;
ACC=address;
LOAD=0; //拉低片選線,選中器件
//發送地址
for (i=0;i<8;i++) //移位循環8次
{
CLK=0; //清零時鐘總線
DIN=A7; //每次取最高位 送max7219
CLK=1; //時鐘上升沿,發送地址
address<<=1; //左移一位
}
//發送數據
ACC=dat;
for (i=0;i<8;i++)
{
CLK=0;
DIN=A7;
dat<<=1;
CLK=1; //時鐘上升沿,發送數據
}
LOAD=1; //發送結束,上升沿鎖存數據
}
//MAX7219初始化,設置MAX7219內部的控制寄存器
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); //設置初始亮度
}
MAX7219、STC12C5A60S2 資料.7z
(165.28 KB, 下載次數: 30)
| 歡迎光臨 (http://www.raoushi.com/bbs/) | Powered by Discuz! X3.1 |