[笔记].使用Protues仿真Max7129
引子
在Nios II上调了好几天的I2C,PCF8563都没有被正常驱动,很是伤感。干脆先用51驱动试试。首先要解决的便是显示问题,用Max7129来驱动七段数码管。
仿真环境
硬件部分:Proteus 7.5 SP3
软件部分:Keil uVision4
Proteus仿真图
图1 Proteus仿真图
Keil工程
图2 Keil工程
源代码
main.c
#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
#ifndef _MAX7219_H_ #define _MAX7219_H_ #include <reg51.h> sbit Max7129_DIN = P1^0; // Serial-Data Input: rising edge sbit Max7129_LOAD = P1^1; // Load-Data Input: rising edge sbit Max7129_CLK = P1^2; // Serial-Clock Input: maximum 10MHz // commone part #define HIGH 1 #define LOW 0 #define TRUE 1 #define FALSE 0 #define ZERO 0 #define MSB 0x80 #define LSB 0x01 // max7129 part #define DECODE_MODE 0x09 // 译码方式 #define INTENSITY 0x0A // 显示亮度 #define SCAN_LIMIT 0x0B // 扫描限制 #define SHUT_DOWN 0x0C // 关断方式 #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
#include "max7219.h" /* * 发送一个字节的子程序: * 上升沿发送数据, * MSB first */ 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; // 使Max7129_LOAD变高,启动串行数据发送 Max7219_WriteByte(addr); Max7219_WriteByte(dat); Max7129_LOAD = LOW; // 使Max7129_LOAD变低,锁存数据 Max7129_LOAD = HIGH; // 使Max7129_LOAD变高,串行数据结束 } /* * */ void Max7219_Init(void) { Max7219_WriteData(SHUT_DOWN, 0x01); // 掉电模式: 1, 正常操作; 0, 睡眠模式 Max7219_WriteData(DISPLAY_TEST, 0x00); // 显示测试: 0, 正常模式; 1, 测试模式 Max7219_WriteData(DECODE_MODE, 0xff); // 译码模式:0, 不译码; 1, BCD译码 Max7219_WriteData(SCAN_LIMIT, 0x07); // 扫描限制: 0 ~ 7 Max7219_WriteData(INTENSITY, 0x07); // 显示亮度: 0 ~ F }
原理
表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,附源文件!