久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2547|回復: 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 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品久久久久久 | 亚洲日本一区二区 | 一区二区不卡高清 | 亚洲在线免费观看 | 国产一区二区在线看 | 伊人久麻豆社区 | 精品99久久久久久 | 久久国 | 99精品视频免费观看 | 久久久精彩视频 | 亚洲精品久久区二区三区蜜桃臀 | 最近日韩中文字幕 | 免费激情av | 一区二区三区视频在线观看 | 国产高清免费 | 成人精品一区亚洲午夜久久久 | 欧美性a视频 | 成人精品一区二区三区 | 我爱操| 精品久久一区 | 欧美久久久久久久久 | 亚洲免费在线视频 | 亚洲一区二区国产 | 毛片韩国 | 欧美性受xxx | 亚洲一区久久 | 精品久久久一区二区 | 国产精品国产a | 91丨国产 | 国产精品成人一区二区三区吃奶 | 韩日一区二区 | 精品美女在线观看 | 国产视频一区在线观看 | 亚洲夜射 | 成人午夜激情 | 国产午夜精品一区二区三区 | 在线观看视频一区 | 欧美日韩一区在线 | 成年人网站在线观看视频 | 狠狠干美女 | 欧美国产亚洲一区二区 |