找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4450|回復: 1
收起左側

MAX7219多片級聯(lián)單片機驅動程序

[復制鏈接]
ID:311310 發(fā)表于 2021-3-13 23:29 | 顯示全部樓層 |閱讀模式
近幾天重新寫了一個MAX7219的驅動程序,程序中提供了幾個較簡單的接口,但卻非常實用;相比之前我剛入門時的驅動程序更為完善!由于手里只有一片STC15W408AS單片機,硬件資源實在太差,就沒有寫那些花里胡哨的接口了,也沒有擴展到大屏或者顯示漢字。

計時器的顯示效果
IMG_20210313_231017.jpg

代碼測試如下:
如果覺得還行,可以下載附件使用。!

#include "stc15xx.h"
#include "max7219.h"
//#include "debug.h"
//#include "timer.h"

/*!-----------------------------------
* @file: main.c
* @author: Yuan Hua fei [MuYu QiuFeng]
* @date: 2021-03-08
------------------------------------*/
void delayms(unsigned int ms)//@24.000MHz
{
        unsigned char m= 0, n= 0;

  while(--ms)
  {
    for(m=0; m<24; m++)
    for(n=200; n>0; --n);
  }
}

int main( void )
{
   u8 m10sec=0,sec=00,min=30;
   char m;

   Max7219_Init(4);    // 初始化4片級聯(lián)的 MAX7219

   /*! 注意: 8bit數(shù)據(jù)類型格式控制符為%bd,而不是%d,
   或者將傳入變長參數(shù)強制為int型,
   這樣你還可以繼續(xù)使用%d,其余使用同printf(); */

   for(m=32;m>=0;m--)
   {
      Max7219_GRAM_clear(); //格式化打印到GRAM顯示
      Max7219_print(m,1,"Test!");
      Max7219_disp_refresh(); //不支持換行回車等非可視符號
      delayms(100);
   }
   delayms(3000);

   Max7219_GRAM_clear();
   Max7219_print(0,1,"%02bd:%02bd",min,sec);
   Max7219_disp_refresh(); //不支持換行回車等非可視符號
   delayms(2000);

   Max7219_write_config(MAX_DISP_TEST,1);
   delayms(2000);
   Max7219_write_config(MAX_DISP_TEST,0);

   Max7219_GRAM_clear(); //3X5數(shù)字字符測試
   Max7219_disp_3x5MultiNum(0,2,"12345678");
   Max7219_disp_refresh();
   delayms(2000);

   Max7219_set_char_interval(3); //字符顯示間隙測試
   Max7219_GRAM_clear(); //3X5數(shù)字字符測試
   Max7219_disp_3x5MultiNum(0,2,"12345678");
   Max7219_disp_refresh();
   delayms(2000);
   Max7219_set_char_interval(1); //字符顯示間隙測試
   //注意:多字號混合顯示不適用

   Max7219_GRAM_clear(); //4X8數(shù)字字符測試
   Max7219_disp_4x8MultiNum(0,0,"123456");
   Max7219_disp_refresh();
   delayms(2000);

   Max7219_GRAM_clear(); //5X7字符測試
   Max7219_disp_5x7str(0,1,"A234!");
   Max7219_disp_refresh();
   delayms(2000);

   Max7219_GRAM_clear(); //混合顯示測試
   Max7219_disp_3x5MultiNum(0,3,"12");
   Max7219_disp_4x8MultiNum(8,0,"34");
   Max7219_disp_5x7str(18,1,"56");
   Max7219_disp_refresh();
   delayms(2000);

   Max7219_GRAM_clear()
   Max7219_print(0,1,"STOP!");
   Max7219_disp_refresh();
   delayms(2000);

   Max7219_set_shutdown(0); //設置掉電模式測試
   delayms(2000);
   Max7219_set_shutdown(1);

   Max7219_set_bright(10); //設置顯示亮度
   delayms(2000);
   Max7219_set_bright(1);

   Max7219_GRAM_clear()
   Max7219_print(0,1,"Timer");
   Max7219_disp_refresh();
   delayms(5000);

   sec=0,min=0,m10sec=0;
   while(1)
   {
      Max7219_GRAM_clear();
      Max7219_disp_time(min,sec,m10sec); //顯示一個簡單的時間:時,分,秒
      Max7219_disp_refresh();
      delayms(10);
      m10sec++;
      if(m10sec >=100)
      {
         m10sec = 0;
         sec++;
         if(sec>=60)
         {
            sec = 0;
            min++;
            if(min>=100)
            {
               min = 0;
            }
         }
      }
   }        
}



#ifndef __MAX7219_H__
#define __MAX7219_H__

#include "stc15xx.h"

#ifndef uint8_t
        #define uint8_t    unsigned char
#endif
#ifndef uint16_t
        #define uint16_t   unsigned int
#endif
#ifndef uint32_t
        #define uint32_t   unsigned long
#endif

#define  MAX7219_DIN   P13 //數(shù)據(jù)端口
#define  MAX7219_LOAD  P12 //鎖存端口
#define  MAX7219_CLK   P11 //時鐘端口

#define  MAX_WIDTH     16  //屏幕最大寬度[這里指級聯(lián)數(shù)]

// MAX7219 Register Address Map
// BCD譯碼方式編碼:0x00-0x0F 對應[0-9,-,E,H,L,P,off]
#define  MAX_NOP                                       0x00 //空操作
#define  MAX_DIG0                                      0X01 //數(shù)碼管位0
#define  MAX_DIG1                                      0X02 //數(shù)碼管位1
#define  MAX_DIG2                                      0X03 //數(shù)碼管位2
#define  MAX_DIG3                                      0X04 //數(shù)碼管位3
#define  MAX_DIG4                                      0X05 //數(shù)碼管位4
#define  MAX_DIG5                                      0X06 //數(shù)碼管位5
#define  MAX_DIG6                                      0X07 //數(shù)碼管位6
#define  MAX_DIG7                                      0X08 //數(shù)碼管位7
#define  MAX_DECODE_MODE      0X09 //譯碼模式 0為不譯碼,可將對應位設置為BCD譯碼顯示
#define  MAX_INTENSITY        0X0A //顯示亮度 0-15共16級
#define  MAX_SCAN_LIMIT       0X0B //掃描界限 0-7 即為數(shù)碼管總位數(shù)-1
#define  MAX_SHUTDOWN         0X0C //掉電模式 0為掉電,1為正常工作
#define  MAX_DISP_TEST        0X0F //顯示測試 0為正常,1為測試(所有數(shù)碼管完全點亮)


extern void Max7219_Init( uint8_t max7219_num );   //初始化 MAX7219
extern void Max7219_write_byte(uint8_t byte);      //寫一字節(jié)數(shù)據(jù)
extern void Max7219_write_enable(void);            //鎖存顯示數(shù)據(jù)
extern void Max7219_write_config(uint8_t addr,uint8_t config); //寫寄存器
extern void Max7219_set_bright(uint8_t bright);    //設置顯示亮度
extern void Max7219_set_shutdown(uint8_t status);  //設置掉電模式

/*! 以下顯示操作,凡是寫入到顯存的都必須執(zhí)行刷新才會更新顯示屏內(nèi)容 */
extern void Max7219_draw_point( int x,int y );     //在顯存畫一個點
extern void Max7219_disp_refresh(void);            //刷新顯示
extern void Max7219_GRAM_clear(void);              //清顯存
extern void Max7219_disp_clear(void);              //清顯示
extern void Max7219_disp_5x7chr( int x,int y,char chr); //寫一個5X7的字符到顯存
extern void Max7219_disp_5x7str( int x,int y,char *str);//寫一個5X7的字符串到顯存
extern void Max7219_disp_4x8num( int x,int y,char chr); //寫一個4X8的數(shù)字到顯存
extern void Max7219_disp_4x8MultiNum( int x,int y,char *str); //寫多個4X8的數(shù)字到顯存
extern void Max7219_disp_3x5num( int x,int y,char chr); //寫一個3X5的數(shù)字到顯存
extern void Max7219_disp_3x5MultiNum( int x,int y,char *str); //寫多個3X5的數(shù)字到顯存
extern void Max7219_set_char_interval( uint8_t interval); //設置字符顯示間隙
extern void Max7219_disp_time(uint8_t hour,uint8_t min,uint8_t sec); //顯示一個簡單的時間:時,分,秒
extern void Max7219_print(int x,int y,char* format, ...); //格式化打印信息到顯存
        
#endif


以上代碼51hei下載: MAX7219.zip (90.59 KB, 下載次數(shù): 95)

評分

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

查看全部評分

回復

使用道具 舉報

ID:1002348 發(fā)表于 2022-4-6 17:16 | 顯示全部樓層
謝謝分享,在STC8G1k08中,試了很好用!
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

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