📄 max7219.c
字号:
///////////////////////////////////////
//7290函数包
//////////////////////////////////////
#include <REG52.H>
#include "intrins.h"
#include "Max7219.h"
#define MAX7219_ADDR_NULL 0x0000
#define MAX7219_ADDR_DIG0 0x0100
#define MAX7219_ADDR_DIG1 0x0200
#define MAX7219_ADDR_DIG2 0x0300
#define MAX7219_ADDR_DIG3 0x0400
#define MAX7219_ADDR_DIG4 0x0500
#define MAX7219_ADDR_DIG5 0x0600
#define MAX7219_ADDR_DIG6 0x0700
#define MAX7219_ADDR_DIG7 0x0800
#define MAX7219_ADDR_DECODEMODE 0x0900 //译码模式
#define MAX7219_ADDR_INTENSITY 0x0a00 //亮度
#define MAX7219_ADDR_SCANLIMIT 0x0b00 //扫描个数
#define MAX7219_ADDR_SHUTDOWN 0x0c00 //关闭运行模式
#define MAX7219_ADDR_DISTEST 0x0f00 //测试
#define NULL 0x0000
#define SHUTDOWN 0x0
#define NORMAL_OP 0x1
#define DECODE_NONE 0x0
#define DECODE_CODEB 0x0ff
//闪烁控制变量
bit BlinkEn=0;
unsigned char BlinkLoc;
unsigned char BlinkNum;
unsigned char BlinkStatus;
bit BlinkLogic=0;
//不编码模式下的转换表
unsigned char code SegTable[]={ 0x7e ,//0
0x30 ,//1
0x6d ,//2
0x79 ,//3
0x33 ,//4
0x5b ,//5
0x5f ,//6
0x70 ,//7
0x7f ,//8
0x7b ,//9
0x00 ,//a --NO USE
0x00 ,//b --NO USE
0x00 ,//c --NO USE
0x00 ,//d --NO USE
0x00 ,//e --NO USE
0x00 //f --NULL(全不显示)
};
/////////////////////////////////////////////////////////////////////////////////////////
//底层读写驱动部分
////////////////////////////////////////////////////////////////////////////////////////
//一个MAX7219
void MAX7219_SendData(unsigned int datA)
{
unsigned char i;
EA=0; //发送数据时关闭中断
MAX7219_LD=0;
//发送到A
for(i=0;i<16;i++)
{
//高位先发送,低位后发送
MAX7219_CLK=0;
if((datA&0x8000)==0x8000)
MAX7219_DIN=1;
else
MAX7219_DIN=0;
MAX7219_CLK=1;
datA=datA<<1;
}
MAX7219_LD=1;
EA=1;
}
/////////////////////////////////////////////////////////////////////////////////////////
//上层应用部分
////////////////////////////////////////////////////////////////////////////////////////
//Max7219的初始化
void MAX7219_Init(void)
{
//8个数码管,采用不编码模式
MAX7219_SendData(MAX7219_ADDR_SHUTDOWN|NORMAL_OP); //设置正常工作模式:
MAX7219_SendData(MAX7219_ADDR_DISTEST); //设置正常工作模式:
MAX7219_SendData(MAX7219_ADDR_DECODEMODE|DECODE_NONE); //设置编码方式:采用不编码模式,
MAX7219_SendData(MAX7219_ADDR_SCANLIMIT|0x07); //设置扫描位数:8,6,8
MAX7219_SendData(MAX7219_ADDR_INTENSITY|0x07); //设置亮度:
}
//单个显示
//locA:1.2.3.4.5.6.7.8
//locB:1.2.3.4.5.6
//locC:1.2.3.4.5.6.7.8
//num:0-9,f
//d:1DOT 点亮 f: x:1不显示
void MAX7219_Print1(unsigned char loc,unsigned char num,unsigned char dfx)
{
unsigned char d,f,x;
unsigned int sendd,sendd_back;
unsigned int locaddr;
locaddr=((unsigned int)loc&0x000f)<<8;
d=(dfx&0x04)>>2; //dot
f=(dfx&0x02)>>1; //闪烁(用定时器实现该功能)
x=dfx&0x01; //x=1,不显示
if(x==1)
sendd=locaddr|SegTable[0x0f]; //不显示
else
{
if(d==1) //显示DOT
sendd=locaddr|SegTable[num]|0x80; //显示DOT
else
sendd=locaddr|SegTable[num]; //不显示DOT
}
//专门添加的闪烁功能
if(BlinkEn==1)
{
// BlinkLoc=NULL; //没有闪烁
if(f==1)
{
//闪烁前把前一个闪烁过的点亮先
// MAX7219_Print1(BlinkLoc,BlinkNum,BlinkStatus&0x05);
{
if((BlinkStatus&0x04)==0x04) //显示DOT
sendd_back=((unsigned int)BlinkLoc&0x000f)<<8|SegTable[BlinkNum]|0x80; //显示DOT
else
sendd_back=((unsigned int)BlinkLoc&0x000f)<<8|SegTable[BlinkNum]; //不显示DOT
if((BlinkLoc&0x0f0)==0x0A0) //显示A
{
MAX7219_SendData(sendd_back);
}
}
BlinkLoc=loc;
BlinkNum=num;
BlinkStatus=dfx;
if(BlinkLogic==0) //不显示
{
sendd=locaddr|SegTable[0x0f];
BlinkLogic=1;
}
else //显示
{
BlinkLogic=0;
}
}
}
//
if((loc&0x0f0)==0x0A0) //显示A
{
MAX7219_SendData(sendd);
}
}
////////////////////////////////////////////////////////////
//end of file.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -