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

📄 12864lcd显示.c

📁 LCD12864+18b20+1302串口
💻 C
📖 第 1 页 / 共 2 页
字号:
			e=d;
			d=d>>4;
			e=e&0x0f;
			LCD_set_xy(2,2);
			LCD_Write_number(d);
			LCD_Write_number(e);
    }
     
  	if(mon==1)  				//月闪烁标志位
    {
    	if(flag==1)
       	{    
        		d=read_clock(0x89);	//读月
			e=d;
			d=d>>4;
			e=e&0x0f;
			LCD_set_xy(2,4);
			LCD_Write_number(d);
			LCD_Write_number(e);
		
       	}
     	else
       	{
			LCD_set_xy(2,4);
        		LCD_Write_number(10); 	//显示空格
        		LCD_Write_number(10);    
       	}
    } 
  	else
    { 
      			d=read_clock(0x89);	//读月
			e=d;
			d=d>>4;
			e=e&0x0f;
			LCD_set_xy(2,4);
			LCD_Write_number(d);
			LCD_Write_number(e);
    }   

  	if(day==1)  				//日闪烁标志位
    {
    	if(flag==1)
       	{  
	   		d=read_clock(0x87);	//读日
			e=d;
			d=d>>4;
			e=e&0x0f;
			LCD_set_xy(2,6);
			LCD_Write_number(d);
			LCD_Write_number(e);
    		}
    	else
   	 	{
			LCD_set_xy(2,6);
        		LCD_Write_number(10);	 //显示空格
        		LCD_Write_number(10);    
    	}
    } 
  	else
    { 
    			d=read_clock(0x87);	//读日
			e=d;
			d=d>>4;
			e=e&0x0f;
			LCD_set_xy(2,6);
			LCD_Write_number(d);
			LCD_Write_number(e);
    }
    
    if(weekk==1)  				//星期闪烁标志位
    {
    	if(flag==1)
       	{    
        		d=read_clock(0x8b);	//读星期
			LCD_Write_week(d);
       	}
     	else
       	{
        		LCD_Write_week(8); 	//显示空格        
       	}
    } 
  	else
    { 
     			d=read_clock(0x8b);	//读星期
			LCD_Write_week(d);
    }     
}


void Disp2(void)				//闹钟界面光标显示
{
		if(Kgb==1)  			//开关闪烁标志位
 		{
    		if(flag==1)
       	{
			if(Bell_Swh == 0)//0为关
			{
			LCD_Write_string(1,6,guan);//显示关
			}
				else
				{
					LCD_Write_string(1,6,kai);//显示开
				}
         }
	   			else
       				{
					LCD_Write_string(1,6,space_c); //显示空格
       				}
     } 
  	 else
    	{
     		if(Bell_Swh == 0)//关
					{
					LCD_Write_string(1,6,guan);
					}
				else
				{
					LCD_Write_string(1,6,kai);
				}
    	}    
   
  	if(Hourb==1)  //时闪烁标志位
    {
    	if(flag==1)
       	{ 
   	    		d=read_clock(0xc3);	//读闹钟小时的数值
			e=d;
			d=d>>4;
			e=e&0x0f;
			LCD_set_xy(3,3);
			LCD_Write_number(d);
			LCD_Write_number(e);   
       	}
     	else
       	{
			LCD_set_xy(3,3);
        		LCD_Write_number(10); 	//显示空格
	        	LCD_Write_number(10);    
       	}
    } 
  	else
    	{
    			d=read_clock(0xc3);	//读闹钟小时的数值
			e=d;
			d=d>>4;
			e=e&0x0f;
			LCD_set_xy(3,3);
			LCD_Write_number(d);
			LCD_Write_number(e);     
    	} 

		if(flag == 0)
			LCD_Write_number(11);	//显示:构成闪烁壮
		else 
			LCD_Write_number(10);	//显示空格

  	if(Minb==1)  				//分钟闪烁标志位
    {
    	if(flag==1)
       	{    
      			d=read_clock(0xc5);	//读闹钟分钟的数值
			e=d;
			d=d>>4;
			e=e&0x0f;
			LCD_Write_number(d);
			LCD_Write_number(e);
       	}
     	else
       	{
        		LCD_Write_number(10); 	//显示空格
	       		LCD_Write_number(10);    
    	}
     } 
  	else
   	{ 
    			d=read_clock(0xc5);	//读闹钟分钟的数值
			e=d;
			d=d>>4;
			e=e&0x0f;
			LCD_Write_number(d);
			LCD_Write_number(e);
   	}
}

void id_case1_key(void)				//时间界面上下键判别
{
		if(Add_Key == 0) 		//增加
    	{
    		Delay(100);
       	if(Add_Key == 0)
	   		Set_time(id,0);  	//调用Set_time函数
			while(Add_Key ==0);
    	}
   	if (Dec_Key==0)  			//减少
    	{
       		Delay(100);
       	if(Dec_Key == 0)
			Set_time(id,1);  
        	while(Dec_Key ==0);
      }
}


void Set_time(unsigned char sel, bit sel_1) 	//设置时间光标位置
{
  	signed char address,item;
  	signed char max,mini;
  	if(sel==7)  
  		{
  			address=0x80; 
  			max=0;
  			mini=0;
  		}     //秒
  	if(sel==6)  
  		{
  			address=0x82; 
  			max=59;
  			mini=0;
  		}    //分钟
  	if(sel==5)  
  		{
  			address=0x84;
  			max=23;
  			mini=0;
  		}    //小时
  	if(sel==3)  
  		{
  			address=0x86;
  			max=31;
  			mini=1;
  		}    //日
  	if(sel==2) 
  		{
  			address=0x88; 
  			max=12;
  			mini=1;
  		}    //月
  	if(sel==1)  
  		{
  			address=0x8c; 
  			max=99; 
  			mini=0;
  		}    //年
  	if(sel==4)  
  		{
  			address=0x8a; 
  			max=7;
  			mini=1;
  		}    //星期
  
  //读取1302某地址上的数值转换成10进制赋给item 
  	item=((read_clock(address+1))/16)*10 + (read_clock(address+1))%16;
  	if(sel_1==0) 
  		item++;  
  	else
  		item--;
  	if(item>max) 
  		item=mini;   
  	if(item<mini) 
  		item=max;
           
  	write_clock(0x8e,0x00);//允许写操作
  	write_clock(address,(item/10)*16+item%10);//转换成16进制写入1302
  	write_clock(0x8e,0x80);//写保护,禁止写操作  
}


void id_case2_key(void)			//闹钟界面上下键判别
{
	if(Add_Key == 0) 		//增加
    	{
    	Delay(100);
       	if(Add_Key == 0)
	   		Set_Bell(id2,0);//调用Set_time函数
	while(Add_Key ==0);
    	}
   	if(Dec_Key==0)  		//减少
    	{
       	Delay(100);
       	if(Dec_Key == 0)
			Set_Bell(id2,1);  
        while(Dec_Key ==0);
      }
}


void Set_Bell(unsigned char sel, bit sel_1)	//闹钟闪烁位置设置
{
  	signed char address,item;
  	signed char max,mini;
  	if(sel==4)  
  		{
  			address=0xc6; 
  			max=59;
  			mini=0;
  		}    //秒
  	if(sel==3)  
  		{
  			address=0xc4; 
  			max=59;
  			mini=0;
  		}    //分
  	if(sel==2)  
  		{
  			address=0xc2; 
  			max=23; 
  			mini=0;
  		}   //时
  	if(sel==1)  				//标志位
  		{
  			address=0xc8;//for read
			if(Add_Key ==0 || Dec_Key ==0)
			Bell_Swh=~Bell_Swh;
			write_clock(address,Bell_Swh);
  		}    				//开关

  	item=((read_clock(address+1))/16)*10 + (read_clock(address+1))%16;
  	if(sel_1==0) 
  		item++;  
  	else
  		item--;
  	if(item>max) 
  		item=mini;   
  	if(item<mini) 
  		item=max;

  	write_clock(0x8e,0x00);//允许写操作
  	write_clock(address,(item/10)*16+item%10);//转换成16进制写入1302
  	write_clock(0x8e,0x80);//写保护,禁止写操作 
}


void Timer0_Init(void)		//T0初始化
{
		TMOD=0x01;
		TH0=(65535-50000)/256;
		TL0=(65535-50000)%256;
		EA=1;
		ET0=1; 
		TR0=1;
}


void Timer0(void) interrupt 1 using 1		//TO中断入口,来显示闪烁0.5秒每次
{
		static unsigned char timecount = 0;//

		TH0=(65535-50000)/256; //50ms定时
  	TL0=(65535-50000)%256;  
  	timecount++;
  	if(timecount > 9)//500MS
   		{
    		timecount = 0;    
    		flag = ~flag;   		//闪烁标志位       
    	}
}


void Init_1302(void)				//设置1302的初始时间
{
	write_clock(0x8e,0x00);//允许写操作
	write_clock(0x8c,0x05);//年
	write_clock(0x8a,0x06);//星期
	write_clock(0x88,0x01);//月
	write_clock(0x86,0x01);//日
	write_clock(0x84,0x12);//小时
	write_clock(0x82,0x00);//分钟
	write_clock(0x80,0x00);//秒
	write_clock(0x90,0xa5);//充电	
	write_clock(0x8e,0x80);//禁止写操作
}


void Lcd_Mark1(void)//在LCD预定的位置上写入汉字
{
		Clr_Scr();//清屏

		LCD_Write_string(1,1,bt);//标题-电子万年历-
		LCD_set_xy(2,1);
		LCD_Write_number(2);//2
		LCD_Write_number(0);//0
		LCD_Write_string(2,3,nian);//显示年月日
		LCD_Write_string(2,5,yue);
		LCD_Write_string(2,7,ri);
		LCD_Write_string(3,0,xq);//星期
		LCD_Write_string(4,0,sw);//室温
		LCD_Write_string(4,4,ssd);//℃
	
		if(Bell_Swh == 1)//闹钟为开
		{	
			LCD_Write_string(4,6,nzbz);//显示闹钟图标
		}
}


void Lcd_Mark2(void)	//闹钟界面显示字符
{
		Clr_Scr();//清屏

		//显示闹钟设定等几个汉字
		LCD_Write_string(1,1,nzsd);//
		LCD_Write_string(2,3,xsfz);//	
}


void Bell(void)	//启动蜂鸣器
{
		Bell_Out = 0;
		Delaynms(150);//150ms
		Bell_Out = 1;
		Delaynms(50);//50ms
		Bell_Out = 0;
		Delaynms(250);//250ms
		Bell_Out = 1;
		Delaynms(400);//400ms
}


void main(void)//主函数
{
                Timer0_Init();//定时器T0初始化
		Lcd_init();//设置液晶显示器

		Clr_Scr();//清屏	
		Disp_img(logo);	//显示LOGO
		Delaynms(1000);
		Lcd_init();//从图形显示状态下返回

		Bell_Swh = read_clock(0xc9);//读取开关的状态
		Lcd_Mark1( );

		while(1)//主循环
 		{	
		//设置时钟的初始值,显示05年1月1号12:00:00
  		if(Add_Key == 0 && Dec_Key == 0)
			{
				Delay(1000);
				if(Add_Key == 0 && Dec_Key == 0)
				{
					Init_1302();
				}
			}

			if(OK_Key == 0 && Dec_Key ==0 )//进入闹钟设置界面
			{
				Delaynms(100);
				if(OK_Key == 0 && Dec_Key ==0 )
				{
					Lcd_Mark2();
					if(Bell_Swh == 0)
						{
							LCD_Write_string(1,6,guan);
						}//关
					else  
						{
							LCD_Write_string(1,6,kai);
						}
				while(1)
				{	
					if (OK_Key == 0) // 设置和选择项目键
      				{	
								Delay(1000);
       					if(OK_Key == 0)
								{
									id2++;
									if(id2>4) 
										id2=0;
								}
       					while(OK_Key == 0);//等待键松开   
 				    	}
					switch( id2 )
					{
						case 0:
							Disp2();
							break;//正常显示
						case 1:
							Kgb = 1;
							id_case2_key();
							Disp2();
							break;//开关
						case 2:
							Kgb= 0;
							Hourb=1;
							id_case2_key();
							Disp2();
							break;//
						case 3:
							Hourb=0;
							Minb=1;
							id_case2_key();
							Disp2();break;
						case 4:
							Minb=0;
							id2=0;
							Lcd_Mark1();
							goto MF;
							break;//返回主界面
						default:
							break;
					}
				}//while(1)
			}//if
		}//if
/*****************************************/
		MF:   //返回主界面
/*****************************************/			
		if (OK_Key == 0) // 设置和选择项目键
      	{
       		Delay(1000);
       		if(OK_Key == 0)
			{
				id++;if(id>7)id=0;	
			}
       		while(OK_Key == 0);//等待键松开    
      	}
     	switch( id )
      	{
       		case 0:
       			sec=0;	
       			Disp();
       			break;//正常显示
         	case 1:
         		year=1;
         		id_case1_key();
         		Disp();
         		break;//年	
			    case 2:
			    	year=0;
			    	mon=1;
			    	id_case1_key();
			    	Disp();
			    	break;//月
          case 3:
          	mon=0;
          	day=1;
          	id_case1_key();
          	Disp();
          	break;  //日 
         	case 4:
         		day=0;
         		weekk=1;
         		id_case1_key();
         		Disp();
         		break;//星期     
         	case 5:
         		weekk=0;
         		hour=1;
         		id_case1_key();
         		Disp();
         		break;  //小时
       		case 6:
       			hour=0;
       			min=1;
       			id_case1_key();
       			Disp();
       			break; //分钟
       		case 7:
       			min=0;
       			sec=1;
       			id_case1_key();
       			Disp();
       			break; //秒
         	default:
         		break;	
      	}

		if(Bell_Swh == 1)//闹钟为开
		{
				H_Bell=read_clock(0xc3);//读取闹钟的时
				S_Bell=read_clock(0xc5);//读取闹钟的分
			
				H_1302=read_clock(0x85);//读小时
				S_1302=read_clock(0x83);//读分钟
	
				if(H_Bell == H_1302) 
		 		{
					if(S_Bell == S_1302)
					{
						Clr_Scr();//清屏
						LCD_Write_string(2,2,nzsjd);//闹钟显示时间到!
					
						while(S_Bell == S_1302)//判断是否到闹钟设定时间
						{
							Bell();
							S_Bell=read_clock(0x83);//读分钟

						if(Add_Key ==0 ||Dec_Key ==0 || OK_Key ==0)
							break;//按任意键退出
						}
						Bell_Swh =0;
						Lcd_Mark1();
					}//if
				}
		}//if
	}//while
}//main

⌨️ 快捷键说明

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