找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2661|回复: 0
收起左侧

51单片机+max7219数码管驱动程序库函数

[复制链接]
ID:691723 发表于 2020-2-12 14:58 | 显示全部楼层 |阅读模式
在max7219.h头文件内容中,MAX7219_EN为选择是否选择编译max7219.h和max7219.c文件的预定义,MAX7219_TestModeDisp_EN为是否选择编译max7219测试命令的预定义。若选择预定义测试功能,应将测试显示计时变量MAX7219_TestModeDisp_Cnt放置于某定时器中计时,计时间隔已预定义为MAX7219_DelayTimOut(默认为3秒)。
使用max7219.h和max7219.c驱动文件时,应先在mian函数中调用初始化函数void MAX7219_Init(u8 n)然后直接使用显示函数MAX7219_Disp(u8 n,u8 *p)即可。
以下为max7219.h文件内容:
#ifndef _MAX7219_H_
#define _MAX7219_H_

#ifdef _MAX7219_C_
#define MAX7219_EXT
#else
#define MAX7219_EXT extern
#endif

//宏定义编译条件;0----不编译;1----编译;
#define MAX7219_EN        1
#define MAX7219_TestModeDisp_EN                1        //设置是否允许编译测试模式:0----不编译;1----编译;

#if MAX7219_EN

#define MAX7219_DelayTimOut                        3        //测试超时时间预定义


/*****************************************************************
MAX7219---SPI位定义
*****************************************************************/
sbit MAX7219_DIN        = P0^3;                    // 串行数据输入
sbit MAX7219_CLK        = P0^4;                    // 串行时钟
sbit MAX7219_LOAD        = P0^5;                   // 显示数据锁存控制


/*****************************************************************
预定义
*****************************************************************/
//#define NoOp   0x00             // 空操作寄存器
/*
#define Digit0 0x01             // 数码管1寄存器
#define Digit1 0x02             // 数码管2寄存器
#define Digit2 0x03             // 数码管3寄存器
#define Digit3 0x04             // 数码管4寄存器
#define Digit4 0x05             // 数码管5寄存器
#define Digit5 0x06             // 数码管6寄存器
#define Digit6 0x07             // 数码管7寄存器
#define Digit7 0x08             // 数码管8寄存器
*/
//#define DecodeMode        0x09         // 译码模式寄存器
//#define Intensity                0x0a         // 亮度寄存器
//#define ScanLimit                0x0b         // 扫描位数寄存器
//#define ShutDown                0x0c         // 关机模式寄存器
//#define DisplayTest        0x0f         // 显示测试寄存器

#define MAX7219_NoDecode                        0x00        //不译码
#define MAX7219_Decode                                0xff        //译码(BCD码)

#define MAX7219_ShutdownMode                0x00        // 低功耗方式
#define MAX7219_NormalOperation         0x01        // 正常操作方式

#define MAX7219_NormalOperationDisp        0x00        //正常模式显示
#define MAX7219_TestModeDisp                0x01        //测试模式显示



typedef struct
{
        u8        ScanLimit;                //取值:0x00~0x07;显示数码管的位数
        u8        DecodeMode;                //取值:MAX7219_Decode,MAX7219_NoDecode:译码或不译码
        u8        Intensity;                //取值:0x00~0xff;亮度调节值
        u8        ShutDown;                //取值:MAX7219_ShutdownMode,MAX7219_NormalOperation:休眠或正常显示
        u8        DisplayTest;        //取值:MAX7219_NormalOperationDisp,MAX7219_TestModeDisp:正常显示或测试显示

} MAX7219_InitDefine;

MAX7219_EXT xdata MAX7219_InitDefine MAX7219_InitStructure;        //结构类型定义变量

#if MAX7219_TestModeDisp_EN
        MAX7219_EXT xdata MAX7219_TestModeDisp_Cnt;        //测试模式计数变量,只有允许编译测试模式时,
                                                                                                //此变量定义才有效,且必须放入某计数器中;
#endif

MAX7219_EXT void MAX7219_Init(u8 n);                //MAX7219初始化函数
MAX7219_EXT void MAX7219_Disp(u8 n,u8 *p);        //MAX7219显示数码管函数

#endif
#endif


以下为max7219.c文件内容:

#define _MAX7219_C_

#include "all.h"        //单片机头文件已放置此头文件中

#if MAX7219_EN

void MAX7219_WriteByte(u8 ch);                                        //写字节函数(SPI方式)
void MAX7219_WriteAddrData(u8 addr,u8 num);                //写地址和字节函数

/*****************************************************************
向MAX7219写入字节函数
函数说明:
输入参数:        ch---即将写入的字节数据
返回值:        无
*****************************************************************/
void MAX7219_WriteByte(u8 ch)
{
        xdata_u8 i;
    for (i=0;i<8;i++)        //MSB开始的发送字节
    {        MAX7219_CLK=0;
                if( ch & (0x80>>i) ) MAX7219_DIN=1;
        else MAX7219_DIN=0;
                i+=1;i-=1;//延时等待端口输出有效
                MAX7219_CLK=1;        //时钟上升沿有效
        }
}
/*****************************************************************
向MAX7219写入字(16位)函数
函数说明:
输入参数:        addr---地址
                        num----数据
返回值:        无
*****************************************************************/

void MAX7219_WriteAddrData(u8 addr,u8 num)
{
        MAX7219_LOAD=0;
    MAX7219_WriteByte(addr);
    MAX7219_WriteByte(num);
    MAX7219_LOAD=1;                        //LOAD上升沿锁存数据
}

/*****************************************************************
MAX7219初始化函数
函数说明:        初始化MAX7219芯片,MAX7219芯片按照顺序级联,
                        测试模式显示寄存器没有配置,若希望配置,应在max7219.h中将MAX7219_TestModeDisp_EN预定义为1,
                        并注意配置测试模式显示的时间,
                        若时间太短,将较难看到显示效果。
输入参数:        n-----初始化芯片个数(n>=1,注意:第1个为第0号芯片,显示函数中有具体描述;
                        使用本函数前,以下变量应赋值:
                        MAX7219_InitStructure.ScanLimit                ----显示位数
                        MAX7219_InitStructure.DecodeMode        ----译码模式
                        MAX7219_InitStructure.Intensity                ----显示亮度
                        MAX7219_InitStructure.ShutDown                ----是否休眠
                        MAX7219_InitStructure.DisplayTest        ----不做测试模式显示时,无需赋值
返回值:        无
*****************************************************************/

void MAX7219_Init(u8 n)
{
        xdata_u8 i;
        //配置参数定义
        MAX7219_InitStructure.ScanLimit                =7;                                                        //显示位数:0~7
        MAX7219_InitStructure.DecodeMode        =MAX7219_Decode;                        //是否译码:MAX7219_Decode、MAX7219_NoDecode
        MAX7219_InitStructure.Intensity                =0x02;                                                //显示亮度:0x00~0xff
        MAX7219_InitStructure.ShutDown                =MAX7219_NormalOperation;        //是否休眠:MAX7219_ShutdownMode、MAX7219_NormalOperation
        MAX7219_InitStructure.DisplayTest        =MAX7219_TestModeDisp;                //是否测试显示:MAX7219_TestModeDisp、MAX7219_NormalOperationDisp
        //配置参数
        MAX7219_LOAD=0;        //拉低准备接收数据
        for(i=0;i<n;i++)        //初始化几个MAX7219芯片,做几次设置操作
                MAX7219_WriteAddrData (0x0b,MAX7219_InitStructure.ScanLimit);// 设置扫描界限
    MAX7219_LOAD=1;                                                        //LOAD上升沿锁存数据
        for(i=0;i<8;i++);//短延时
        MAX7219_LOAD=0;
        for(i=0;i<n;i++)        //初始化几个MAX7219芯片,做几次设置操作
                MAX7219_WriteAddrData (0x09,MAX7219_InitStructure.DecodeMode);                // 设置译码模式
    MAX7219_LOAD=1;                                                                        //LOAD上升沿锁存数据
        for(i=0;i<8;i++);//短延时
        MAX7219_LOAD=0;
        for(i=0;i<n;i++)        //初始化几个MAX7219芯片,做几次设置操作
                MAX7219_WriteAddrData (0x0a,MAX7219_InitStructure.Intensity);        // 设置亮度
    MAX7219_LOAD=1;                                                                                //LOAD上升沿锁存数据
        for(i=0;i<8;i++);//短延时
        MAX7219_LOAD=0;
        for(i=0;i<n;i++)        //初始化几个MAX7219芯片,做几次设置操作
                MAX7219_WriteAddrData (0x0c,MAX7219_InitStructure.ShutDown);        // 设置为正常工作模式
    MAX7219_LOAD=1;                                                                                //LOAD上升沿锁存数据

        #if MAX7219_TestModeDisp_EN        //判断是否需要编译以下测试命令
        if( MAX7219_InitStructure.DisplayTest == MAX7219_TestModeDisp )                        //若测试显示,测试显示~正常显示,中间应间隔一定时间,否则无法看到效果
        {        for(i=0;i<8;i++);//短延时        
                MAX7219_LOAD=0;
                for(i=0;i<n;i++)        //初始化几个MAX7219芯片,做几次设置操作
                        MAX7219_WriteAddrData(0x0f,MAX7219_TestModeDisp);        // 开始显示测试,点亮所有LED
                MAX7219_LOAD=1;
                MAX7219_TestModeDisp_Cnt=0;        //延时计数清零
                while( MAX7219_TestModeDisp_Cnt < MAX7219_DelayTimOut );        //判断是否超时,
                        //注意:MAX7219_TestModeDisp_Cnt必须放入某计时器中累加计数,否则将导致程序无法向下进行;
                MAX7219_LOAD=0;
                for(i=0;i<n;i++)        //初始化几个MAX7219芯片,做几次设置操作
                        MAX7219_WriteAddrData (0x0f,MAX7219_NormalOperationDisp);        // 退出显示测试模式
                MAX7219_LOAD=1;
        }
        #endif
}
/*****************************************************************
数码管显示函数
函数说明:选择序号n组的8位数码管显示指针p指向的数组(数组长度为8字节)。
输入参数:        n---数码管的组序号(从0开始)
                        *p--指向要显示的8位字节数组,译码方式显示时,
                        某位置显示小数点时,应将相应bit7写1
返回值:        无
*****************************************************************/

void MAX7219_Disp(u8 n,u8 *p)
{
        xdata_u8 i,j;
        for(i=1;i<9;i++)                                                //依次将8位数据写入缓存器
        {
                MAX7219_LOAD=0;                                                //拉低准备接收数据
                MAX7219_WriteAddrData(i,p[i-1]);
                for(j=0;j<n;j++)                                        //要将8位数据显示到第几号芯片数码管,则做几次空写字操作(序号从0开始)。
                {
                        MAX7219_CLK=0;
                        MAX7219_WriteAddrData (0,0);
                }
                MAX7219_LOAD=1;                                                //上升沿保存数据
        }
}

#endif

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表