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

📄 hclcd.c

📁 at89s51实验例程代码
💻 C
📖 第 1 页 / 共 2 页
字号:
			j++;
			Nowcol++;
			k--;
		}
	}			
}
//6*12点阵的ASC码显示程序
void ASC12disp(Uchar Nowrow,Uchar Nowcol,Uchar ASCplace)
{
	Uchar i,tmp1,tmp2,k=6;
	Uint j;
	j = ASCplace*12;
	if((Nowrow%2)==0)			//
	{
		switch(Nowrow)
		{
			case 0: i=0;break;
			case 2: i=3;break;
			default: i=6;
		}
		while(k!=0)
		{
			if(Nowcol<0x40)
				{CS1=0;CS2=1;}
			else
			{	if(Nowcol<0x80)
				{CS1=1;CS2=0;}
				else
				{break;}
			}
			lcdwrite_cmd(i|0xb8);
			lcdwrite_cmd(Nowcol|0x40);
			lcdwrite_dat(ASC12[j]);
			lcd_busy();
			lcdwrite_cmd((i+1)|0xb8);	//到下一页
			lcdwrite_cmd(Nowcol|0x40);
			tmp1 = lcdread_dat();
			lcdwrite_cmd(Nowcol|0x40);
			lcdwrite_dat((ASC12[j+6]&0x0f)|(tmp1&0xf0));
			j++;
			Nowcol++;
			k--;
		}
	}
	else
	{
		switch(Nowrow)
		{
			case 1: i=1;break;
			default: i=4;
		}
		while(k!=0)
		{
			if(Nowcol<0x40)
			{CS1=0;CS2=1;}
			else
			{
				if(Nowcol<0x80)
				{CS1=1;CS2=0;}
				else
				{break;}
			}
			lcdwrite_cmd(i|0xb8);
			lcdwrite_cmd(Nowcol|0x40);
			tmp1=lcdread_dat();
			tmp1=tmp1&0x0f;
			tmp1=(ASC12[j]<<4)|tmp1;
			tmp2=(ASC12[j+6]<<4)|(ASC12[j]>>4);
			lcdwrite_cmd(Nowcol|0x40);
			lcdwrite_dat(tmp1);
			lcd_busy();
			lcdwrite_cmd((i+1)|0xb8);
			lcdwrite_cmd(Nowcol|0x40);
			lcdwrite_dat(tmp2);
			j++;
			Nowcol++;
			k--;
		}
	}			
}

		



//以动画的形式显示公司的标志,入口为在水平的第几个位置,现把它做,从32到1,由2张32X16的图组成
void flashlogo(Uchar Bmpcol)
{
	Uchar i,j,p;
//把当前要用的区间清空	
	CS1=0,CS2=1;
	lcdwrite_cmd(0xbe);
	lcdwrite_cmd(0x40);
	for(i=64;i>0;i--)
	{
		lcdwrite_dat(0x00);
		lcd_busy();
	}
	lcdwrite_cmd(0xbf);
	lcdwrite_cmd(0x40);
	for(i=64;i>0;i--)
	{
		lcdwrite_dat(0x00);
		lcd_busy();
	}
//开始写要设定的数据(左半边)	
	lcdwrite_cmd(0xbe);
	lcdwrite_cmd(0x40);
	j=Bmpcol;
	for(;j<=32;j++)
	{
		lcdwrite_dat(Bmp1zk[j-1]);
		lcd_busy();
	}
	lcdwrite_cmd(0xbf);
	lcdwrite_cmd(0x40);
	j=Bmpcol;
	for(;j<=32;j++)
	{
		lcdwrite_dat(Bmp1zk[j-1+32]);
		lcd_busy();
	}
//开始写要设定的数据(右半边)
	j=Bmpcol;
	lcdwrite_cmd(0xbe);
	lcdwrite_cmd((32+j-1)|0x40);
	p=0;
	for(;j<=32;j++)
	{
		lcdwrite_dat(Bmp2zk[p++]);
		lcd_busy();
	}
	j=Bmpcol;
	lcdwrite_cmd(0xbf);
	lcdwrite_cmd((32+j-1)|0x40);
	p=0;
	for(;j<=32;j++)
	{
		lcdwrite_dat(Bmp2zk[32+(p++)]);
		lcd_busy();
	}
}

//显示一幅128X64的图片,参数为图片在bmp12864放置的第几个图
void Disp128_64(Uchar BMPplace)
{
	Uchar	i,Nowcol,k;
	Uint	j;
	j=(BMPplace-1)*1024;	//计算出在图表格中的起始位置
	lcdclrall();
	for(i=0;i<8;i++)
	{	Nowcol=0x00;
		k=128;
		while(k!=0)
		{
			if(Nowcol<0x40)
			{CS1=0;CS2=1;}
			else
			{		if(Nowcol<0x80)
				{CS1=1;CS2=0;}
				else
				{break;}
			}
			lcdwrite_cmd(i|0xb8);
			lcdwrite_cmd(Nowcol|0x40);
			lcdwrite_dat(bmp12864[j]);
			lcd_busy();
			Nowcol++;
			j++;
			k--;
		}
	}	
}	
void delay(void)
{
	Uchar i,j,k;
	for(i=0x02;i>0;i--)
	{
		for(j=0x96;j>0;j--)
		{
			for(k=0xfa;k>0;k--)
			{
				_nop_();
//				_nop_();
			}
		}
	}
}


/*----------------------I2C要用到的一些子程序---------------------------------*/
/***********************以下为一些用到的子程序*********************************/
/*延时子程序*/
void Delay_1ms(Uchar time)
{
	Uchar j;
	while(time--)
	{
		for(j=163;j!=0;j--)
		{;}
	}
}

/*I2C的起动程序*/
void I2CStart(void)	
{
	SDA = 1;
	SomeNOP();
	SCL = 1;
	SomeNOP();
	SDA = 0;
	SomeNOP();
	SCL = 0;
	SomeNOP();
}

/*I2C的停止程序*/
void I2CStop(void)
{
	SDA = 0;
	SomeNOP();
	SCL = 1;
	SomeNOP();
	SDA = 1;
	SomeNOP();
}

void ACK(void)			//Acknowledge信号
{
	SDA = 0;
	SomeNOP();
	SCL = 1;
	SomeNOP();
	SCL = 0;
	SomeNOP();
}

void NACK(void)			//没有Acknowledge信号
{
	SDA = 1;
	SomeNOP();
	SCL = 1;
	SomeNOP();
	SCL = 0;
	SomeNOP();
}

void AutoACK(void)		//在一定的时间内自动确定ACK的信号//
{
	Uchar i = 0;
	SCL = 1;
	SomeNOP();
	while((SDA == 1)&&(i<255))i++;
	SCL = 0;
	SomeNOP();
}

	
/*I2C写数据程序(向数据线上写一个BYTE)*/
void Writex(Uchar j)
{
	Uchar i,temp;
	temp = j;
	for (i=0;i<8;i++)	//串行移位,先送高位,再送低位//
	{
		temp =temp<<1;
		SCL = 0;
		SomeNOP();
		SDA = CY;
		SomeNOP();
		SCL = 1;
		SomeNOP();
	}
	SCL = 0;
	SomeNOP();
	SDA = 1;
	SomeNOP();
}
/*I2C读数据程序(从数据线上读出一个BYTE)返回值为读出的数据(BYTE型)*/
Uchar Readx(void)
{
	Uchar i,j,k=0;
	SCL = 0;
	SomeNOP();
	SDA = 1;
	for (i=0;i<8;i++)	// 串行移位,先读出高位,后读出低位//
	{
		SomeNOP();
		SCL = 1;
		SomeNOP();
		if(SDA ==1) j=1;
		else	j=0;
		k =(k<<1)|j;
		SCL = 0;
	}
	SomeNOP();		
	return(k); 		//返回读出的值//
}

//******************以下为对24CXX系列的读写程序******************************//
//*************24CXX的device address 为写0A0H,读为0A1H*********************//
/*某个地址写数据*/
void X24_Write(Uchar Addresshigh,Uchar Addresslow,Uchar Write_date)
{
	I2CStart();
	Writex(0xA0);
	AutoACK();
	Writex(Addresshigh);
	AutoACK();
	Writex(Addresslow);
	AutoACK();
	Writex(Write_date);
	AutoACK();
	I2CStop();
	Delay_1ms(10);
}

/*对某个地址读操作,函数值为读出的数据*/
Uchar X24_Read(Uchar Addresshigh,Uchar Addresslow)
{	
	Uchar i;
	I2CStart();
	Writex(0xA0);
	AutoACK();
	Writex(Addresshigh);
	AutoACK();
	Writex(Addresslow);
	AutoACK();
	I2CStart();
	Writex(0xA1);
	AutoACK();
	i =Readx();
	//ACK();	//注意:这里不能有ACK应答信号//
	I2CStop();
	Delay_1ms(0);
	return(i);
}

/*对内存中的数据块写入,入口为写EEPROM的地址,内存缓冲中的数据的起始地址(是IDATA的数据)*/	
void X24_WritePage(Uchar Addresshigh,Uchar Addresslow,Uchar idata *Writeip)
{
	Uchar i;
	I2CStart();
	Writex(0xA0);
	AutoACK();
	Writex(Addresshigh);
	AutoACK();
	Writex(Addresslow);
	AutoACK();
	for(i=0;i<64;i++)
	{
		Writex(*Writeip++);
		AutoACK();
	}
	I2CStop();
}
/*把EEPROM中的数据读出来存放在内存缓冲中,起始地址为(是IDATA的数据)*/
void X24_ReadPage(Uchar Addresshigh,Uchar Addresslow,Uchar idata *Readip)
{
	Uchar i;
	I2CStart();
	Writex(0xA0);
	AutoACK();
	Writex(Addresshigh);
	AutoACK();
	Writex(Addresslow);
	AutoACK();
	I2CStart();
	Writex(0xA1);
	AutoACK();
	for(i=0;i<63;i++)		//PAGE读的时候最后一个BYTE不要ACK信号//
	{
		*Readip = Readx();
		 Readip = Readip++;
		 ACK();
		}
	*Readip = Readx();
	NACK();
	I2CStop();
	Delay_1ms(0);
}


//*******************以下为对PCF8383/PCF8563的读写子程序********************//	
//**********时钟片device address的写地址为0A2H,读地址为0A3H******************//
/*对PCF8563的时钟读到内存中,以IDATA指针开始的连续7个BYTE*/
//****读出的内容依次为“秒,分钟,小时,日,星期,月/世纪,年********************//
//PCF8585依次为“秒,分钟,小时,日,星期月
void GetPCF8563(Uchar idata *Getip)
{
	Uchar i;
	I2CStart();
	Writex(0xA2);
	AutoACK();
	Writex(0x02);	//从秒地址开始读//
	AutoACK();
	I2CStart();
	Writex(0xA3);
	AutoACK();
	for(i=0;i<6;i++)
	{
		*Getip = Readx();
		Getip = Getip++;
		ACK();
	}
	*Getip = Readx();
	NACK();
	I2CStop();
	Delay_1ms(0);
}
/*设定8563/8583的时间内容依次为“秒,分钟,小时,日,星期,月/世纪,年*/
//PCF8585依次为“秒,分钟,小时,日,星期月
void SetPCF8563(Uchar idata *Setip)
{
	Uchar i;
	I2CStart();
	Writex(0xA2);
	AutoACK();
	Writex(0x02);
	AutoACK();
	for(i=0;i<7;i++)
	{
		Writex(*Setip++);
		AutoACK();
	}
	I2CStop();
}

Uchar ReadPCF8563(Uchar AddrePCF)
{
	Uchar i;
	I2CStart();
	Writex(0xA2);
	AutoACK();
	Writex(AddrePCF);
	AutoACK();
	I2CStart();
	Writex(0xA3);
	AutoACK();
	i =Readx();
	//ACK();	//注意:这里不能有ACK应答信号//
	I2CStop();
	Delay_1ms(0);
	return(i);
}
void WritePCF8563(Uchar AddrePCF,Uchar PCFdata)
{
	I2CStart();
	Writex(0xA2);
	AutoACK();
	Writex(AddrePCF);
	AutoACK();
	Writex(PCFdata);
	AutoACK();
	I2CStop();
	Delay_1ms(10);
}
	 
	

void SetWaring (Uchar Wyear,Uchar Wmonth,Uchar Wday)
{
	X24_Write(0x07,0xf0,Wyear);
	X24_Write(0x07,0xf1,Wmonth);
	X24_Write(0x07,0xf2,Wday);
}

	
/*返回值为1和0,1为已溢出,0为没有溢出*/	
bit CheckTime(void)
{
	Uchar j,k;
	j = X24_Read(0x07,0xcb);
	k = ReadPCF8563(0x08 );		/*读年的时间*/
	if(k<j)
	{
		return(0);
	}
	else 
	{	
		if(k>j)
		{
			return(1);
		}
		else
		{
			j = X24_Read(0x07,0xcc);
			k = ReadPCF8563(0x07)&0x1f;	/*读月的时间*/
			if (k<j)
			{
				return(0);
			}
			else
			{
				if(k>j)
				{
					return(1);
				}
				else
				{
					j = X24_Read(0x07,0xcd);
					k = ReadPCF8563(0x05)&0x3f;	/*读日的时间*/
					if (k>j)return(1);
					else return(0);
				}
			}		
		}			
	}
}



⌨️ 快捷键说明

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