找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3749|回复: 1
打印 上一主题 下一主题
收起左侧

MAX7219多片级联单片机驱动程序

[复制链接]
跳转到指定楼层
楼主
近几天重新写了一个MAX7219的驱动程序,程序中提供了几个较简单的接口,但却非常实用;相比之前我刚入门时的驱动程序更为完善!由于手里只有一片STC15W408AS单片机,硬件资源实在太差,就没有写那些花里胡哨的接口了,也没有扩展到大屏或者显示汉字。

计时器的显示效果


代码测试如下:
如果觉得还行,可以下载附件使用!!!

#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片级联的 MAX7219

   /*! 注意: 8bit数据类型格式控制符为%bd,而不是%d,
   或者将传入变长参数强制为int型,
   这样你还可以继续使用%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数字字符测试
   Max7219_disp_3x5MultiNum(0,2,"12345678");
   Max7219_disp_refresh();
   delayms(2000);

   Max7219_set_char_interval(3); //字符显示间隙测试
   Max7219_GRAM_clear(); //3X5数字字符测试
   Max7219_disp_3x5MultiNum(0,2,"12345678");
   Max7219_disp_refresh();
   delayms(2000);
   Max7219_set_char_interval(1); //字符显示间隙测试
   //注意:多字号混合显示不适用

   Max7219_GRAM_clear(); //4X8数字字符测试
   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 //数据端口
#define  MAX7219_LOAD  P12 //锁存端口
#define  MAX7219_CLK   P11 //时钟端口

#define  MAX_WIDTH     16  //屏幕最大宽度[这里指级联数]

// MAX7219 Register Address Map
// BCD译码方式编码:0x00-0x0F 对应[0-9,-,E,H,L,P,off]
#define  MAX_NOP                                       0x00 //空操作
#define  MAX_DIG0                                      0X01 //数码管位0
#define  MAX_DIG1                                      0X02 //数码管位1
#define  MAX_DIG2                                      0X03 //数码管位2
#define  MAX_DIG3                                      0X04 //数码管位3
#define  MAX_DIG4                                      0X05 //数码管位4
#define  MAX_DIG5                                      0X06 //数码管位5
#define  MAX_DIG6                                      0X07 //数码管位6
#define  MAX_DIG7                                      0X08 //数码管位7
#define  MAX_DECODE_MODE      0X09 //译码模式 0为不译码,可将对应位设置为BCD译码显示
#define  MAX_INTENSITY        0X0A //显示亮度 0-15共16级
#define  MAX_SCAN_LIMIT       0X0B //扫描界限 0-7 即为数码管总位数-1
#define  MAX_SHUTDOWN         0X0C //掉电模式 0为掉电,1为正常工作
#define  MAX_DISP_TEST        0X0F //显示测试 0为正常,1为测试(所有数码管完全点亮)


extern void Max7219_Init( uint8_t max7219_num );   //初始化 MAX7219
extern void Max7219_write_byte(uint8_t byte);      //写一字节数据
extern void Max7219_write_enable(void);            //锁存显示数据
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);  //设置掉电模式

/*! 以下显示操作,凡是写入到显存的都必须执行刷新才会更新显示屏内容 */
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的数字到显存
extern void Max7219_disp_4x8MultiNum( int x,int y,char *str); //写多个4X8的数字到显存
extern void Max7219_disp_3x5num( int x,int y,char chr); //写一个3X5的数字到显存
extern void Max7219_disp_3x5MultiNum( int x,int y,char *str); //写多个3X5的数字到显存
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, 下载次数: 91)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1002348 发表于 2022-4-6 17:16 | 只看该作者
谢谢分享,在STC8G1k08中,试了很好用!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表