MAX7219寄存器
调用寄存器地址时
write_data(0x09,0xff); //解码模式选择 8个位分别控制8个LED是否解码,'1’为BCD解码,'0’为不解码
write_data(0x0a,0x07); //初始亮度设置 0-15设置1-16档亮度
write_data(0x0b,0x07); //扫描方式选择 0-7 设置扫描1-8个LED(通俗就是控制数码管的位)
write_data(0x0c,0x01); //工作模式选择 1:正常工作 0:掉电模式(开关)
write_data(0x0f,0x00); //测试模式开关 1:测试模式 0:正常工作
一 译码方式
- 译码方式有BCD译码和不译码两种方式
- 8个LED的译码方式由译码模式寄存器(09H) 8个位是高电平还是低电平决定
BCD译码表
不译码方式
二 亮度设置
-
亮度有16档,由0AH低4位D3~D0的16个值来设置
-
MAX7219最低亮度是1/32,而MAX7221是1/16,但两者的档位间隔都是1/16
三 扫描界限
- MAX7219 可以选择扫描的LED个数,由0BH低3位的D2~D0的8个值来设置
四 掉电模式
- 0为掉电模式;1为运行模式;
五 显示检测
- 当0FH的最低位 D0 为高电平时进入显示测试模式,所有LED以最大亮度(31/32)显示。停机模式下不影响进入显示测试模式,因此可以用停机模式和显示测试来制作闪烁效果。
六 仿真
七 代码
#include <reg51.h>
#include <intrins.h>
sbit DIN = P2^0; //数据串出引脚
sbit CS = P2^1; //片选端
sbit CLK = P2^2; //移位时钟端
unsigned char disp_buff[10] = {0,1,2,3,4,5,6,7,8,9};//显示的数字,数值为10的时候,显示“-”
// 延时函数
void delayms(unsigned int x)
{
unsigned char i;
while(x--)
{
for(i = 0;i < 120;i++);
}
}
void write_data(unsigned char addr,unsigned char dat)
{
unsigned char i;
CS = 0; // 拉低CS选中芯片 先写地址,片选置低,串行数据加载到移位寄存器
for(i = 0;i < 8;i++) //传输地址
{
CLK = 0; //时钟上升沿数据移入内部移位寄存器
addr <<= 1; //待发送的地址,每次左移一次,高位在前发送,
DIN = CY; //数据移位后,如果有溢出,则可以从进位位CY中获得溢出的数据位
CLK = 1; // 拉高时钟线,写入数据
_nop_(); //延迟1Us
_nop_();
CLK = 0; //下降沿时数据从DOUT移出
}
for(i = 0;i < 8;i++) // 传输数据
{
CLK = 0;
dat <<= 1; //发送数据
DIN = CY;
CLK = 1;
_nop_();
_nop_();
CLK = 0;
}
CS = 1; //CS上升沿,数据锁存
}
//初始化函数
void init_max7221(void)
{
write_data(0x09,0xff); //解码模式选择 8个位分别控制8个LED是否解码,'1'为BCD解码,'0'为不解码
write_data(0x0a,0x07); //初始亮度设置 0-15设置1-16档亮度
write_data(0x0b,0x07); //扫描方式选择 0-7 设置扫描1-8个LED(通俗就是控制数码管的位)
write_data(0x0c,0x01); //工作模式选择 1:正常工作 0:掉电模式(开关)
write_data(0x0f,0x00); //测试模式开关 1:测试模式 0:正常工作
}
void main(void)
{
unsigned char Sec_1=0,Sec_2=0,Sec_3=0,Sec_4=0,Sec_5=0,Sec_6=0,Sec_7=0,Sec_8=0;//对应位的数字
unsigned char i;//对位进行选择
unsigned long int Sum=87654321;//数码管显示的数据
init_max7221(); // 初始化
delayms(2);
while(1)
{
//数码管显示顺序:8 7 6 5 4 3 2 1
Sum-=10;
Sec_8 = Sum/10000000;
Sec_7 = Sum%10000000/1000000;
Sec_6 = Sum%1000000/100000;
Sec_5 = Sum%100000/10000;
Sec_4 = Sum%10000/1000;
Sec_3 = Sum%1000/100;
Sec_2 = Sum%100/10;
Sec_1 = Sum%10;
for(i = 0;i < 8;i++)
{
switch(i)
{
case 0:write_data(i+1,disp_buff[Sec_8]);break;
case 1:write_data(i+1,disp_buff[Sec_7]);break;
case 2:write_data(i+1,disp_buff[Sec_6]);break;
case 3:write_data(i+1,disp_buff[Sec_5]);break;
case 4:write_data(i+1,disp_buff[Sec_4]);break;
case 5:write_data(i+1,disp_buff[Sec_3]);break;
case 6:write_data(i+1,disp_buff[Sec_2]);break;
case 7:write_data(i+1,disp_buff[Sec_1]);break;
default:break;
}
}
i=0;
}
}
参考博客:https://blog.csdn.net/qq_39829913/article/details/104540105