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