⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 max7219.c

📁 18b20检测温度 及7219显示 按键检测程序 等实际应用程序
💻 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 + -