精华内容
下载资源
问答
  • 改代码实现了MAX7219在STM32驱动下的显示,MAX7219连接5V后驱动引脚连接在STM32的5V容忍引脚,亲测可用。
  • 改代码实现了MAX7219在STM32驱动下的显示,MAX7219连接5V后驱动引脚连接在STM32的5V容忍引脚,亲测可用。
  • stm32f407驱动MAX7219控制数码管显示,动态刷新数码管
  • stm32驱动MAX7219控制数码管显示,max7219驱动数码管程序,CC++源码.zip.zip
  • stm32驱动MAX7219控制数码管显示源码.zip
  • 基于STM32F4xx的MAX7219数码管模块显示程序,采用spi串行总线通信,库函数编程,实测能正常驱动数码管显示
  • 2、51单片机+MAX7219数码管显示C程序/***************************************************程序名称: MAX7219 C语言控制程序*程序功能: 3线串行控制8位共阴数码管*3线定义:DIN 串行数据输入* LOAD 数据锁存* CLK...

    2、51单片机+MAX7219数码管显示C程序

    /**************************************************

    *程序名称: MAX7219 C语言控制程序

    *程序功能: 3线串行控制8位共阴数码管

    *3线定义:DIN 串行数据输入

    * LOAD 数据锁存

    * CLK 时钟输入

    ***************************************************/

    #include 《reg52.h》

    #include 《intrins.h》

    sbit pinDIN=P0^0; //串行数据输入端

    sbit pinLOAD=P0^1; //数据锁存端

    sbit pinCLK=P0^2; //时钟输入端

    #define uchar unsigned char

    uchar code LEDcode[]=

    {0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b,0x00 /*0,1,2,3,4,5,6,7,8,9,全灭*/

    /* 0x77,0x1f,0x4e,0x3d,0x4f,0x47,0x67,0x3e,0xff, */ }; /*A,B,C,D,E,F,P,U,全亮*/

    /**************************************************

    * 向MAX7219写入字节(8位)函数 *

    ***************************************************/

    void sendbyte (uchar dat)

    {

    uchar i,temp;

    _nop_();

    for (i=0;i《8;i++)

    {

    temp=dat&0x80;

    dat=dat《《1;

    if(temp)

    pinDIN=1;

    else

    pinDIN=0;

    pinCLK=0;

    _nop_();

    pinCLK=1;

    }

    }

    /**************************************************

    * 向MAX7219写入地址和控制字(16位) *

    ***************************************************/

    void sendword (uchar addr,uchar dat)

    {

    pinLOAD=0;

    _nop_();

    sendbyte (addr);

    _nop_();

    sendbyte (dat);

    _nop_();

    pinLOAD=1; //第16个上升沿之后,第17个上升沿之前必须把pinCLK置高,否则数据丢失

    }

    /**************************************************

    * MAX7219初始化 *

    ***************************************************/

    void init7219 (void)

    {

    sendword (0x0c,0x01); /* 设置电源工作模式 */

    sendword (0x0a,0x09); /* 设置亮度 19/32 */

    sendword (0x0b,0x03); /* 设置扫描界限 */

    sendword (0x09,0x00); /* 设置译码模式 */

    sendword (0x0f,0x00); /*显示测试 00为正常工作状态*/

    }

    /**************************************************

    * MAX7219清除显示 *

    ***************************************************/

    void clear7219(void)

    {

    uchar i;

    for(i=8;i》0;i--)

    {

    sendword(i,0x00);

    }

    }

    /**************************************************

    * MAX7219主函数 *

    ***************************************************/

    /*void main(void)

    {

    init7219 ();

    //clear7219();

    while(1)

    {

    clear7219();

    sendword(0x01,LEDcode[11]);

    sendword(0x02,LEDcode[12]|0x80);

    sendword(0x03,LEDcode[13]);

    sendword(0x04,LEDcode[4]);

    sendword(0x05,LEDcode[5]);

    sendword(0x06,LEDcode[6]);

    sendword(0x07,LEDcode[7]);

    sendword(0x08,LEDcode[8]);

    }

    }*/

    展开全文
  • max7219控制数码管显示

    2011-05-27 12:16:16
    max7219控制数码管显示,功能强大,模块化编程。可直接调用。单片机,stc60系列。
  • 单片机电子时钟实验,用max7219驱动8位数码管显示时间日期,包含源代码
  • 89C52控制MAX7219驱动数码管

    千次阅读 2017-12-28 17:30:38
    89C52控制MAX7219驱动数码管,提供源码,原理图,焊接实物图等。链接见文末。 原理图源码max7219.h/********************************************************** * 文 件 名 : MAX7219.H * 描 述 : MAX7219驱动包...

    89C52控制MAX7219驱动数码管,提供源码,原理图,焊接实物图等。链接见文末。

    驱动效果展示
    这里写图片描述

    原理图

    这里写图片描述

    源码

    max7219.h

    /**********************************************************
    * 文  件  名 : MAX7219.H 
    * 描      述 : MAX7219驱动包程序 
    * 创  建  人 : 夏玉峰  
    * 单      位 : 佳木斯大学 信息电子技术学院 电子协会 
    * 日      期 : 2012.9.29
    * 开 发 环 境: Keil 4
    * 邮      箱 : xiayufeng90520@163.com
    * 版  本  号 : 1.00
    **********************************************************/
    #ifndef _MAX7219_H_
    #define _MAX7219_H_
    
    #include <reg52.h>
    #include <intrins.h>
    
    //管脚定义
    sbit MAX7219_CS   = P2^6;
    sbit MAX7219_MOSI = P2^5;
    sbit MAX7219_CLK  = P2^7;
    
    //功能寄存器宏定义
    #define DECODEMODE   0X09     //译码控制寄存器地址
    #define INTENSITY    0X0A     //亮度控制寄存器地址
    #define SCANLIMIT    0X0B     //扫描界限寄存器地址
    #define SHUTDOWN     0X0C     //关断模式寄存器地址
    #define DISPTEST     0X0F     //测试控制寄存器地址
    //函数定义
    void MAX7219_WriteByte(unsigned char temp);
    void MAX7219_Write(unsigned char addr, unsigned char dat);
    void MAX719_Init(void);
    
    #endif

    MAX7219.c

    /**********************************************************
    * 文  件  名 : MAX7219.c 
    * 描      述 : MAX7219驱动包程序 
    * 创  建  人 : 夏玉峰  
    * 单      位 : 佳木斯大学 信息电子技术学院 电子协会 
    * 日      期 : 2012.9.29
    * 开 发 环 境: Keil 4
    * 邮      箱 : xiayufeng90520@163.com
    * 版  本  号 : 1.00
    **********************************************************/
    
    #include "max7219.h"
    
    /**************************************************************
    ** 函数名称: void MAX7219_WriteByte(unsigned char date)
    ** 功能描述: 向MAX7219写一个字节
    ** 输   入: unsigned char date 字节内容
    ** 全局变量: 无
    ** 调用模块: 无
    ** 说    明:
    ** 注    意:
    **************************************************************/
    void MAX7219_WriteByte(unsigned char date)
    {
        unsigned char i,temp;
        for(i = 0; i < 8; i++)
        {   
            MAX7219_CLK = 0;
            temp = date & 0X80;
            date = date<<1;
            if(temp == 0X80)
                MAX7219_MOSI = 1;
            else
                MAX7219_MOSI = 0;
            MAX7219_CLK = 1;    //时钟上升沿把数据送入寄存器锁定   
        }
    }
    /**************************************************************
    ** 函数名称: void MAX7219_Write(unsigned char addr, unsigned char dat)
    ** 功能描述: 向MAX7219写指令
    ** 输   入: unsigned char addr  地址 
                 unsigned char dat   数据
    ** 全局变量: 无
    ** 调用模块: 无
    ** 说    明:
    ** 注    意:
    **************************************************************/
    void MAX7219_Write(unsigned char addr, unsigned char dat)
    {
         MAX7219_CS = 0;   //寄存器打开,等待数据的送入
         _nop_();
         MAX7219_WriteByte(addr);  //选择寄存器地址
         _nop_();
         MAX7219_WriteByte(dat);   //选择让芯片执行什么命令
         _nop_();
         MAX7219_CS = 1;  //第16个上升沿之后,第17个上升沿之前必须把CLK拉高,否则数据丢失
    }
    
    /**************************************************************
    ** 函数名称: void MAX7219_Init(void)  
    ** 功能描述: MAX7219初始化
    ** 输   入: 无
    ** 全局变量: 无
    ** 调用模块: 无
    ** 说    明:
    ** 注    意:
    **************************************************************/
    void MAX7219_Init(void)      
    { 
        MAX7219_Write(SHUTDOWN, 0x01);   //关断模式寄存器;关断状态,最低位D0=0;正常状态,最低位D0=1
        MAX7219_Write(DISPTEST, 0x00);   //显示测试寄存器;测试状态,最低位D0=1,各位显示全亮;正常工作状态,最低位D0=1
        MAX7219_Write(DECODEMODE, 0xff); //译码控制寄存器;0XFF,全译码
        MAX7219_Write(SCANLIMIT, 0x07);  //扫描界限寄存器;设置显示的LED的个数(1~8),如设置为0xX4时,LED 0~5显示
        MAX7219_Write(INTENSITY, 0x08);  //亮度控制寄存器;共有16级可选择,用于设置LED的显示亮度,0X00-0X0F
    }

    下载链接

    展开全文
  • MAX7219数码管驱动89C52控制, MAX7219数码管驱动89C52控制
  • max7219共阴极数码管驱动 stm32 hal

    千次阅读 多人点赞 2020-06-19 11:53:17
    实现max7219驱动数码管显示 步骤 max7219资料解读 stm32 参数配置 驱动实现 max7219资料解读 此部分只摘取官方文档部分内容。我认为足够使用了 max7219 与stm32通信方式 max7219通信方式为SPI,16bit 数

    因为做这个需要用到max7219,所以在网上找了一些前车之鉴。和以前找其他资料一样,我认为他们写的真的不好,甚至都辣眼睛,更有甚者上来就放两句话,最后一句是我实现了,倒不如发

    目的

    实现max7219驱动数码管显示

    步骤

    • max7219资料解读
    • stm32 参数配置
    • 驱动实现

    max7219资料解读

    此部分只摘取官方文档部分内容。我认为足够使用了

    • max7219 与stm32通信方式
      max7219通信方式为SPI,16bit 数据格式,先发高位,最大10MHz (圈重点)
      在这里插入图片描述
    • max7219 控制方式
      spi一次发送16bit,就是2字节 = 地址 + 数据 。地址代表着不同的功能,数据代表想设置的参数。按需要直接到地址的表查,然后按照地址的功能设置数据。初次上电时进入的是shutdown模式

    下图寄存器表就是地址

    在这里插入图片描述
    ditgit 代表要控制哪个数据管,max7219可以控制0 - 7个数码管,矩阵led这里不说了。实现步骤就是,想控制的 数码管地址 + 想要显示的数据(可以通过decode mode 设置BCD解码或者不解码)

    功能概述
    • 解码模式 支持BCD解码,或者直接显示某个单独的线端
    • 亮度设置
    • 扫描限制 就是用几个数码管,数量小于等于三个时必须进行电流设置(请查手册)
    • 掉电模式 为了省电,掉电时候只是不显示而已,还是可以进行设置操作,初次上电也是处于这个模式
    • 显示测试 就是测试能不能都亮,或者正常的模式(自己设定的想让哪个亮的模式)

    功能描述表
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    stm32 参数配置

    在这里插入图片描述
    重点注意红框部分 硬件NSS不要使用,因为这个是你想的不是一个东西。速率不能超过10Mhz,差不多就行了,显示几个数字哪怕设置为最慢也是没问题的。

    驱动实现

    static int max7219_send(uint8_t address,uint8_t data)
    {
        uint16_t Transmit_buf = (0x00ff&data)|(0xff00&(address<<8));
        
        HAL_GPIO_WritePin(SPI1_NSS_GPIO_Port,SPI1_NSS_Pin,GPIO_PIN_RESET);
        HAL_SPI_Transmit(&MAX7219_SPI,(uint8_t*)&Transmit_buf,1,3000);
        HAL_GPIO_WritePin(SPI1_NSS_GPIO_Port,SPI1_NSS_Pin,GPIO_PIN_SET);
        
        return 0;
    }
    char tem[2] = {0x01,0x02};
    

    只需要进行发送即可,注意!16bit,先发高字节,假如使用数组tem 将先发送0x02,发送的字节1代表着sizeof(uint16_t)= 2字节
    代码如下,使用面向对象的抽象思想

    /**
      ******************************************************************************
      * File Name          : max7219.h
      * Description        : 头文件.
      ******************************************************************************
      * @attention
      ******************************************************************************
      */
    
    #ifndef __MAX7219_H
    #define __MAX7219_H
    #ifdef __cplusplus
     extern "C" {
    #endif
    
    /* Includes ------------------------------------------------------------------*/
    #include "main.h"
    /* address define */
    #define NO_OP              0x00
    #define DIGIT0             0x01
    #define DIGIT1             0x02
    #define DIGIT2             0x03
    #define DIGIT3             0x04
    #define DIGIT4             0x05
    #define DIGIT5             0x06
    #define DIGIT6             0x07
    #define DIGIT7             0x08
    #define DECODE_MODE        0x09
    #define INTENSITY          0x0A
    #define SCAN_LIMIT         0x0B
    #define SHUT_DOWN          0x0C
    #define DISPLAY_TEST       0x0F
    /* mode define */
    #define NORMAL_MODE           0
    #define NO_DECODE_D0_D7    0x00
    #define DECODE_D0_ONLY     0x01
    #define DECODE_D0_D3_ONLY  0x0F
    #define DECODE_D0_D7       0xFF
    
    /*
     *   AAAAAA\      
     *  FF  __BB\     
     *  FF /  BB |    
     *   GGGGGG  |    
     *  EE  __CC<     
     *  EE /  CC |    
     *  \DDDDDD  |  DP\ 
     *   \______/   \__|
     *  
     *    数码管
     */
    #define Segment_Line_DP    (1<<7)
    #define Segment_Line_A     (1<<6)
    #define Segment_Line_B     (1<<5)
    #define Segment_Line_C     (1<<4)
    #define Segment_Line_D     (1<<3)
    #define Segment_Line_E     (1<<2)
    #define Segment_Line_F     (1<<1)
    #define Segment_Line_G     (1<<0)
    
    /*
     * flash_user_start_addr 数据开始的地址
     * Data                  数据
     * flash_user_size       数据长度
     */
    typedef struct
    {
        int (*max7219_api_find)(uint8_t* mode);
        int (*max7219_api)(uint8_t mode);
        int (*max7219_digit)(uint8_t digit,uint8_t data);
    } max7219TypeDef;
    
    extern max7219TypeDef max7219_api;
    
    #ifdef __cplusplus
    }
    #endif
    #endif /*__ max7219_H */
    
    
    /**
      ******************************************************************************
      * File Name          : max7219.c
      * Description        : 驱动文件.
      ******************************************************************************
      * @attention	1.延时函数自己需要实现
      * 			2.spi发送函数需要自己实现
      * 			3.printf自己实现
      ******************************************************************************
      */
    #include "max7219.h"
    #include "spi.h"
    #include "stdio.h"
    #include "string.h"
    
    /* 配置主函数log功能*/
    #define MAX7219_LOG_ENABLE
    
    #ifdef MAX7219_LOG_ENABLE
    #define MAX7219_LOG(...) \
    do{\
    	printf(__VA_ARGS__);\
        printf("\r\n");\
      } while (0)
    #else
    #define MAX7219_LOG(...)
    #endif
      
    #define MAX7219_SPI hspi1
    
    static const uint8_t to_ascii_tab[][2] = {
        'A', 0x77,  '=',0x09,
        'B', 0x1F,  '-',0x01,
        'C', 0x4E,  '+',0x31,
        'D', 0x3D,  '(',0x4E,
        'E', 0x4f,  ')',0x78,
        'F', 0x47,  0,  0,
        'G', 0x5e,
        'H', 0x37,
        'I', 0x78,
        'J', 0x38,
        'K', 0x57,
        'L', 0x0e,
        'M', 0x76,
        'N', 0x15,
        'O', 0x1d,
        'P', 0x67,
        'Q', 0x73,
        'R', 0x46,
        'S', 0x49,
        'T', 0x0f,
        'U', 0x3e,
        'V', 0x1c,
        'W', 0x3f,
        'X', 0x13,
        'Y', 0x3b,
        'Z', 0x2d,
    };
      
    static int max7219_send(uint8_t address,uint8_t data)
    {
        uint16_t Transmit_buf = (0x00ff&data)|(0xff00&(address<<8));
        
        HAL_GPIO_WritePin(SPI1_NSS_GPIO_Port,SPI1_NSS_Pin,GPIO_PIN_RESET);
        HAL_SPI_Transmit(&MAX7219_SPI,(uint8_t*)&Transmit_buf,1,3000);
        HAL_GPIO_WritePin(SPI1_NSS_GPIO_Port,SPI1_NSS_Pin,GPIO_PIN_SET);
        
        return 0;
    }
    
    /* 掉电模式 
     * mode:
     * NORMAL_MODE 0 -> 正常模式
     *             1 -> 掉电模式
     */
    int max7219_shutdown(uint8_t mode)
    {
        max7219_send(SHUT_DOWN,mode == NORMAL_MODE?1:0);
        return 0;
    }
    
    /* 译码器模式 
     * mode:
     *  NO_DECODE_D0_D7    0x00 -> 不译码模式
     *  DECODE_D0_ONLY     0x01 -> digits 0   译码 7-1 不译码
     *  DECODE_D0_D3_ONLY  0x0F -> digits 3-0 译码 7-4 不译码
     *  DECODE_D0_D7       0xFF -> digits 7-0 译码
     */
    int max7219_decode_mode(uint8_t mode)
    {
        max7219_send(DECODE_MODE,mode);
        return 0;
    }
    
    /* 亮度控制 
     * mode:0x00-0x0f
     */
    int max7219_intensity(uint8_t mode)
    {
        max7219_send(INTENSITY,mode&0x0f);
        return 0;
    }
    
    /* 扫描控制 
     * mode:0-7 digits 0 - 7
     */
    int max7219_scan_limit(uint8_t mode)
    {
        max7219_send(SCAN_LIMIT,mode&0x07);
        return 0;
    }
    
    /* digits显示 
     *  digit -> 显示位置'0'-'7'
     *  data  -> 显示的数据 
     * note :
     *          字符直接显示,不需要查手册 data|Segment_Line_DP
     *          带小数点时最高位为1 ->0x80 + x
     */
    int max7219_digit(uint8_t digit,uint8_t data)
    {
        uint8_t tem = data&0x7f;
        if ((tem >= '0' && tem <= '9'))
        {
            tem = data - '0';
            max7219_api.max7219_api_find((uint8_t*)"decode");
            max7219_api.max7219_api(DECODE_D0_D7);
        }
        else if(tem == '-')
        {
            tem = 0x0A;
            max7219_api.max7219_api_find((uint8_t*)"decode");
            max7219_api.max7219_api(DECODE_D0_D7);
        }
        else if(tem == 'E')
        {
            tem = 0x0B;
            max7219_api.max7219_api_find((uint8_t*)"decode");
            max7219_api.max7219_api(DECODE_D0_D7);
        }
        else if(tem == 'H')
        {
            tem = 0x0C;
            max7219_api.max7219_api_find((uint8_t*)"decode");
            max7219_api.max7219_api(DECODE_D0_D7);
        }
        else if(tem == 'L')
        {
            tem = 0x0D;
            max7219_api.max7219_api_find((uint8_t*)"decode");
            max7219_api.max7219_api(DECODE_D0_D7);
        }
        else if(tem == 'P')
        {
            tem = 0x0E;
            max7219_api.max7219_api_find((uint8_t*)"decode");
            max7219_api.max7219_api(DECODE_D0_D7);
        }
        else if(tem == ' ')
        {
            tem = 0x0F;
            max7219_api.max7219_api_find((uint8_t*)"decode");
            max7219_api.max7219_api(DECODE_D0_D7);
        }
        else
        {
    //        tem = data&0x7f;
            for(int i = 0;i < sizeof(to_ascii_tab)/2;i++)
            {
                if (tem == to_ascii_tab[i][0])
                {
                    tem = to_ascii_tab[i][1];
                    break;
                }
            }
    //        tem |= data&(Segment_Line_DP);
            
            max7219_api.max7219_api_find((uint8_t*)"decode");
            max7219_api.max7219_api(NO_DECODE_D0_D7);
        }
        task_delay(50);//注意:延迟函数,自己实现!!!
        max7219_send(digit-'0' + 1,tem|(data&(Segment_Line_DP)));//这里加 1 因为1对应digit0
        task_delay(10);//注意:延迟函数,自己实现!!!
        return 0;
    }
    
    /* 显示检测 
     * mode:
     *  0 -> 正常模式
     *  1 -> 测试全部显示
     */
    int max7219_test(uint8_t mode)
    {
        max7219_send(DISPLAY_TEST,mode == NORMAL_MODE?0:1);
        return 0;
    }
    
    /* 设置api */
    int max7219_api_find(uint8_t* mode)
    {
        max7219_api.max7219_api = NULL;
        if (!strcmp((char*)mode,"shutdown"))
        {
            max7219_api.max7219_api = max7219_shutdown;
        }
        else if(!strcmp((char*)mode,"scan"))
        {
            max7219_api.max7219_api = max7219_scan_limit;
        }
        else if(!strcmp((char*)mode,"test"))
        {
            max7219_api.max7219_api = max7219_test;
        }
        else if(!strcmp((char*)mode,"decode"))
        {
            max7219_api.max7219_api = max7219_decode_mode;
        }
        else if(!strcmp((char*)mode,"intensity"))
        {
            max7219_api.max7219_api = max7219_intensity;
        }
        else
        {
            MAX7219_LOG("max7219_api_find error :%s",mode);
        }
        
        if(!max7219_api.max7219_api)
            return -1;
        return 0;
    }
    
    max7219TypeDef max7219_api = {
    .max7219_api_find = max7219_api_find,
    .max7219_digit = max7219_digit,
    };
    
    

    max7219_digit 函数直接输入字符,注释写的很清楚
    使用例子

    void led_display_task  (void*arg)
    {
        delay(100);
        
        max7219_api.max7219_api_find((uint8_t*)"shutdown");
        max7219_api.max7219_api(NORMAL_MODE);
        
        max7219_api.max7219_api_find((uint8_t*)"intensity");
        max7219_api.max7219_api(0x8);
        
        max7219_api.max7219_api_find((uint8_t*)"test");
        max7219_api.max7219_api(1);
        
        delay(500);
        
        max7219_api.max7219_api(NORMAL_MODE);
    
        max7219_api.max7219_api_find((uint8_t*)"decode");
        max7219_api.max7219_api(NO_DECODE_D0_D7);
        
        max7219_api.max7219_api_find((uint8_t*)"scan");
        max7219_api.max7219_api(3);
        
        while (1)
        {
            max7219_api.max7219_digit('0','0'|Segment_Line_DP);// |Segment_Line_DP 是带小数点
            max7219_api.max7219_digit('1','1');
            max7219_api.max7219_digit('2','2');
            max7219_api.max7219_digit('3','3');
    
            max7219_api.max7219_digit('2','='|Segment_Line_DP);
            max7219_api.max7219_digit('3','-'|Segment_Line_DP);
            max7219_api.max7219_digit('3','+'|Segment_Line_DP);
            max7219_api.max7219_digit('3','('|Segment_Line_DP);
            max7219_api.max7219_digit('3',')'|Segment_Line_DP);
        }
    }
    

    注意: 改变编码方式时,原有的显示会有影响,比如 1 位置显示 bcd编码,2位置想要更新为 无编码模式,那1 位置也将变为无编码模式。

    展开全文
  • max7219驱动数码管,mcu是stm32f101c8t6
  • 采用动态扫描方式编程时较为复杂,为解决此类问题,作者介绍了一款数码管显示专用驱动芯片MAX7219MAX7219采用串行方式与单片机通信,仅占用3条口线,同时,片内集成硬件动态扫描显示控制电路,支持软件修改内部...
  • 单片机常用芯片MAX7219数码管驱动)

    万次阅读 多人点赞 2019-06-11 17:36:47
    MAX7219是MAXIM公司生产的串行输入/输出共阴极数码管显示驱动芯片,一片MAX7219可驱动8个7段(包括小数点共8段)数字LED、LED条线图形显示器、或64个分立的LED发光二级管。该芯片具有10MHz传输率的三线串行接口可与...

    博主福利:100G+电子设计学习资源包!

    http://mp.weixin.qq.com/mp/homepage?__biz=MzU3OTczMzk5Mg==&hid=7&sn=ad5d5d0f15df84f4a92ebf72f88d4ee8&scene=18#wechat_redirect
    --------------------------------------------------------------------------------------------------------------------------

     

    MAX7219是MAXIM公司生产的串行输入/输出共阴极数码管显示驱动芯片,一片MAX7219可驱动8个7段(包括小数点共8段)数字LED、LED条线图形显示器、或64个分立的LED发光二级管。该芯片具有10MHz传输率的三线串行接口可与任何微处理器相连,只需一个外接电阻即可设置所有LED的段电流。。它的操作很简单,MCU只需通过模拟SPI三线接口就可以将相关的指令写入MAX7219的内部指令和数据寄存器,同时它还允许用户选择多种译码方式和译码位。此外它还支持多片7219串联方式,这样MCU就可以通过3根线(即串行数据线、串行时钟线和芯片选通线)控制更多的数码管显示。MAX7219的外部引脚分配如图1所示及内部结构如图2所示。

    图1   MAX7219的外部引脚分配

     

    图2   MAX7219的内部引脚分配

     

    各引脚的功能为:

    DIN:串行数据输入端

    DOUT:串行数据输出端,用于级连扩展

    LOAD:装载数据输入

    CLK:串行时钟输入

    DIG0~DIG7:8位LED位选线,从共阴极LED中吸入电流

    SEG A~SEG G DP     7段驱动和小数点驱动

    ISET:  通过一个10k电阻和Vcc相连,设置段电流

     

    MAX7219有下列几组寄存器:(如图3)

    MAX7219内部的寄存器如图3,主要有:译码控制寄存器、亮度控制寄存器、扫描界限寄存器、关断模式寄存器、测试控制寄存器。编程时只有正确操作这些寄存器,MAX7219才可工作。

     

    图 3   MAX7219内部的相关寄存器

     

    分别介绍如下:

    (1)        译码控制寄存器(X9H)

    如图4所示,MAX7219有两种译码方式:B译码方式和不译码方式。当选择不译码时,8个数据为分别一一对应7个段和小数点位;B译码方式是BCD译码,直接送数据就可以显示。实际应用中可以按位设置选择B译码或是不译码方式。

    图4   MAX7219的译码控制寄存器

    (2)        扫描界限寄存器(XBH)

    如图5所示,此寄存器用于设置显示的LED的个数(1~8),比如当设置为0xX4时,LED 0~5显示。

     

    图5   MAX7219的扫描界限控制寄存器

     

    (3)        亮度控制寄存器(XAH)

    共有16级可选择,用于设置LED的显示亮度,从0xX0~0xXF

    (4)        关断模式寄存器(XCH)

    共有两种模式选择,一是关断状态,(最低位 D0=0)一是正常工作状态(D0=1)。

    (5)        显示测试寄存器(XFH)

    用于设置LED是测试状态还是正常工作状态,当测试状态时(最低位 D0=1)各位显示全亮,正常工作状态(D0=0)。

    各寄存器具体操作见驱动程序详解。

     

    2 读写时序说明

    MAX7129是SPI总线驱动方式。它不仅要向寄存器写入控制字,还需要读取相应寄存器的数据。

           要想与MAX7129通信,首先要先了解MAX7129的控制字。MAX7129的控制字格式如图6。

    图6   控制字(即地址及命令字节)

     

    如图,工作时,MAX7219规定一次接收16位数据,在接收的16位数据中:D15~D12可以与操作无关,可以任意写入,D11~D8决定所选通的内部寄存器地址,D7~D0为待显示数据或是初始化控制字。在CLK脉冲作用下,DIN的数据以串行方式依次移入内部16位寄存器,然后在一个LOAD上升沿作用下,锁存到内部的寄存器中。注意在接收时,先接收最高位D16,最后是D0,因此,在程序发送时必须先送高位数据,在循环移位。工作时序图见图7。

    由于51是8位单片机故需要分两次来送数据。具体操作见驱动程序详解。

    图7  数据读写时序

    3 电路原理图

    电路原理图

    电路原理图如图7,MAX7219与单片机的连接只需要3条线:LOAD(CS)片选引脚、CLK串行时钟引脚、DIN串行数据引脚。其中C1 为电源滤波电容,R1用来设置段电流。 MAX7219的PCB布线有些难度,作者可以提供画好的PCB给读者。有需要的读者请与作者联系。邮箱:zhaoliang_0801@dl.cn

     

    图8  电路原理图

    4 驱动程序

    //管脚定义
    
    sbit LOAD=P1^2;          //MAX7219片选           12脚
    
    sbit DIN=P1^1;           //MAX7219串行数据       1脚
    
    sbit CLK=P1^0;           //MAX7219串行时钟        13脚
    
    //寄存器宏定义
    
    #define DECODE_MODE  0x09   //译码控制寄存器
    
    #define INTENSITY    0x0A   //亮度控制寄存器
    
    #define SCAN_LIMIT   0x0B   //扫描界限寄存器
    
    #define SHUT_DOWN    0x0C   //关断模式寄存器
    
    #define DISPLAY_TEST 0x0F   //测试控制寄存器        
    
    //函数声明
    
    void Write7219(unsigned char address,unsigned char dat);
    
    void Initial(void);
    
    //地址、数据发送子程序
    
    void Write7219(unsigned char address,unsigned char dat)
    
    {  
    
        unsigned char i;
    
        LOAD=0;    //拉低片选线,选中器件
    
        //发送地址
    
        for (i=0;i<8;i++)        //移位循环8次             
    
        {  
    
           CLK=0;        //清零时钟总线
    
           DIN=(bit)(address&0x80); //每次取高字节     
    
           address<<=1;             //左移一位
    
           CLK=1;        //时钟上升沿,发送地址
    
        }
    
        //发送数据
    
        for (i=0;i<8;i++)              
    
        {  
    
           CLK=0;
    
           DIN=(bit)(dat&0x80);    
    
           dat<<=1; 
    
           CLK=1;        //时钟上升沿,发送数据
    
        }
    
        LOAD=1;    //发送结束,上升沿锁存数据                      
    
    }
    
    //MAX7219初始化,设置MAX7219内部的控制寄存器
    
    void Initial(void)                
    
    {
    
        Write7219(SHUT_DOWN,0x01);         //开启正常工作模式(0xX1)
    
        Write7219(DISPLAY_TEST,0x00);      //选择工作模式(0xX0)
    
        Write7219(DECODE_MODE,0xff);       //选用全译码模式
    
        Write7219(SCAN_LIMIT,0x07);        //8只LED全用
    
        Write7219(INTENSITY,0x04);          //设置初始亮度     
    
    }

    测试程序

    void main(void)
    
    {
    
        unsigned char i;
    
        Initial();               //MAX7219初始化
    
        while(1)
    
        { 
    
           for(i=1;i<9;i++)
    
           {
    
               Write7219(i,i);      //数码管显示1~8
    
           }
    
        }
    
    }

    典型应用电路:

    展开全文
  • 基于STM32CubeMX开发的Max7219显示程序,供大家参考。
  • MAX7219数码管驱动ATmega16控制 MAX7219数码管驱动ATmega16控制
  • max7219是七段公阴极驱动的,是最好的数码管驱动芯片。这里面有对各个寄存器的控制,和显示。
  • 基于MAX7219的8位数码管显示,MAX7219MAX7219MAX7219
  • /***************************************************程序名称: MAX7219 C语言控制程序*程序功能: 3线串行控制8位共阴数码管*3线定义:DIN 串行数据输入* LOAD 数据锁存* CLK 时钟输入****************************...
  • 简单介绍:MAX7219是MAXIM公司生产的串行输入/输出共阴极数码管显示驱动芯片,一片MAX7219可驱动8个7段(包括小数点共8段)数字LED、LED条线图形显示器、或64个分立的LED发光二级管。该芯片具有10MHz传输率的三线串行...
  • MAX7221控制数码管动态显示,MAX7221是集成式共阴极数码管驱动芯片,对于学习数码管驱动的同学可以提供很大的帮助
  • MAX7221控制数码管动态显示(仿真+程序)
  • 基于Max7219的多模块级联多LED显示
  • MAX7221控制数码管动态显示,,比赛练习案例,仿真实例,现成调用封装使用,可运行的仿真电路图和调好的程序,开箱即用。适用于教学案例、毕业设计、电子设计比赛、出书项目实例,实际设计、个人DIY参考。 已调试好...
  • 利用7219控制数码显示器,节省了IO端口,数据串行输入,并行输出,简单
  • STM32下SPI模式通过MAX7219驱动8位数码管显示模块

    万次阅读 多人点赞 2015-12-12 20:47:14
    借鉴的地方: 1、正点原子的“ALIENTEK MINISTM32 实验20 SPI实验” ... 工具: STM32F103RCT6开发板;MAX7219 8位数码管显示模块: 数码管模块电路图:(店家https://item.taobao.com/item.htm?spm=a1z09.2.0.
  • MAX7219数码管显示控制器测试程序 通过串行方式 发送数据 节约了IO口线 同时 可调节显示亮度等 功能更齐全 值得拥有

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,223
精华内容 489
关键字:

max7219控制数码管