[笔记].使用Protues仿真Max7129.[C][Keil][Proteus]
0赞
发表于 2010/6/8 21:46:23
阅读(3211)
引子
在Nios II上调了好几天的I2C,PCF8563都没有被正常驱动,很是伤感。干脆先用51驱动试试。首先要解决的便是显示问题,用Max7129来驱动七段数码管。
仿真环境
硬件部分:Proteus 7.5 SP3
软件部分:Keil uVision4
Proteus仿真图
图1 Proteus仿真图
Keil工程
图2 Keil工程
源代码
main.c
01 |
#include "max7219.h" |
02 |
|
03 |
int main( void ) |
04 |
{ |
05 |
Max7219_Init(); |
06 |
while (1) |
07 |
{ |
08 |
Max7219_WriteData(1, 2); |
09 |
Max7219_WriteData(2, 0); |
10 |
Max7219_WriteData(3, 4); |
11 |
Max7219_WriteData(4, 0); |
12 |
Max7219_WriteData(5, 2); |
13 |
Max7219_WriteData(6, 0); |
14 |
Max7219_WriteData(7, 4); |
15 |
Max7219_WriteData(8, 0); |
16 |
} |
1 |
1 |
return 0; |
2 |
} |
max7129.h
01 |
#ifndef _MAX7219_H_ |
02 |
#define _MAX7219_H_ |
03 |
|
04 |
#include |
05 |
sbit Max7129_DIN = P1^0; // Serial-Data Input: rising edge |
06 |
sbit Max7129_LOAD = P1^1; // Load-Data Input: rising edge |
07 |
sbit Max7129_CLK = P1^2; // Serial-Clock Input: maximum 10MHz |
08 |
|
09 |
// commone part |
10 |
#define HIGH 1 |
11 |
#define LOW 0 |
12 |
#define TRUE 1 |
13 |
#define FALSE 0 |
14 |
#define ZERO 0 |
15 |
#define MSB 0x80 |
16 |
#define LSB 0x01 |
17 |
|
18 |
// max7129 part |
19 |
#define DECODE_MODE 0x09 // 译码方式 |
20 |
#define INTENSITY 0x0A // 显示亮度 |
21 |
#define SCAN_LIMIT 0x0B // 扫描限制 |
22 |
#define SHUT_DOWN 0x0C // 关断方式 |
23 |
#define DISPLAY_TEST 0x0F // 显示测试 |
24 |
|
25 |
// |
26 |
void Max7219_WriteByte(unsigned char byte); |
27 |
void Max7219_WriteData(unsigned char addr, unsigned char dat); |
28 |
void Max7219_Init( void ); |
29 |
|
30 |
#endif /* _MAX7219_H_ */ |
max7129.c
01 |
#include "max7219.h" |
02 |
|
03 |
/* |
04 |
* 发送一个字节的子程序: |
05 |
* 上升沿发送数据, |
06 |
* MSB first |
07 |
*/ |
08 |
void Max7219_WriteByte(unsigned char byte) |
09 |
{ |
10 |
unsigned char i; |
11 |
for (i=0; i<8; i++) |
12 |
{ |
13 |
Max7129_CLK = LOW; |
14 |
Max7129_DIN = (bit)(byte & MSB); |
15 |
byte <<= 1; |
16 |
Max7129_CLK = HIGH; |
17 |
} |
18 |
} |
19 |
|
20 |
/* |
21 |
* 向寄存器中写入一个数据 |
22 |
* 先写地址,后写数据 |
23 |
*/ |
24 |
void Max7219_WriteData(unsigned char addr, unsigned char dat) |
25 |
{ |
26 |
Max7129_LOAD = HIGH; // 使Max7129_LOAD变高,启动串行数据发送 |
27 |
Max7219_WriteByte(addr); |
28 |
Max7219_WriteByte(dat); |
29 |
Max7129_LOAD = LOW; // 使Max7129_LOAD变低,锁存数据 |
30 |
Max7129_LOAD = HIGH; // 使Max7129_LOAD变高,串行数据结束 |
31 |
} |
32 |
|
33 |
/* |
34 |
* |
35 |
*/ |
36 |
void Max7219_Init( void ) |
37 |
{ |
38 |
Max7219_WriteData(SHUT_DOWN, 0x01); // 掉电模式: 1, 正常操作; 0, 睡眠模式 |
39 |
Max7219_WriteData(DISPLAY_TEST, 0x00); // 显示测试: 0, 正常模式; 1, 测试模式 |
40 |
Max7219_WriteData(DECODE_MODE, 0xff); // 译码模式:0, 不译码; 1, BCD译码 |
41 |
Max7219_WriteData(SCAN_LIMIT, 0x07); // 扫描限制: 0 ~ 7 |
42 |
Max7219_WriteData(INTENSITY, 0x07); // 显示亮度: 0 ~ F |
43 |
} |
原理
表1 主要管脚说面
DIN | 串型数据输入。在时钟的上升沿,数据被载入内置的16位移位寄存器。 |
LOAD | 载入数据输入。在LOAD的上升沿,串型数据的后16位被锁存。 |
CLK | 串型时钟输入。最大速率10MHz。在时钟的上升沿,数据被移入内置的以为寄存器;在时钟的下降沿,数据从DOUT输出。 |
DOUT | 串型数据输出。从DIN输入的数据,于16.5个时钟周期后,在DOUT有效。该引脚用于级联7219,且从不呈现高阻抗状态。 |
表2 串型数据格式(16 位)
表3 寄存器地址映射
表4 掉电寄存器格式(Address (Hex) = 0xXC)
表5 译码模式寄存器格式(Address (Hex) = 0xX9)
表6 Code B 字体
* 小数点位由 D7 = 1 设定
表7 非译码模式对应段码
图8 亮度调整寄存器格式(Address (Hex) = 0xXA)
图9 扫描闲置寄存器格式(Address (Hex) = 0xXB)
图10 显示测试寄存器格式(Address (Hex) = 0xXF)
参考
1. Maxim. MAX7219/MAX7221 datasheet
2. max7219数码管驱动模块
http://www.amy-studio.com/bbs/viewthread.php?tid=923
3. 共享我做的串行8位数码管控制芯片MAX7219的实例,显示0到7,附源文件!