在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 |