• [笔记].使用Protues仿真Max7129


    引子

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

    仿真环境

    硬件部分:Proteus 7.5 SP3

    软件部分:Keil uVision4

    Proteus仿真图

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

    表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

  • 相关阅读:
    排序算法七:选择排序之堆排序
    排序算法七:选择排序之堆排序
    排序算法六:选择排序之直接选择排序
    排序算法六:选择排序之直接选择排序
    贝叶斯网络
    web 开发之js---js 中的数组操作
    web 开发之js---JS变量也要注意初始化
    web 开发之js---理解并解决IE的内存泄漏方式
    web 开发之js---巧用iframe实现jsp无刷新上传文件
    web 开发之js---js获取select标签选中的值
  • 原文地址:https://www.cnblogs.com/yuphone/p/1621712.html
Copyright © 2020-2023  润新知