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

📄 lcdw.c

📁 12864的万年历时钟加上红外遥控的校准
💻 C
字号:
/******************************************/
/************sunrise************/
#include<stc12c5a60s2.h>
#include<ds18b203.h>
#define uchar unsigned char
#define uint unsigned int
/********************************************************/ 
sbit rs=P1^0;
sbit rw=P1^1;
sbit ee=P1^2;
sbit psb=P1^6;
sbit res = P1^3;
sbit hwx=P3^3;
sbit sound=P1^5;
/********************************************************/ 
uint n1,n2,yy,dd,aa,mm,bb,tt,xq;
uint num,k;
uint kai,tin=0;
uint itt;
float txx;
uchar ly_disdate[4]={0,0,0,0};
uchar ly_dis[4];		           //显示缓冲
uchar ly_lhj[4];					//保存NEC的四个字节数据
bit ly_flag=1;
/********************************************************/ 
code uchar table3[]={
/*--  调入了一幅图像:E:\单片机\自定义图\22.bmp  --*/
/*--  宽度x高度=16x16  --*/
0x00,0xFF,0x00,0xFC,0x00,0xF0,0x00,0xE0,0x00,0xCC,0x00,0xDE,0x00,0xDE,0x00,0xCC,
0x00,0xE1,0x00,0xF1,0x00,0xF9,0x00,0xF0,0x00,0xF0,0x00,0xE5,0x00,0xFF,0x00,0xFF};
code uchar table4[]={
/*--  调入了一幅图像:E:\单片机\自定义图\33.bmp  --*/
/*--  宽度x高度=16x16  --*/
0xFF,0x00,0x3F,0x00,0x0F,0x00,0x07,0x00,0x33,0x00,0x7B,0x00,0x7B,0x00,0x33,0x00,
0x87,0x00,0x8F,0x00,0x9F,0x00,0x0F,0x00,0x0F,0x00,0xA7,0x00,0xFF,0x00,0xFF,0x00};
code uchar table1[]={
/*--  文字:  三  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x00,0x00,0x00,0x7F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF8,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00};
/********************************************************/ 
code uchar tab[]="sunrise♀";
code uchar tab2[]="*STUDIO*";
code uchar time0[]="0123456789-. :";
code uchar tab3[]="星期广东海洋大学";
code uchar tab4[]="℃";
code uchar tab5[]="一二人四五六日";
/********************************************************/ 
void delay(uint i)		//
{
	while(--i);	
}
/********************************************************/ 
void suspend()		   //
{
	IE=0x8E;
	IT1=1;
	TMOD=0x11;
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
} 
/********************************************************/ 
void clock() interrupt 1 using 2	 //
{
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
	tt++;
}
/********************************************************/ 
void nian()
{
	dd=0;
	yy++;
	if(yy==13)
	{
		yy=0;
		n1++;
		if(n1==100)
		{
			n1=0;
			n2++;
		}
	}	
}
/********************************************************/ 
void fuzhi()		 //
{	
	if(tt==20)
	{
		tt=0;
		bb++;
		if(bb==60)
		{
			bb=0;
			mm++;
			if(mm==60)
			{
				mm=0;
				aa++;
				if(aa==24)
				{
					aa=0;
					dd++;
					if(yy<=7)
					{
						if(yy!=2)
						{
							if(yy%2==0&&dd==32)
							{
								nian();
							}
							if(yy%2!=2&&dd==31)
							{
								nian();   
							}
						}
						else
						{
							if(n1%4==0&&dd==30)
							{
								nian();
							}
							if(n1%4!=0&&dd==29)
							{
								nian();
							}
						}
					}
					else
					{
						if(yy%2==0&&dd==32)
						{
							nian();
						}
						if(yy%2!=0&&dd==31)
						{
							nian();

						}
					}
						
				}
			}
		
		}
	}
}
/********************************************************/ 
uint caiji(uchar da)	 //
{		
	da=da%10;
	return(da);
}
/********************************************************/ 
uint caiji2(uchar da)	 //
{
	da=da/10;
	return(da);
}
/********************************************************/ 
void wendu()
{
		int ltemp;
		if(itt==0)
			tmpchange();      	//温度转换
		if(itt==100)
		{
			txx=tmp()*0.0625;  	//得到真实十进制温度值,因为DS18B20
								//可以精确到0.0625度,所以读回数据的最低位代表的是0.0625度。
  			ltemp=txx*10+0.5;   	//放大十倍,这样做的目的将小数点后第一位也转换为可显示数字,同时进行一个四舍五入操作。

			if(ltemp<0)
			{		//判断第一位显示整数还是负号
				ly_dis[0]=10;
				ltemp=0-ltemp;	
			}
			else
		  	ly_dis[0]=12;//显示百位值
			ltemp=ltemp%1000;
			ly_dis[1]=ltemp/100;	//显示温度十位值
			ltemp=ltemp%100;
			ly_dis[2]=ltemp/10;		//显示温度个位值
			ly_dis[3]=ltemp%10;		//显示小数点后一位
		}
		itt++;
		if(itt==3000)
			itt=0;
}
/********************************************************/ 
void hongwai() interrupt 2
{
	uchar i,ia;
	TL1=0;
	TH1=0;
	TR1=1;
	while(!hwx);
	TR1=0;
	if(TH1<30||TH1>40)
		return;
	TH1=0;
	TR1=1;
	while(hwx)
	{
		delay(10);
		
		if(TH1>22)
			return;
	}
	TR1=0;
	if(TH1<12)
		return;
	for(i=0;i<4;i++)
	{
			for(ia=0;ia<8;ia++)
			{	
				sound=0	;		
				while(!hwx);	//	
				TH1=0;
				TR1=1;			//
				while(hwx)
				{
					delay(10);
					if(TH1>15)		
						return;		
				}
				TR1=0;
				ly_lhj[i]>>=1;			
				if(TH1>4)				
					ly_lhj[i]|=0x80;
			}
	}
	sound=~sound;
	ly_flag=1;	//接收成功
	TF1=0;
}
/********************************************************/ 
void choose()
{
	if(ly_flag)
		{			//接收成功处理显示缓冲,以16进制显示
			ly_flag=0;
			ly_disdate[2]=ly_lhj[2]/16;
			ly_disdate[3]=ly_lhj[2]%16;
			switch(ly_disdate[3])
			{	
				case 4:
					aa++;
					if(aa==24)
					{
						aa=0;
						dd++;
					}
					break;
				case 0:
					if(ly_disdate[2]==4)
					{
						mm++;
						if(mm==60)
						{
							mm=0;
							aa++;
						}
					}
					break;
				case 2:
					kai=1;
					break;
				case 7:
					yy++;
					if(yy==13)
					{
						yy=0;
					} 
					break;
				case 5:
					dd++;
					if(dd==32)
					{
						dd=0;
					}
					break;
				case 6:
					n2++;
					if(n2==100)
					{
						n2=0;
					}
					break;
				case 9:
					n1++;
					if(n1==100)
					{
						n1=0;
						n2++;	 
					}
					break;
				default:
					break;
			}
		}
}
/********************************************************/ 
void xingqi()
{
	xq=n1+(n1/4)+(n2/4)-2*n2+(26*(yy+1)/10)+dd-1;
	xq=xq%7;
	switch(xq)
	{
		case 1:xq=0;break;
		case 2:xq=2;break;
		case 3:xq=4;break;
		case 4:xq=6;break;
		case 5:xq=8;break;
		case 6:xq=10;break;
		case 0:xq=12;break;
		default:break;
	}		
}
/********************************************************/ 
void busy()			 //
{
	rs=0;
	rw=1;
	ee=1;
	while(P0&0x80);
	ee=0;
}
/********************************************************/ 
void write_order(uchar order1)	  //
{
	busy();
	rs=0;
	rw=0;
	ee=1;
	P0=order1;
	delay(100);
	ee=0;
}
/********************************************************/ 
void write_data(uchar data1)	//
{
	busy();
	rs=1;
	rw=0;
	ee=1;
	P0=data1;
	delay(100);
	ee=0;
}
/********************************************************/ 
void bingxing()			  //
{
	delay(4000);
	write_order(0x30);
	delay(100);
	write_order(0x30);
	delay(37);
	write_order(0x0c);
	delay(100);
	write_order(0x01);
	delay(10000);
	write_order(0x06);
}
/********************************************************/ 
void in_ram()			//
{
	uchar j;
	write_order(0x30);
	write_order(0x40);
	for(j=0;j<16;j++)
	{
		write_data(table3[j*2]);
		write_data(table3[j*2+1]);
	}
	write_order(0x50);
	for(j=0;j<16;j++)
	{
		write_data(table4[j*2]);
		write_data(table4[j*2+1]);
	}
	write_order(0x60);
	for(j=0;j<16;j++)
	{
		write_data(table1[j*2]);
		write_data(table1[j*2+1]);
	}
/*	write_order(0x70);
	for(j=0;j<16;j++)
	{
		write_data(table2[j*2]);
		write_data(table2[j*2+1]);
	}*/
}
/********************************************************/ 
void shijian()
{
	write_order(0x81);
	for(num=0;num<11;num++)
	{
		switch(num)
		{
			case 0:	 
				write_data(time0[12]);
				break;	
			case 1:	 
				write_data(time0[caiji2(n2)]);
				break;
			case 2:
				write_data(time0[caiji(n2)]);
				break;
			case 3:
				write_data(time0[caiji2(n1)]);
				break;
			case 4:
				write_data(time0[caiji(n1)]);
				break;
			case 5:
				write_data(time0[10]);
				break;
			case 6:
				write_data(time0[caiji2(yy)]);
				break;
			case 7:
				write_data(time0[caiji(yy)]);
				break;	
			case 8:
				write_data(time0[10]);
				break;
			case 9:
				write_data(time0[caiji2(dd)]);
				break;
			case 10:
				write_data(time0[caiji(dd)]);
				break;
			default:
				break; 
		}
	}
	write_order(0x92);
	for(num=0;num<8;num++)
	{
		switch(num)
		{
			case 0:	 
				write_data(time0[caiji2(aa)]);
				break;
			case 1:
				write_data(time0[caiji(aa)]);
				break;
			case 2:
				write_data(time0[13]);
				break;
			case 3:
				write_data(time0[caiji2(mm)]);
				break;
			case 4:
				write_data(time0[caiji(mm)]);
				break;
			case 5:
				write_data(time0[13]);
				break;
			case 6:
				write_data(time0[caiji2(bb)]);
				break;	
			case 7:
				write_data(time0[caiji(bb)]);
				break;
			default:
				break; 
		 }
	}
	in_ram();
	write_order(0x88);
	for(num=0;num<16;num++)
	{
		if(num<4)
			write_data(tab3[num]);		
		switch(num)
		{
			case 4:
				if(xq==4)
				{
					write_data(0x00);
					write_data(0x04);
				}
				else
					write_data(tab5[xq]);
				break;	
			case 5:
				if(xq==4)break;
				else
					write_data(tab5[xq+1]);
				break;	
			case 6:
				write_data(time0[12]);
				break;
			case 7:
				write_data(0x02);	
				break;	
			case 8:	
				write_data(0x02);
				break;
			case 9:	 
				write_data(time0[ly_dis[0]]);
				break;
			case 10:
				write_data(time0[ly_dis[1]]);
				break;
			case 11:
				write_data(time0[ly_dis[2]]);
				break;
			case 12:
				write_data(time0[11]);
				break;
			case 13:
				write_data(time0[ly_dis[3]]);
				break;
			default:
				break; 
		}
	}
	write_order(0x8f);
	for(num=0;num<2;num++)
	{
		write_data(tab4[num]);
	}								
}
/********************************************************/ 
void caidan()
{
	write_order(0x81);
	for(k=0;k<12;k++)
	{
		write_data(tab3[k+4]);
	}														
	write_order(0x92);
	for(k=0;k<8;k++)
	{
		write_data(tab[k]);
	}
	write_order(0x8a);
	for(k=0;k<8;k++)
	{
		write_data(tab2[k]);
	}
}
/********************************************************/ 
void main()
{
	bingxing();
	suspend();  //
	while(1)
	{ 	
		choose();
		caidan();
		in_ram();
		write_order(0x9b);
		write_data(0x00);
		write_data(0x00);
		write_order(0x9c);
		write_data(0x00);
		write_data(0x02);	
		if(kai==1)
		{
			bingxing();
			kai=0;
			TR0=1;
			while(1)
			{
				choose();
				fuzhi();
				xingqi();
				wendu();
				shijian();
				if(kai==1)
				{
					TR0=0;
					break;
				}
			}
			bingxing();
			kai=0;
		 } 
		//
/*		write_order(0x9a);
		write_data(0x00);
		write_data(0x04);
		//
		write_order(0x9b);
		write_data(0x00);
		write_data(0x06);	*/
	}
}

⌨️ 快捷键说明

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