安德鲁

[笔记].使用Protues仿真Max7129.[C][Keil][Proteus]

0
阅读(3211)

引子

在Nios II上调了好几天的I2C,PCF8563都没有被正常驱动,很是伤感。干脆先用51驱动试试。首先要解决的便是显示问题,用Max7129来驱动七段数码管。

仿真环境

硬件部分:Proteus 7.5 SP3

软件部分:Keil uVision4

Proteus仿真图

图1 Proteus仿真图

Keil工程

lay: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="图2 Keil工程" border="0" alt="图2 Keil工程" src="http://images.cnblogs.com/cnblogs_com/yuphone/WindowsLiveWriter/2fbd678e4a9f_8FE4/image5_thumb.png" _cke_saved_src="http://images.cnblogs.com/cnblogs_com/yuphone/WindowsLiveWriter/2fbd678e4a9f_8FE4/image5_thumb.png" width="208" height="139" />

图2 Keil工程

源代码

main.c

01 #include "max7219.h"
02
03 intmain(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 return0;
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 voidMax7219_WriteByte(unsignedcharbyte);
27 voidMax7219_WriteData(unsignedcharaddr, unsignedchardat);
28 voidMax7219_Init(void);
29
30 #endif /* _MAX7219_H_ */

max7129.c

01 #include "max7219.h"
02
03 /*
04 * 发送一个字节的子程序:
05 * 上升沿发送数据,
06 * MSB first
07 */
08 voidMax7219_WriteByte(unsignedcharbyte)
09 {
10 unsignedchari;
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 voidMax7219_WriteData(unsignedcharaddr, unsignedchardat)
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 voidMax7219_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,附源文件!

http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=656961

Baidu
map