使用Protues仿真Max7129

引子

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

仿真环境

硬件部分:Proteus 7.5 SP3

软件部分:Keil uVision4

Proteus仿真图

图1 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 位)

表2 串型数据格式 

表3 寄存器地址映射 

表3 寄存器地址映射

表4 掉电寄存器格式(Address (Hex) = 0xXC)

表4 掉电寄存器格式

表5 译码模式寄存器格式(Address (Hex) = 0xX9)

表5 译码模式寄存器格式

表6 Code B 字体

表6 Code B 字体

* 小数点位由 D7 = 1 设定

表7 非译码模式对应段码

表7 非译码模式对应段码

图8 亮度调整寄存器格式(Address (Hex) = 0xXA)

图8 亮度调整寄存器格式

图9 扫描闲置寄存器格式(Address (Hex) = 0xXB)

图9 扫描闲置寄存器格式

图10 显示测试寄存器格式(Address (Hex) = 0xXF)

图10 显示测试寄存器格式

参考

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值