近几天重新写了一个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, 下载次数: 95)
|