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

📄 zlg7289.c

📁 八位数码管共阴极显示电路以及六位二进制数的输出
💻 C
字号:
/*
ZLG7289Demo2.c
ZLG7289 演示程序
说明:
采用中断方式读取按键值
*/

#include "ZLG7289.h"


//定义全局变量Key,用来保存按键值
unsigned char	Key = 0xFF; //0xFF 表示未按键的状态
//定义全局变量Keysetflag,指示进入设置状态;
unsigned char	Keysetflag=0; //1:进入设置状态;
//定义全局变量KeyCounter,指示角度计数值(输出的二进制数值);
unsigned char	AngleCounter=0; //在 Keysetflag=1 后,“+ ”“—” 键改变他的值;
//定义全局变量,该变量在调用函数ZLG7289_Init()时被初始化
unsigned char data ZLG7289_Delay_t;



 /************************************************************
**函数:ZLG7289_ShortDelay()
**功能:短延时
**说明:延时(t*2+2)个机器周期
************************************************************/
void ZLG7289_ShortDelay() 
{  
	unsigned char t = ZLG7289_Delay_t; 
	while ( --t != 0 ); 

}

/************************************************************
**函数:ZLG7289_LongDelay()
**功能:长延时
**说明:延时(t*12+8)个机器周期
************************************************************/
void ZLG7289_LongDelay() 
{
	unsigned char t = ZLG7289_Delay_t * 6;
	while ( --t != 0 );
}



/************************************************************
*函数:ZLG7289_SPI_Write()
*功能:向SPI 总线写入1 个字节的数据,高位在前
*参数:dat:要写入的数据
************************************************************/
void ZLG7289_SPI_Write(char dat) reentrant
{
	unsigned char t = 8;

	do
	{
		ZLG7289_pinDATA = (bit)(dat & 0x80);
		dat <<= 1;
		ZLG7289_pinCLK = 1;
		ZLG7289_ShortDelay();
		ZLG7289_pinCLK = 0;
		ZLG7289_ShortDelay();
	} while ( --t != 0 );
}


/*************************************************************
*函数:ZLG7289_SPI_Read()
*功能:从SPI 总线读取1 个字节的数据
*返回:读取到的数据
*************************************************************/
char ZLG7289_SPI_Read() reentrant
{
	char dat;
	unsigned char t = 8;
	ZLG7289_pinDATA = 1; 		//读取数据之前DATA引脚要置1 以切换到输入状态
	ZLG7289_LongDelay();

	do
	{
		ZLG7289_pinCLK = 1;
		ZLG7289_ShortDelay();
		dat <<= 1;
		if ( ZLG7289_pinDATA ) dat++;
		ZLG7289_pinCLK = 0;
		ZLG7289_LongDelay();
	} while ( --t != 0 );
	
	ZLG7289_pinDATA = 0; 
	return dat;
}


/*************************************************************
函数:ZLG7289_cmd()
功能:执行ZLG7289 纯指令
参数: cmd:命令字
*************************************************************/
void ZLG7289_cmd(char cmd)
{
//	char sav = IE;
//	IE &= 0xFA; 		//关闭外部中断1111 1010  屏蔽外部中断1和0
	ZLG7289_pinCS = 0;
	ZLG7289_LongDelay();
	ZLG7289_SPI_Write(cmd);
	ZLG7289_pinCS = 1;
	ZLG7289_LongDelay();
//	IE = sav; 			//恢复IE
}

/**************************************************************
函数:ZLG7289_cmd_dat()
功能:执行ZLG7289 带数据指令
参数:cmd:命令字 	dat:数据
**************************************************************/
void ZLG7289_cmd_dat(char cmd, char dat)
{
//	char sav = IE;
//	IE &= 0xFA; 			//关闭外部中断
	ZLG7289_pinCS = 0;
	ZLG7289_LongDelay();
	ZLG7289_SPI_Write(cmd);
	ZLG7289_LongDelay();
	ZLG7289_LongDelay();
	ZLG7289_SPI_Write(dat);
	ZLG7289_pinCS = 1;
	ZLG7289_LongDelay();
//	IE = sav; 				//恢复IE
}

/*************************************************************
函数:ZLG7289_Download()
功能:下载数据
参数:
	mod=0:下载数据且按方式0 译码
	mod=1:下载数据且按方式1 译码
	mod=2:下载数据但不译码
	x:数码管编号(横坐标),取值0~7
	dp=0:小数点不亮
	dp=1:小数点亮
	dat:要显示的数据
说明:译码方式的具体含义请参考数据手册
*************************************************************/
void ZLG7289_Download(unsigned char mod, unsigned char x, bit dp, unsigned char dat)
{
	code char ModDat[3] = {0x80,0xC8,0x90};  // 10000 0000    1100 1000  1001 0000,方式0译码 方式1  下载数据但不译码
	/*返回读到的按键值:0~63
	如果返回0xFF 则表示没有键按下
	*/
	char d1;
	char d2;
	if ( mod > 2 ) mod = 2;
	d1 = ModDat[mod];
	x &= 0x07;				//x=x&0x07;;0000 0111 
	d1 |= x;				// d1=d1 | x
	d2 = dat & 0x7F;
	if ( dp ) d2 |= 0x80;
	ZLG7289_cmd_dat(d1,d2);
}



/*************************************************************
函数:char ZLG7289_Key()
功能:读出键值;
参数:按键的值;
*************************************************************/
char ZLG7289_Key() reentrant
{
	char key;
	ZLG7289_pinCS = 0;
	ZLG7289_LongDelay();
	ZLG7289_SPI_Write(0x15);
	ZLG7289_LongDelay();
	key = ZLG7289_SPI_Read();
	ZLG7289_pinCS = 1;
	ZLG7289_LongDelay();
	return key;
}

/*************************************************************
函数:ZLG7289_Init()
功能:ZLG7289 初始化
参数:
	t:SPI 总线的延时值设置,取值1-40(超出范围可能导致错误)
	说明:
	t的取值可以参照以下公式:t >= 5 * f1 / f2,其中f1 表示80C51 的
	晶振频率,f2 表示ZLG7289 的晶振频率
*************************************************************/
void ZLG7289_Init(unsigned char t)
{
	unsigned char x;
	//I/O 口初始化
	ZLG7289_pinCS = 1;
	ZLG7289_pinCLK = 0;
	ZLG7289_pinDATA = 1;
	ZLG7289_pinKEY = 1;
	//延时初始化
	ZLG7289_Delay_t = t;
	ZLG7289_Reset();
	//点亮所有数码管0 0 0.0 0 0 
	//对于的是数码管5 4 3 2 1 0
	for ( x=0; x<6; x++ )
	{
		ZLG7289_Download(1,x,0,0);
	}
		ZLG7289_Download(1,3,1,0);
}


 /*************************************************************
函数:void main()
功能:
参数:
*************************************************************/
void main()
{
	unsigned char i,x;
	unsigned char key_back=0;
	unsigned long angle=0;
	unsigned char dat[6]={0};

	ZLG7289_Init(8);

	EA = 0;

	while(1)
	{
		if(ZLG7289_pinKEY==0)	   //键盘中断请求信号,低电平有效,判断是否有键按下.
		{
			
			Key = ZLG7289_Key();  

			switch(Key)
			{
				case K4_Rest:
				{
					P1&=0xc0;				//将IO输出全部清0;
					AngleCounter=0;			//清标志;
					ZLG7289_Reset();		//rest;
					//ZLG7289_Hide(0xf0);	//前2位消隐;
				   	/*******显示 000.000******/
					for ( x=0; x<6; x++ )
					{
						ZLG7289_Download(1,x,0,0);
					}
						ZLG7289_Download(1,3,1,0);
				}break;
				
				case K3_Set:
				{
					if(Keysetflag==0)
					{
						Keysetflag=1;			//进入设置状态;
						ZLG7289_Flash(0x00);	//闪烁;
					}
					else
					{
						Keysetflag=0;			
						ZLG7289_Flash(0xff);	
					} 
				}break;

				case K2_Up:
				{
					if(Keysetflag)
					{
						AngleCounter++;
						if(AngleCounter==64)
						{
							AngleCounter=0;
						}
						angle=0;
						angle=(unsigned long)AngleCounter*StepAngle;
					//	angle=123456;
						dat[0]=angle/100000;
						angle=angle%100000;			
						dat[1]=angle/10000;
						angle=angle%10000;
						dat[2]=angle/1000;
						angle=angle%1000;
						dat[3]=angle/100;
						angle=angle%100;
						dat[4]=angle/10;
						dat[5]=angle%10;
				
						/*******显示 xxx.xxx******/
						for(i=0;i<6;i++) 				//显示"xxxxxx"
						{
							ZLG7289_Download(1,i,0,dat[5-i]);
						}
						ZLG7289_Download(1,3,1,dat[2]);//显示 "."

						//*******IO输出******/
						P1&=0xc0;
						P1|=AngleCounter;
					}	 
				}break;

				case K1_Down:
				{
					if(Keysetflag)
					{
						if(AngleCounter==0)
						{
							AngleCounter=64;
						}
						AngleCounter--;
						angle=0;
						angle=(unsigned long)AngleCounter*StepAngle;
						dat[0]=(angle/100000)&0x03;
						angle=angle%100000;			
						dat[1]=angle/10000;
						angle=angle%10000;
						dat[2]=angle/1000;
						angle=angle%1000;
						dat[3]=angle/100;
						angle=angle%100;
						dat[4]=angle/10;
						dat[5]=angle%10;

						/*******显示 xxx.xxx******/
						for(i=0;i<6;i++) 				//显示"xxxxxx"
						{
							ZLG7289_Download(1,i,0,dat[5-i]);
							ZLG7289_LongDelay();	
						}
						ZLG7289_Download(1,3,1,dat[2]);//显示 "."

						//*******IO输出******/
						P1&=0xc0;
						P1|=AngleCounter;
					}
				}break;
				
				default:break;
			}

			while(!ZLG7289_pinKEY);
			}
		
		}	

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -