03、单片机MAX7219级联教程,附驱动源码

51或者STM32开发中,我们在很多时候都会使用到数码管,数码管的刷新会占用很大的时间资源,少数的数码管不影响系统的运行,但如果数码管过多,刷新这一工作势必会影响系统的运行,下面来介绍一种芯片方案,单片机只需向芯片写入要显示的数字即可,不需要CPU自己来做动态刷新的工作。

原理图

#include <reg52.h>
#include <intrins.h>
#define u8 unsigned char
#define uint unsigned int
sbit DIN = P2^0;
sbit LOAD = P2^1;
sbit CLK = P2^2;
u8 Disp_Buffer[8]={2,0,0,9,10,8,10,9};
//软件延时函数,延时 xms
void DelayMS(uint x)
{
	u8 t;
	while(x--)
	{
		for(t=120;t>0;t--);
	}
} 
/向第 Num_Addr 片 7219 的 Addr 寄存器写入一个 Dat 数据
//Num_Addr:7219 地址(0~255)
//Addr:7219 数显寄存器地址(1~8)
//Dat:要显示的数据(0~15)(含字母)
void Write(u8 Num_Addr,u8 Addr,u8 Dat)
{
	u8 i,j;
	LOAD = 0;
	for(i=0;i<8;i++)
	{
		CLK = 0;
		if(Addr&0x80)
		DIN=1;
		else
		DIN=0;
		Addr <<= 1;
		CLK = 1;
		_nop_();
		_nop_();
		CLK = 0;
	} 
	for(i=0;i<8;i++)
	{
		CLK = 0;
		if(Dat&0x80)
		DIN=1;
		else
		DIN=0;
		Dat <<= 1;
		CLK = 1;
		_nop_();
		_nop_();
		CLK = 0;
	} 
	for(i=0;i<Num_Addr;i++)
	{
		for(j=0;j<16;j++)
		{
			CLK = 0;
			DIN = 0;
			CLK = 1;
			_nop_();
			_nop_();
			CLK = 0;
		}
	}
	 LOAD = 1;
} 
void Initialise7219()//初始化
{
	//第 0 个 7219 初始化
	Write(0x00,0x09,0xff); //编码模式
	Write(0x00,0x0b,0x07); //全部扫描
	Write(0x00,0x0c,0x01); //正常模式:1,掉电模式:0
	Write(0x00,0x0a,0x07); //消隐时间设为 T/2
	//第 1 个 7219 初始化
	Write(0x01,0x09,0xff); //编码模式
	Write(0x01,0x0b,0x07); //全部扫描
	Write(0x01,0x0c,0x01); //正常模式
	Write(0x01,0x0a,0x07); //消隐时间设为 T/2
}
void main()
{
	u8 i;
	Initialise7219();
	DelayMS(1);
	for(i=0;i<8;i++)
	{
		Write(0x00,i+1,Disp_Buffer[i]);
	} 
	Write(0x01,1,Disp_Buffer[0]);
	Write(0x01,2,11);
	Write(0x01,3,12);
	Write(0x01,4,13);
	Write(0x01,5,14);
	while(1);
} 
/*大学生单片机交流 QQ 群>>677033632*/

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/BaoTTing/article/details/103953502
今日推荐