引子
在Nios II上調(diào)了好幾天的I2C,PCF8563都沒有被正常驅(qū)動,很是傷感。干脆先用51驅(qū)動試試。首先要解決的便是顯示問題,用Max7129來驅(qū)動七段數(shù)碼管。
仿真環(huán)境
硬件部分:Proteus 7.5 SP3
軟件部分:Keil uVision4
Proteus仿真圖
圖1 Proteus仿真圖
Keil工程
圖2 Keil工程
源代碼
main.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 |
#include "max7219.h"
int main( void )
{
Max7219_Init();
while (1)
{
Max7219_WriteData(1, 2);
Max7219_WriteData(2, 0);
Max7219_WriteData(3, 4);
Max7219_WriteData(4, 0);
Max7219_WriteData(5, 2);
Max7219_WriteData(6, 0);
Max7219_WriteData(7, 4);
Max7219_WriteData(8, 0);
}
return 0;
}
|
max7129.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 |
#ifndef _MAX7219_H_
#define _MAX7219_H_
#include <reg51.h>
sbit Max7129_DIN = P1^0;
sbit Max7129_LOAD = P1^1;
sbit Max7129_CLK = P1^2;
#define HIGH 1
#define LOW 0
#define TRUE 1
#define FALSE 0
#define ZERO 0
#define MSB 0x80
#define LSB 0x01
#define DECODE_MODE 0x09 // 譯碼方式
#define INTENSITY 0x0A // 顯示亮度
#define SCAN_LIMIT 0x0B // 掃描限制
#define SHUT_DOWN 0x0C // 關(guān)斷方式
#define DISPLAY_TEST 0x0F // 顯示測試
void Max7219_WriteByte(unsigned char byte);
void Max7219_WriteData(unsigned char addr, unsigned char dat);
void Max7219_Init( void );
#endif /* _MAX7219_H_ */
|
max7129.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 |
#include "max7219.h"
void Max7219_WriteByte(unsigned char byte)
{
unsigned char i;
for (i=0; i<8; i++)
{
Max7129_CLK = LOW;
Max7129_DIN = (bit)(byte & MSB);
byte <<= 1;
Max7129_CLK = HIGH;
}
}
void Max7219_WriteData(unsigned char addr, unsigned char dat)
{
Max7129_LOAD = HIGH;
Max7219_WriteByte(addr);
Max7219_WriteByte(dat);
Max7129_LOAD = LOW;
Max7129_LOAD = HIGH;
}
void Max7219_Init( void )
{
Max7219_WriteData(SHUT_DOWN, 0x01);
Max7219_WriteData(DISPLAY_TEST, 0x00);
Max7219_WriteData(DECODE_MODE, 0xff);
Max7219_WriteData(SCAN_LIMIT, 0x07);
Max7219_WriteData(INTENSITY, 0x07);
}
|
原理
表1 主要管腳說明
DIN |
串型數(shù)據(jù)輸入。在時鐘的上升沿,數(shù)據(jù)被載入內(nèi)置的16位移位寄存器。 |
LOAD |
載入數(shù)據(jù)輸入。在LOAD的上升沿,串型數(shù)據(jù)的后16位被鎖存。 |
CLK |
串型時鐘輸入。最大速率10MHz。在時鐘的上升沿,數(shù)據(jù)被移入內(nèi)置的以為寄存器;在時鐘的下降沿,數(shù)據(jù)從DOUT輸出。 |
DOUT |
串型數(shù)據(jù)輸出。從DIN輸入的數(shù)據(jù),于16.5個時鐘周期后,在DOUT有效。該引腳用于級聯(lián)7219,且從不呈現(xiàn)高阻抗?fàn)顟B(tài)。 |
表2 串型數(shù)據(jù)格式(16 位)
表3 寄存器地址映射
表4 掉電寄存器格式(Address (Hex) = 0xXC)
表5 譯碼模式寄存器格式(Address (Hex) = 0xX9)
表6 Code B 字體
* 小數(shù)點位由 D7 = 1 設(shè)定
表7 非譯碼模式對應(yīng)段碼
圖8 亮度調(diào)整寄存器格式(Address (Hex) = 0xXA)
圖9 掃描閑置寄存器格式(Address (Hex) = 0xXB)
圖10 顯示測試寄存器格式(Address (Hex) = 0xXF)
參考
1. Maxim. MAX7219/MAX7221 datasheet
2. max7219數(shù)碼管驅(qū)動模塊
http://www./bbs/viewthread.php?tid=923
3. 共享我做的串行8位數(shù)碼管控制芯片MAX7219的實例,顯示0到7,附源文件!
http://www./bbs/bbs_content.jsp?bbs_sn=656961