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

📄 drawing_line.c

📁 此为基于KEIL C 的环境下编写的液晶图形时钟代码
💻 C
字号:
/*
     designed by tp,10,13,2007,If you have any ideal please contact me, 
      I am glad to discuss with you!
*/

#include<reg51.h>
#include<drive_functions.h>

uchar timer,second,minute=18,hour=8,day=15,month=2,count,key,weekday;
uint year=2007;
bit flag,add_flag,sub_flag,flag_day,flag_sec;

uchar temp[8]={0,0,10,0,0,10,0,0};
uchar temp1[8]={0,0,11,0,1,11,0,1};
uchar mon[12]={31,28,31,30,31,30,31,31,30,31,30,31};

uchar code number[]=
{
/*--  文字:  0  --*/
/*--  黑体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,

/*--  文字:  1  --*/
/*--  黑体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x20,0x30,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,

/*--  文字:  2  --*/
/*--  黑体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x60,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x20,0x00,

/*--  文字:  3  --*/
/*--  黑体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x30,0x08,0x08,0x08,0x08,0xF0,0x00,0x00,0x18,0x20,0x20,0x21,0x21,0x1E,0x00,

/*--  文字:  4  --*/
/*--  黑体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x06,0x05,0x04,0x04,0x04,0x3F,0x04,

/*--  文字:  5  --*/
/*--  黑体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0xF8,0x48,0x48,0x48,0x48,0x88,0x00,0x00,0x18,0x20,0x20,0x20,0x20,0x1F,0x00,

/*--  文字:  6  --*/
/*--  黑体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0xE0,0x10,0x88,0x88,0x88,0x30,0x00,0x00,0x0F,0x11,0x20,0x20,0x20,0x1F,0x00,

/*--  文字:  7  --*/
/*--  黑体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x08,0x08,0x08,0x08,0xC8,0x38,0x00,0x00,0x00,0x00,0x30,0x0E,0x01,0x00,0x00,

/*--  文字:  8  --*/
/*--  黑体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x60,0x90,0x08,0x08,0x08,0x90,0x60,0x00,0x0C,0x12,0x21,0x21,0x21,0x12,0x0C,

/*--  文字:  9  --*/
/*--  黑体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0xF0,0x08,0x08,0x08,0x10,0xE0,0x00,0x00,0x19,0x22,0x22,0x22,0x11,0x0F,0x00,
/*--  文字:  :  --*/
/*--  黑体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,

/*--  文字:  -  --*/
/*--  黑体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x00,

/*--  文字:     --*/
/*--  黑体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

};



uchar code hanzi[]=
{
/*--  文字:  星  --*/
/*--  黑体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x00,0x7E,0xFE,0xD6,0x56,0x56,0xD6,0xD6,0x56,0x56,0x7E,0x7E,0x00,0x00,0x00,
0x00,0x66,0x67,0x6B,0x6B,0x6B,0x6B,0x7F,0x7F,0x6B,0x6B,0x6B,0x6B,0x60,0x60,0x00,

/*--  文字:  期  --*/
/*--  黑体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x0C,0xFF,0xFF,0xAC,0xFF,0xFF,0x0C,0xFE,0xFE,0x66,0x66,0xFE,0xFE,0x00,0x00,
0x26,0x36,0x1F,0x07,0x06,0x1F,0x57,0x66,0x3F,0x1F,0x03,0x63,0x7F,0x3F,0x00,0x00,
};



uchar code xingqi[]=
{
 /*--  文字:  六  --*/
/*--  黑体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x60,0x60,0x60,0x60,0x60,0x62,0x6E,0x6C,0x60,0x60,0x60,0x60,0x60,0x60,0x00,
0x00,0x20,0x30,0x1C,0x0E,0x03,0x00,0x00,0x00,0x01,0x03,0x0E,0x38,0x30,0x00,0x00,

/*--  文字:  日  --*/
/*--  黑体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x00,0x00,0xFF,0xFF,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xFF,0xFF,0x00,0x00,0x00,
0x00,0x00,0x00,0x7F,0x7F,0x30,0x30,0x30,0x30,0x30,0x30,0x7F,0x7F,0x00,0x00,0x00,

/*--  文字:  一  --*/
/*--  黑体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  二  --*/
/*--  黑体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x00,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x00,0x00,0x00,
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,

/*--  文字:  三  --*/
/*--  黑体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x00,0x0C,0x8C,0x8C,0x8C,0x8C,0x8C,0x8C,0x8C,0x8C,0x8C,0x0C,0x00,0x00,0x00,
0x00,0x30,0x30,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x30,0x30,0x00,0x00,

/*--  文字:  四  --*/
/*--  黑体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0xFE,0xFE,0x06,0x06,0xFE,0xFE,0x06,0xFE,0xFE,0x06,0x06,0xFE,0xFE,0x00,0x00,
0x00,0x7F,0x7F,0x36,0x37,0x33,0x31,0x30,0x31,0x33,0x33,0x33,0x7F,0x7F,0x00,0x00,

/*--  文字:  五  --*/
/*--  黑体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x06,0xC6,0xC6,0xC6,0xC6,0xFE,0xFE,0xC6,0xC6,0xC6,0xC6,0x06,0x06,0x00,0x00,
0x30,0x30,0x30,0x30,0x30,0x3F,0x3F,0x30,0x30,0x30,0x3F,0x3F,0x30,0x30,0x30,0x00,
};



void delay_us(uchar us)
{
 while(us--);
 }

/******************************** 显示子程序 **********************************************************/

void display_time(void)
{
  unsigned char i;
  uchar *p;
  temp[0]=hour/10;
  temp[1]=hour%10;
  temp[2]=10;
  temp[3]=minute/10;
  temp[4]=minute%10;
  temp[5]=10;
  temp[6]=second/10;
  temp[7]=second%10;
  for(i=0;i<8;i++)
  {
   	p=number+16*temp[i];
   	DisWord(i,1,1,p);
  }
}

void display_date(void)
{
  unsigned char i;
  uchar *p;
  if(year>2099) year=2099;
  temp1[0]=year%100/10;
  temp1[1]=year%10;
  temp1[2]=11;
  temp1[3]=month/10;
  temp1[4]=month%10;
  temp1[5]=11;
  temp1[6]=day/10;
  temp1[7]=day%10; 
  for(i=0;i<8;i++)
  {
  	 p=number+16*temp1[i];
  	 DisWord(i,0,1,p);
  }
}

/******************************** 表针显示 **********************************************************/

void hand(uchar time,uchar lenth,uint angle,uchar draw)	 //表针
{														 
  uchar dx,dy;											 //	每秒钟时,分,秒针都调一下,但是角度不同
  unsigned int sec,temp,temp1;							 //

  if(time==second)	{sec=second;temp1=59;}			     //	某个时刻秒针指向的位置
  if(time==minute&&second!=minute)	{sec=minute*60+second,temp1=3599;}//分针指向的位置	
  if(time==hour&&second!=hour)	{sec=(hour%12)*3600+minute*60+second;temp1=43199;}//时针

  temp=sec-1;											 
  if(temp>temp1) temp=temp1;							//如果没有这句当second=0时sec会溢出,出错

  dx=96+lenth*sin(3.14*temp/angle);
  dy=32-lenth*cos(3.14*temp/angle);
  DrawLine(96,32,dx,dy,Graphic_Clear);

  dx=96+lenth*sin(3.14*sec/angle);
  dy=32-lenth*cos(3.14*sec/angle);
  DrawLine(96,32,dx,dy,draw);
}

/******************************** 判闰年 **********************************************************/

void leap_year(uchar x)           				//判段闰年
{
  if((x%4==0&&x%100!=0)||x%400==0)  mon[1]=29;  
  else mon[1]=28;
}

/******************************** 键扫子程序 **********************************************************/

void keyscan(void)				  				// 键盘扫描
{
 unsigned char keyvalue;
 keyvalue=P1&0X07;
 if(keyvalue!=0x07)
  delay_us(50);
 if(keyvalue!=0x07)
  {
   key=keyvalue;
   flag=1;
  }
  else flag=0;
 }

/******************************** 调试加子程序 **********************************************************/
 
unsigned int add(uint i,uint top,uint bottem)  //调时间函数,按键则加一
{
 if(add_flag)
 {
  i++;
  if(i==top)
   {
    i=bottem;
   }
 }
 add_flag=0;
 return(i);
}

/******************************** 调试减子程序 **********************************************************/

unsigned int sub(uint i,uint top,uint bottem)  // 调时间函数,按键则减一
{
 if(sub_flag)
 {
  i--;
  if(i==bottem)
  {
   i=top;
  } 
 }
 sub_flag=0; 
 return(i);
}

/******************************** 判星期子程序 **********************************************************/

void week(bit f,uint x,uchar y,uchar z)			  //判断某一天是星期几
{ 
 	unsigned long temp;						  //我的方法是查出2000年1月1日是星期六
 	uint deta_day=0;
	uchar i;								  //要求哪年哪天就把那天与2000年1月1日
	uchar *p;
 	leap_year(x); 							  //相隔的天数对7取余
 	for(i=0;i<y;i++)
  		{deta_day+=mon[i];}					  
	temp=365*(x-2000)+deta_day+abs(x-2000)/4+z-mon[y-1];
	if(f&&x%4==0&&y<3) temp=365*(x-2000)+deta_day+abs(x-2000)/4+z-mon[y-1]-1;
 	weekday=temp%7;
 	p=xingqi+32*weekday;
	DisWord(2,2,2,p);
}

/******************************** 键功能子程序 **********************************************************/

void keyprocess(void)						// 键功能程序
{
 	keyscan();
	while((P1&0X07)!=0x07);					//判按键释放
 	switch(key)
 	{
  		case 0x06:
   			if(flag)
    		{
	  			count++;
	  			if(count==7)
	    		count=0;
			}
    	break;
  		case 0x05:						   //  加一键
   			if(flag)
   			{
      			if(count!=0)			   //  为一年加一,为二月加一以此类推
	   			{
	   				add_flag=1;			   //  加的标志
	   			}
      			switch(count)			   
       			{
	   				case 1:TR0=0;year=add(year,2100,2000);display_date();week(1,year,month,day);break;
	   				case 2:TR0=0;month=add(month,13,1);display_date();week(0,year,month,day);break;
	   				case 3:TR0=0;leap_year(year);day=add(day,mon[month-1]+1,1);display_date();week(0,year,month,day);break;
	   				case 6:TR0=0;hand(second,26,30,Graphic_Clear);second=add(second,60,0);flag_sec=1;break;		//加之前先把指针擦掉,
	   				case 5:TR0=0;hand(minute,22,1800,Graphic_Clear);minute=add(minute,60,0);flag_sec=1;break;	//加完后显示新的指针
	   				case 4:TR0=0;hand(hour,16,21600,Graphic_Clear);hour=add(hour,24,0);flag_sec=1;break; 
	   				default:break;
	   			}
   			}
		break;
  		case 0x03:						   //减一键,与加一相对应
   			if(flag)
   			{
      			if(count!=0)
	   			{
	   				sub_flag=1;
	   			}
      			switch(count)
       			{
	    			case 1:TR0=0;year=sub(year,2100,1999);display_date();week(1,year,month,day);break;
	    			case 2:TR0=0;month=sub(month,12,0);display_date();week(0,year,month,day);break;
	    			case 3:TR0=0;leap_year(year);day=sub(day,mon[month-1],0);display_date();week(0,year,month,day);break;
					case 6:TR0=0;hand(second,26,30,Graphic_Clear);second=sub(second,59,65535);flag_sec=1;break;
	    			case 5:TR0=0;hand(minute,22,1800,Graphic_Clear);minute=sub(minute,59,65535);flag_sec=1;break;
	    			case 4:TR0=0;hand(hour,16,21600,Graphic_Clear);hour=sub(hour,23,65535);flag_sec=1;break; 
	    			default:break;
	   			}
   			}
		break;
  		default: break;
 	}
  	switch(count)											// 不按或按键到第七次自动开启定时
  	{
  		case 0:TR0=1;break;				 					//其他的键值定时保持关闭
   		case 1:TR0=0;break;
   		case 2:TR0=0;break;
   		case 3:TR0=0;break;
   		case 4:TR0=0;break;
   		case 5:TR0=0;break;
   		case 6:TR0=0;break;
   		default:break;
  	}
}

/******************************** 主函数 **********************************************************/

void main(void)
{
 	uchar *p;
	DrawSineWave();
 	ClearLCD();
 	DrawCircle();						   					// 画一个圆圈作为表的框,并让它总是显示着
 	IE=0X82;TMOD=0X01;TH0=0X3C;TL0=0XAF;//TR0=1;
 	p=hanzi;							   					// 显示 星期 二字,并让它总是显示着
 	DisWord(0,2,2,p);
 	p=hanzi+32;
	DisWord(1,2,2,p);
 	display_date();						   					//显示日期
	week(0,year,month,day);				                   // 显示星期
	while(1)
 	{
  		keyprocess();					   				  // 键盘扫描及功能
 		display_time();					   				  // 显示时间
  		if(flag_day)					   				  // 一天刷新一次日期和星期
  		{
			display_date();
   			week(0,year,month,day);
			flag_day=0;
  		}
  			if(flag_sec)				  				  //一秒钟才刷新一次表针的显示,减少闪烁
  			{
  				hand(second,26,30,Graphic_Draw);
				if(second!=minute)		                  // 我的显示方法是先把上一秒的指针擦掉,再显示。
				{
					hand(minute,22,1800,Graphic_Draw);	  //这样如果秒等于分的时候,秒针显示完马上会被分针擦出
				}
				if(second!=hour)						  //所以这一秒我就让分钟不显示。分针一秒所走的角度太小
				{
  					hand(hour,16,21600,Graphic_Draw);	  //是看不出来的。小时同理。
				}
  			}
		flag_sec=0;
 	}
}

/********************************中断服务子程序 **********************************************************/

void t0() interrupt 1 using 0
{
	TR0=0;TH0=0X3C;TL0=0XAF;TR0=1;
 	timer++;
  	if(timer==20)
  	{
   		timer=0;
   		second++;
   		flag_sec=1;
   		if(second>=60)
   		{
    		second=0;
			minute++;
			if(minute>=60)
			{
	 			minute=0;
	 			hour++;
	 			if(hour>=24)
	  			{
					hour=0;
       				day++;
	   				flag_day=1;
       				leap_year(year);	  		         //判闰年确定那一年2月的天数
       				if(day>mon[month-1])
        			{
             			day=1;
             			month++;
             			if(month>12)
             			{
              				month=1;
              				year++;
              				if(year>=2100)
               				year=2000;
              			}
        			}
      			}
    		}
  		}
	}
}

⌨️ 快捷键说明

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