max7219.c
来自「51单片机开发与应用技术详解(珍藏版)PPT及源码」· C语言 代码 · 共 142 行
C
142 行
#include <reg51.h>
#define DECODE_REG 0x09 //译码方式寄存器
#define INTENSITY_REG 0x0a //亮度寄存器
#define SCANLIMIT_REG 0x0b //扫描界限寄存器
#define SHUTDOWN_REG 0x0c //停机寄存器
#define DISPLAYTEST_REG 0x0f //显示测试寄存器
#define MIN 0x00 //最小显示亮度
#define MAX 0x0f //最大显示亮度
sbit DATA=P2^0; //DATA接口
sbit CLK=P2^1; //CLK接口
sbit LOAD=P2^2; //LOAD接口
static const struct
{
char ascii;
char segs;
} Font[] = //定义并初始化显示数字和字符的段码数组
{
{' ', 0x00},{'0', 0x7e},{'1', 0x30},{'2', 0x6d},{'3', 0x79},{'4', 0x33},
{'5', 0x5b},{'6', 0x5f},{'7', 0x70},{'8', 0x7f},{'9', 0x7b},{'A', 0x77},
{'B', 0x1f},{'C', 0x4e},{'D', 0x3d},{'E', 0x4f},{'F', 0x47},{'H',0x37},
{'L',0x0e}, {'O',0x7e},{'\0', 0x00}
};
///////////////////////////////////////////////
static void SendByte (unsigned char dataout)
{
char i;
for (i=8; i>0; i--) //循环发送
{
unsigned char mask = 1 << (i - 1);
CLK=0; //CLK变低电平
if (dataout & mask) //发送一位数据
DATA=1;
else
DATA=0;
CLK=1; //CLK变高电平
}
}
static void WriteMAX7219 (unsigned char reg_number, unsigned char dataout)
{
LOAD=1; //置LOAD为高电平,用于启动串行数据发送
SendByte(reg_number); //发送内部寄存器地址
SendByte(dataout); //发送数据
LOAD=0; //置LOAD为低电平,锁存数据
LOAD=1; //置LOAD为高电平,结束串行数据
}
void OpenShutdown (void)
{
WriteMAX7219(SHUTDOWN_REG, 0); //写停机寄存器
}
void StopShutdown (void)
{
WriteMAX7219(SHUTDOWN_REG, 1); //写停机寄存器
}
void OpenLEDTest (void)
{
WriteMAX7219(DISPLAYTEST_REG, 1); //写显示测试寄存器
}
void StopLEDTest (void)
{
WriteMAX7219(DISPLAYTEST_REG, 0); //写显示测试寄存器
}
void SetLevel (char ch)
{
ch &= 0x0f; //屏蔽参数中的多余位
WriteMAX7219(INTENSITY_REG, ch); //写亮度寄存器
}
void ClearLED (void)
{
char i;
for (i=1; i <= 8; i++) //循环
WriteMAX7219(i, 0x00); //写数字寄存器,关闭全部数码管
}
static unsigned char FindCode (char character)
{
char i;
for (i = 0; Font[i].ascii; i++) //循环查表
if (character == Font[i].ascii)
return Font[i].segs; //返回对应的显示段码
return 0; //未找到,返回0
}
void LEDDisplay (char digit, char character)
{
WriteMAX7219(digit, FindCode(character)); //写数字寄存器
}
void main(void)
{
//初始化MAX7219
DATA=1;LOAD=1;CLK=1;
WriteMAX7219(SCANLIMIT_REG, 7); //扫描8位数字
WriteMAX7219(DECODE_REG, 0x00); //设置不译码方式
StopShutdown(); //结束停机方式,正常工作
StopLEDTest(); //结束显示测试,正常工作
ClearLED(); //清零全部显示器
SetLevel(MAX/2); //设置一半的亮度
OpenLEDTest (); //显示测试
StopLEDTest (); //结束显示测试
LEDDisplay (0x01, '0'); //第1位LED显示0
LEDDisplay (0x02, '1'); //第2位LED显示1
LEDDisplay (0x03, '2'); //第3位LED显示2
LEDDisplay (0x04, '3'); //第4位LED显示3
LEDDisplay (0x05, '4'); //第5位LED显示4
LEDDisplay (0x06, '5'); //第6位LED显示5
LEDDisplay (0x07, '6'); //第7位LED显示6
LEDDisplay (0x08, '7'); //第8位LED显示7
ClearLED (); //关闭全部LED显示器
LEDDisplay (0x01, 'A'); //第1位LED显示A
LEDDisplay (0x02, 'B'); //第2位LED显示B
LEDDisplay (0x03, 'C'); //第3位LED显示C
LEDDisplay (0x04, 'D'); //第4位LED显示D
LEDDisplay (0x05, 'E'); //第5位LED显示E
LEDDisplay (0x06, 'F'); //第6位LED显示F
LEDDisplay (0x07, 'H'); //第7位LED显示H
LEDDisplay (0x08, 'L'); //第8位LED显示L
OpenShutdown (); //停机
StopShutdown (); //结束停机
while(1) //主循环
{
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?