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

📄 2402test.c

📁 《爱上单片机》配书光盘(书本的制作作品所要的程序)
💻 C
📖 第 1 页 / 共 3 页
字号:
		//
	    print2(0x95,(read_clock(0x81)/16)+0x30);//秒
	    print2(0x96,(read_clock(0x81)%16)+0x30);
		//
		print(0x8a," ");//在主显示区空白处写入空格 防止乱码
		print(0x8e," ");
		print(0xc0," ");
}
/********************************************************************************************
//显示项目 定时时间部分 在第一行全行显示时间
*********************************************************************************************/    
void alarm_Display(void){
	    print(0x80,"AL");
	    print2(0x82,(AT24C02_Read1Byte(0x05+(rom*10))/16)+0x30);
	    print2(0x83,(AT24C02_Read1Byte(0x05+(rom*10))%16)+0x30);
		print(0x84,"/");            // 显示年
		//
	    print2(0x85,(AT24C02_Read1Byte(0x06+(rom*10))/16)+0x30);
	    print2(0x86,(AT24C02_Read1Byte(0x06+(rom*10))%16)+0x30);
		print(0x87,"/");            // 显示月
		//
	    print2(0x88,(AT24C02_Read1Byte(0x07+(rom*10))/16)+0x30);
	    print2(0x89,(AT24C02_Read1Byte(0x07+(rom*10))%16)+0x30);

		print(0x8b,"[");            // 显示[
		if(AT24C02_Read1Byte(0x08+(rom*10)) == 0xff){
			print(0x8c,"?");
		}
		else{	
			print2(0x8c,AT24C02_Read1Byte(0x08+(rom*10))%16); //星期
		}
		print(0x8d,"]");            // 显示]

	    print2(0x8f,(AT24C02_Read1Byte(0x09+(rom*10))/16)+0x30);//小时
	    print2(0x90,(AT24C02_Read1Byte(0x09+(rom*10))%16)+0x30);
		print(0x91,":");            // 显示cgram第一个字模":"
		//
	    print2(0x92,(AT24C02_Read1Byte(0x0a+(rom*10))/16)+0x30);//分钟
	    print2(0x93,(AT24C02_Read1Byte(0x0a+(rom*10))%16)+0x30);
		print(0x94,".");            // 显示cgram第一个字模"."
		//
	    print2(0x95,(AT24C02_Read1Byte(0x0b+(rom*10))/16)+0x30);//秒
	    print2(0x96,(AT24C02_Read1Byte(0x0b+(rom*10))%16)+0x30);
		//
		print2(0xc0,AT24C02_Read1Byte(0x04+(rom*10))/16+0x30); //显示控制项值//控制项值
		print2(0xc1,AT24C02_Read1Byte(0x04+(rom*10))%16+0x30); //

}
/********************************************************************************************
//清屏+刷新显示+延时+清空DT 一体函数
//LRDD()
*********************************************************************************************/    
void LRDD (void){
	LCM2402_Init();
	RealTime_Display();
	DelayS(500); DT = 0xff;		
}
/********************************************************************************************
//清屏+刷新定时值显示+延时+清空DT 一体函数
//LADD()
*********************************************************************************************/    
void LADD (void){
	LCM2402_Init();
	alarm_Display();
	DT = 0xff;		
}
/********************************************************************************************
//闹钟呜响查寻程序
//BEEPing();
*********************************************************************************************/
void BEEPing(void){//闹钟呜响查寻程序
	uint8 a;
	LADD();
	print(0xc4,"{Time`s up}  AV: OFF");
	for(a=0;a<250 && DT == 0xff;a++){
		beep_a();////
	}
	DT = 0xff;
}
/********************************************************************************************
//闹钟和无线遥控的键值处理
//ALARMing();
*********************************************************************************************/    
void ALARMing(void){
	uint8 alarm_bit;
	alarm_bit = AT24C02_Read1Byte(0x03);              // 从AT24C02的地址0x03读出定时报警设置数据
	if(AT24C02_Read1Byte(0x04+(rom*10)) < 2 && alarm_bit == 1 || alarm_bit == 3){//键值值为0则是闹钟,不为0则是无线控制
		if(AT24C02_Read1Byte(0x04+(rom*10)) == 0){
			BEEPing();
		}else{
			beep_y();//
		}	
	}
	if(AT24C02_Read1Byte(0x04+(rom*10)) == 0 && alarm_bit == 2 || alarm_bit == 3){
		//**这里将写入一个或是调用无线遥控键值处理程序**
	}
}
/********************************************************************************************
//定时值校对&处理函数
//search_time()
*********************************************************************************************/    
void search_time(void){//整个流程必须在1秒里完成,不然将有部分定时值不响应。
	uint8 timeS,s,i;
	static unsigned char data alarmS[25];
	alarm_con = 0;
	s = read_clock(0x81);//读取秒数据
	for(i=0;i<25;i++){
		alarmS[i] = AT24C02_Read1Byte(0x0B+i*10);//一次性将全部项目中的秒数据送入数组中
	}
	for(i=0;i<25;i++){
		if(alarmS[i] != 0xff){//不为0xff则表示这项已经设置
			alarm_con++;//定时项目个数寄存位
			if(s == alarmS[i]){
				timeS = AT24C02_Read1Byte(0x0a+(i*10));
				if(timeS == read_clock(0x83) || timeS == 0xff){//校验 分钟
					timeS = AT24C02_Read1Byte(0x09+(i*10));
					if(timeS == read_clock(0x85) || timeS == 0xff){//校验 小时 
						timeS = AT24C02_Read1Byte(0x08+(i*10));
						if(timeS == read_clock(0x8b) || timeS == 0xff){//校验 星期 
							timeS = AT24C02_Read1Byte(0x07+(i*10));	
							if(timeS == read_clock(0x87) || timeS == 0xff){//校验 日
								timeS = AT24C02_Read1Byte(0x06+(i*10));
								if(timeS == read_clock(0x89) || timeS == 0xff){//校验 月
									timeS = AT24C02_Read1Byte(0x05+(i*10));
									if(timeS == read_clock(0x8d) || timeS == 0xff){//校验 年
										rom = i;//走到响应的位置

										ALARMing();//** 闹钟和无线遥控的键值处理 **
										//**这里将调用一个到时的响应程序alarming();
}	}	}	}	}	}	}	}	}	} 
/********************************************************************************************
//系统主程序 // 菜单切换
//main()
*********************************************************************************************/    
void main (void){
beep_a();
keyboard_int ();
LCM2402_Init();//LCM2402初始化
Init_1302();//检测时钟芯片是否未被初始化   
CgramWrite();
print(0x80,"Dy-2402C  V1.0 (BETA)");
print(0xc2,"http://www.doyoung.net");
DelayS(5000);
LCM2402_Init();//LCM2402初始化
beep_y();

                           
while(1){//主线程//
//-----------------------------------------------------------------------------0 主显示
	if(menu == 0){
		RealTime_Display(); 			//在第一行显示时间部分 
		print(0xc6," !AL");
		print2(0xca,AT24C02_Read1Byte(0x03)+0x30);
		print(0xcb,"  Used: ");
		print2(0xd3,alarm_con/16+0x30);
		print2(0xd4,alarm_con%16+0x30);
		print(0xd5,"/25");
		printTemperature();//显示温度
		search_time();//定时值校对&处理函数
		if (DT != 0xff){
			if(DT>=0x00 && DT <0x0a){
				uint16 i;
				uint8 n=0,x=0xff,y=0xff;
		  		LCM2402_Init();//LCM2402初始化
				for(i=0;i<500;i++){
					print(0x83,"{ Controller NO. }");
					print(0xc3,"{------ ");
					print(0xcd," ------}");
					if(DT>=0x00 && DT <0x0a){
						switch (n){
							case 0: x = DT;n++;i=0;break;//
							case 1: y = DT;n--;i=0;break;//
						}
					print2(0xcb,x%16+0x30);
					print2(0xcc,y%16+0x30);
					beep_k();
					DelayS250();
					DT = 0xff;
					}
					if(DT == 0x4C){
						print(0xca,"{OK}");
						
						
						//ALARMing(i);//** 闹钟和无线遥控的键值处理 **

						DelayS250();beep_y();DT = 0xff;
					}
				}
			}
			if(DT>0x12 && DT <0x17){//当按定时加减查看的几个键时会进入定时查看菜单
				beep_y();menu = 2;
			}
			switch (DT){
				uint8 alarm_bit;
				case 0x1c: beep_y();menu = 1;break;//
				case 0x2F: beep_y();menu =99;break;//
				case 0x19: {alarm_bit++;if(alarm_bit>3){alarm_bit=0;};
							AT24C02_Write1Byte(0x03,alarm_bit);
							DelayS(500);beep_y();break;
							}//定时动作选择:0 全关 1 只开闹钟 2 只开控制动作 3 全开
				default:DT = 0xff;break;
			}
		LCM2402_Init();//LCM2402初始化
		DT = 0xff;
		}
	}
//-----------------------------------------------------------------------------1 是否调时?
	if(menu == 1){      	
	    print(0x80,"Set The Real Time ?");
	    print(0xc5,"PP: OK   AV: Esc");
		if (DT != 0xff){
			switch (DT){
				case 0x1D: beep_n();menu = 0;break;//
				case 0x1B: beep_y();menu = 11;break;//
				default:DT = 0xff;break;
			}
		LCM2402_Init();//LCM2402初始化
		DT = 0xff;
		}
	}
//-----------------------------------------------------------------------------2 定时查看
	if(menu == 2){
		alarm_Display(); 			//在第一行显示定时部分
		print(0xc3,"] NO.");
		print2(0xc8,0x30+rom/10);
		print2(0xc9,0x30+rom%10);
		print(0xce,"STORE: Set"); 
		if (DT != 0xff){
			switch (DT){
				case 0x18: beep_y();menu = 12;break;//
				case 0x13: beep_k();rom++;break;//
				case 0x14: beep_k();rom--;break;//
				case 0x15: beep_k();rom=rom+5;break;//
				case 0x16: beep_k();rom=rom-5;break;//
				case 0x1D: beep_n();menu = 0;break;//
				default:DT = 0xff;break;
			}
		if(rom >24 && rom <100){ rom = 0;}//当
		if(rom >200){ rom = 24;}
		LCM2402_Init();//LCM2402初始化
		DT = 0xff;
		}
	}
//-----------------------------------------------------------------------------99 帮助菜单
	if(menu == 99){
		uint8 i;
		if (DT != 0xff){
			if(DT == 0x2F){
				i++;
				if(i >9){i=0;}
				DelayS(500);beep_k();      	
			}
			if(DT == 0x1D){
				i = 0;
				beep_n();menu = 0;
			}
		LCM2402_Init();//LCM2402初始化												
		DT = 0xff;
		}
		switch (i){
			case 0: print(0x80,"AV: Esc Help");print(0xc0,"MUTE: Next Help Page");break;//
			case 1: print(0x80,"SLEEP: Set The Real Time");print(0xc0,"00~99: Controller NO.");break;//
			case 2: print(0x80,"POWER: Key ON/OFF");print(0xc0,"RECALL: Alarm ON/OFF");break;//
			case 3: print(0x80,"VOL+/-: Up/Down");print(0xc0,"PR.+/-: Alarm +/-1");break;//
			case 4: print(0x80,"F.T.+/-: Alarm +/-5");print(0xc0,"STORE: Set Alarm");break;//
			case 5: print(0x80,"-/--: Jumping");print(0xc0,"SEARCH: Set to ??");break;//
			case 6: print(0x80,"!AL0: BEEP & ALARM OFF");print(0xc0,"!AL1: Only BEEP ON");break;//
			case 7: print(0x80,"!AL2: Only ALARM ON");print(0xc0,"!AL3: BEEP & ALARM ON");break;//
			case 8: print(0x80,"PP: OK!");print(0xc0,"AV: Exit/Clean!");break;//
			case 9: print(0x81,"DoYoung.net | Dy-2402C");print(0xc5,"V1.0 2007-5-10 ");break;//
			default:break;
		}
	}
//-----------------------------------------------------------------------------11 调时输入
	if(menu == 11){
		static unsigned char i=0;
		bit k;//定义静态 
		RealTime_Display(); 			//在第一行显示时间部分
		for(i=1;i<8;){//8个时钟数据的循环加位
			switch (i){//显示设置项的说明
				case 7:		print(0xc0,"AV:Esc (Second 00~59)^^");break;//		
				case 6:		print(0xc4,"(Minute 00~59)^^");break;//		
				case 5:		print(0xc3,"(Hour 00~23)^^");break;//		
				case 4:		print(0xcc,"^(Week 1~7)");break;//			
				case 3:		print(0xc8,"^^(Date 01~31)");break;//			
				case 2:		print(0xc5,"^^(Month 01~12)");break;//		
				case 1:		print(0xc2,"^^(Year 00~99) AV:Esc");break;//			
			}
			print(0x97,"?");
			if(DT>=0x00 && DT < 0x0a){//DT办数据键码时动作 
				if(i == 4){//如果是星期设置则不必输入“十位”数据
					k = 1;
				}
				Set_time(i,k);//在这里调用写时间的程序项
				if(k==0){//第一次按键输入到“十位”
					k = 1;
				} 
				else{//否则是第二次按键,输入到“个位”
					k = 0;
					i++;
				}
			LRDD();//清屏+刷新显示+延时+清空DT 一体函数
			beep_k();
			}
			if(DT ==  0x11 || DT == 0x17){
				i++;
				LRDD();
				beep_y();
			}
			if(DT ==  0x1A){
				i--;if(i < 1){ i =7;};
				LRDD();
				beep_y();
			}

			if (DT == 0x1D){//按 AV 键退回到主界面 
				LRDD();
				beep_n();menu = 0;
				i = 9;//用于退出上一级的for循环
			}		 
		}
	}
//-----------------------------------------------------------------------------12 定时值输入
	if(menu == 12){
		static unsigned char i=0;
		bit k;//定义静态 
		alarm_Display(); 			//在第一行显示时间部分
		for(i=1;i<9;){//8个时钟数据的循环加位
			switch (i){//显示设置项的说明
				case 8:		print(0xc3,"< (Controller 00~99)");break;//		
				case 7:		print(0xc7,"(Second 00~59)^^");break;//		
				case 6:		print(0xc4,"(Minute 00~59)^^");break;//		
				case 5:		print(0xc3,"(Hour 00~23)^^");break;//		
				case 4:		print(0xcc,"^(Week 1~7)");break;//			
				case 3:		print(0xc8,"^^(Date 01~31)");break;//			
				case 2:		print(0xc5,"^^(Month 01~12)");break;//		
				case 1:		print(0xc2,"^^(Year 00~99)  AV:Esc");break;//			
			}
			print(0x97,"!");
			if(DT>=0x00 && DT < 0x0a || DT == 0x12){//DT办数据键码时动作 
				if(i == 4 || DT == 0x12){//如果是星期设置则不必输入“十位”数据
					k = 1;
				}
				Set_alarm(rom,i,k);//在这里调用写时间的程序项
				if(k==0){//第一次按键输入到“十位”
					k = 1;
				} 
				else{//否则是第二次按键,输入到“个位”
					k = 0;
					i++;
				}
			LADD();//清屏+刷新显示+延时+清空DT 一体函数
			beep_k();
			}
			switch (DT){//显示设置项的说明
				case 0x11:		//i++;LADD();break;//// -/--	VOL+ SEARCH 则跳到下一项		
				case 0x12:		//i++;LADD();break;//// -/--	VOL+ SEARCH 则跳到下一项		
				case 0x17:		beep_y();i++;LADD();break;//// -/--	VOL+ SEARCH 则跳到下一项		
				case 0x1A:		beep_y();i--;if(i < 1){ i =8;};LADD();break;////VOL- 跳回上一项	//循环设备	
				case 0x1D:		beep_n();LADD();menu = 0;i = 19;break;////按 AV 键退回到主界面//i = 9;用于退出上一级的for循环			
			}
		}
	}
	LED1 = 1;//关LED1

}
}
/********************************************************************************************    
//日志//
//2007-5-8//这时已经基本完成了除24C02的IC驱动,完成主时间的显示和调整。
//2007-5-10//加入菜单帮助项目
//2007-5-11//加入了25路定时器设置(全部项目),红外遥控器上的所有按键定义完成。
//2007-5-13//V1.0版本完成,整理并存档。


/********************************************************************************************/    

⌨️ 快捷键说明

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