找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2602|回復: 0
收起左側

51單片機+max7219數(shù)碼管驅動程序庫函數(shù)

[復制鏈接]
ID:691723 發(fā)表于 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函數(shù)中調用初始化函數(shù)void MAX7219_Init(u8 n)然后直接使用顯示函數(shù)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;                    // 串行數(shù)據(jù)輸入
sbit MAX7219_CLK        = P0^4;                    // 串行時鐘
sbit MAX7219_LOAD        = P0^5;                   // 顯示數(shù)據(jù)鎖存控制


/*****************************************************************
預定義
*****************************************************************/
//#define NoOp   0x00             // 空操作寄存器
/*
#define Digit0 0x01             // 數(shù)碼管1寄存器
#define Digit1 0x02             // 數(shù)碼管2寄存器
#define Digit2 0x03             // 數(shù)碼管3寄存器
#define Digit3 0x04             // 數(shù)碼管4寄存器
#define Digit4 0x05             // 數(shù)碼管5寄存器
#define Digit5 0x06             // 數(shù)碼管6寄存器
#define Digit6 0x07             // 數(shù)碼管7寄存器
#define Digit7 0x08             // 數(shù)碼管8寄存器
*/
//#define DecodeMode        0x09         // 譯碼模式寄存器
//#define Intensity                0x0a         // 亮度寄存器
//#define ScanLimit                0x0b         // 掃描位數(shù)寄存器
//#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;顯示數(shù)碼管的位數(shù)
        u8        DecodeMode;                //取值:MAX7219_Decode,MAX7219_NoDecode:譯碼或不譯碼
        u8        Intensity;                //取值:0x00~0xff;亮度調節(jié)值
        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;        //測試模式計數(shù)變量,只有允許編譯測試模式時,
                                                                                                //此變量定義才有效,且必須放入某計數(shù)器中;
#endif

MAX7219_EXT void MAX7219_Init(u8 n);                //MAX7219初始化函數(shù)
MAX7219_EXT void MAX7219_Disp(u8 n,u8 *p);        //MAX7219顯示數(shù)碼管函數(shù)

#endif
#endif


以下為max7219.c文件內容:

#define _MAX7219_C_

#include "all.h"        //單片機頭文件已放置此頭文件中

#if MAX7219_EN

void MAX7219_WriteByte(u8 ch);                                        //寫字節(jié)函數(shù)(SPI方式)
void MAX7219_WriteAddrData(u8 addr,u8 num);                //寫地址和字節(jié)函數(shù)

/*****************************************************************
向MAX7219寫入字節(jié)函數(shù)
函數(shù)說明:
輸入?yún)?shù):        ch---即將寫入的字節(jié)數(shù)據(jù)
返回值:        無
*****************************************************************/
void MAX7219_WriteByte(u8 ch)
{
        xdata_u8 i;
    for (i=0;i<8;i++)        //MSB開始的發(fā)送字節(jié)
    {        MAX7219_CLK=0;
                if( ch & (0x80>>i) ) MAX7219_DIN=1;
        else MAX7219_DIN=0;
                i+=1;i-=1;//延時等待端口輸出有效
                MAX7219_CLK=1;        //時鐘上升沿有效
        }
}
/*****************************************************************
向MAX7219寫入字(16位)函數(shù)
函數(shù)說明:
輸入?yún)?shù):        addr---地址
                        num----數(shù)據(jù)
返回值:        無
*****************************************************************/

void MAX7219_WriteAddrData(u8 addr,u8 num)
{
        MAX7219_LOAD=0;
    MAX7219_WriteByte(addr);
    MAX7219_WriteByte(num);
    MAX7219_LOAD=1;                        //LOAD上升沿鎖存數(shù)據(jù)
}

/*****************************************************************
MAX7219初始化函數(shù)
函數(shù)說明:        初始化MAX7219芯片,MAX7219芯片按照順序級聯(lián),
                        測試模式顯示寄存器沒有配置,若希望配置,應在max7219.h中將MAX7219_TestModeDisp_EN預定義為1,
                        并注意配置測試模式顯示的時間,
                        若時間太短,將較難看到顯示效果。
輸入?yún)?shù):        n-----初始化芯片個數(shù)(n>=1,注意:第1個為第0號芯片,顯示函數(shù)中有具體描述;
                        使用本函數(shù)前,以下變量應賦值:
                        MAX7219_InitStructure.ScanLimit                ----顯示位數(shù)
                        MAX7219_InitStructure.DecodeMode        ----譯碼模式
                        MAX7219_InitStructure.Intensity                ----顯示亮度
                        MAX7219_InitStructure.ShutDown                ----是否休眠
                        MAX7219_InitStructure.DisplayTest        ----不做測試模式顯示時,無需賦值
返回值:        無
*****************************************************************/

void MAX7219_Init(u8 n)
{
        xdata_u8 i;
        //配置參數(shù)定義
        MAX7219_InitStructure.ScanLimit                =7;                                                        //顯示位數(shù):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
        //配置參數(shù)
        MAX7219_LOAD=0;        //拉低準備接收數(shù)據(jù)
        for(i=0;i<n;i++)        //初始化幾個MAX7219芯片,做幾次設置操作
                MAX7219_WriteAddrData (0x0b,MAX7219_InitStructure.ScanLimit);// 設置掃描界限
    MAX7219_LOAD=1;                                                        //LOAD上升沿鎖存數(shù)據(jù)
        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上升沿鎖存數(shù)據(jù)
        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上升沿鎖存數(shù)據(jù)
        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上升沿鎖存數(shù)據(jù)

        #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;        //延時計數(shù)清零
                while( MAX7219_TestModeDisp_Cnt < MAX7219_DelayTimOut );        //判斷是否超時,
                        //注意:MAX7219_TestModeDisp_Cnt必須放入某計時器中累加計數(shù),否則將導致程序無法向下進行;
                MAX7219_LOAD=0;
                for(i=0;i<n;i++)        //初始化幾個MAX7219芯片,做幾次設置操作
                        MAX7219_WriteAddrData (0x0f,MAX7219_NormalOperationDisp);        // 退出顯示測試模式
                MAX7219_LOAD=1;
        }
        #endif
}
/*****************************************************************
數(shù)碼管顯示函數(shù)
函數(shù)說明:選擇序號n組的8位數(shù)碼管顯示指針p指向的數(shù)組(數(shù)組長度為8字節(jié))。
輸入?yún)?shù):        n---數(shù)碼管的組序號(從0開始)
                        *p--指向要顯示的8位字節(jié)數(shù)組,譯碼方式顯示時,
                        某位置顯示小數(shù)點時,應將相應bit7寫1
返回值:        無
*****************************************************************/

void MAX7219_Disp(u8 n,u8 *p)
{
        xdata_u8 i,j;
        for(i=1;i<9;i++)                                                //依次將8位數(shù)據(jù)寫入緩存器
        {
                MAX7219_LOAD=0;                                                //拉低準備接收數(shù)據(jù)
                MAX7219_WriteAddrData(i,p[i-1]);
                for(j=0;j<n;j++)                                        //要將8位數(shù)據(jù)顯示到第幾號芯片數(shù)碼管,則做幾次空寫字操作(序號從0開始)。
                {
                        MAX7219_CLK=0;
                        MAX7219_WriteAddrData (0,0);
                }
                MAX7219_LOAD=1;                                                //上升沿保存數(shù)據(jù)
        }
}

#endif

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表