引子
在Nios II上调了好几天的I2C,PCF8563都没有被正常驱动,很是伤感。干脆先用51驱动试试。首先要解决的便是显示问题,用Max7129来驱动七段数码管。
仿真环境
硬件部分: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;
// 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
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"
/*
* 发送一个字节的子程序:
* 上升沿发送数据,
* 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,附源文件!