MAX7221驱动数码管

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

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值