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

📄 2402test.lst

📁 基于单片机和液晶2402的数字钟     包含电路图及源码
💻 LST
📖 第 1 页 / 共 4 页
字号:
 839          *********************************************************************************************/    
 840          void ALARMing(void){
 841   1      	uint8 alarm_bit;
 842   1      	alarm_bit = AT24C02_Read1Byte(0x03);              // 从AT24C02的地址0x03读出定时报警设置数据
 843   1      	if(AT24C02_Read1Byte(0x04+(rom*10)) < 2 && alarm_bit == 1 || alarm_bit == 3){//键值值为0则是闹钟,不为0则
             -是无线控制
 844   2      		if(AT24C02_Read1Byte(0x04+(rom*10)) == 0){
 845   3      			BEEPing();
 846   3      		}else{
 847   3      			beep_y();//
 848   3      		}	
 849   2      	}
 850   1      	if(AT24C02_Read1Byte(0x04+(rom*10)) == 0 && alarm_bit == 2 || alarm_bit == 3){
 851   2      		//**这里将写入一个或是调用无线遥控键值处理程序**
 852   2      	}
 853   1      }
 854          /********************************************************************************************
 855          //定时值校对&处理函数
 856          //search_time()
 857          *********************************************************************************************/    
 858          void search_time(void){//整个流程必须在1秒里完成,不然将有部分定时值不响应。
 859   1      	uint8 timeS,s,i;
 860   1      	static unsigned char data alarmS[25];
C51 COMPILER V6.12  2402TEST                                                               08/29/2007 22:42:54 PAGE 15  

 861   1      	alarm_con = 0;
 862   1      	s = read_clock(0x81);//读取秒数据
 863   1      	for(i=0;i<25;i++){
 864   2      		alarmS[i] = AT24C02_Read1Byte(0x0B+i*10);//一次性将全部项目中的秒数据送入数组中
 865   2      	}
 866   1      	for(i=0;i<25;i++){
 867   2      		if(alarmS[i] != 0xff){//不为0xff则表示这项已经设置
 868   3      			alarm_con++;//定时项目个数寄存位
 869   3      			if(s == alarmS[i]){
 870   4      				timeS = AT24C02_Read1Byte(0x0a+(i*10));
 871   4      				if(timeS == read_clock(0x83) || timeS == 0xff){//校验 分钟
 872   5      					timeS = AT24C02_Read1Byte(0x09+(i*10));
 873   5      					if(timeS == read_clock(0x85) || timeS == 0xff){//校验 小时 
 874   6      						timeS = AT24C02_Read1Byte(0x08+(i*10));
 875   6      						if(timeS == read_clock(0x8b) || timeS == 0xff){//校验 星期 
 876   7      							timeS = AT24C02_Read1Byte(0x07+(i*10));	
 877   7      							if(timeS == read_clock(0x87) || timeS == 0xff){//校验 日
 878   8      								timeS = AT24C02_Read1Byte(0x06+(i*10));
 879   8      								if(timeS == read_clock(0x89) || timeS == 0xff){//校验 月
 880   9      									timeS = AT24C02_Read1Byte(0x05+(i*10));
 881   9      									if(timeS == read_clock(0x8d) || timeS == 0xff){//校验 年
 882  10      										rom = i;//走到响应的位置
 883  10      
 884  10      										ALARMing();//** 闹钟和无线遥控的键值处理 **
 885  10      										//**这里将调用一个到时的响应程序alarming();
 886  10      }	}	}	}	}	}	}	}	}	} 
 887          /********************************************************************************************
 888          //系统主程序 // 菜单切换
 889          //main()
 890          *********************************************************************************************/    
 891          void main (void){
 892   1      beep_a();
 893   1      keyboard_int ();
 894   1      LCM2402_Init();//LCM2402初始化
 895   1      Init_1302();//检测时钟芯片是否未被初始化   
 896   1      CgramWrite();
 897   1      print(0x80,"Dy-2402C  V1.0 (BETA)");
 898   1      print(0xc2,"http://www.doyoung.net");
 899   1      DelayS(5000);
 900   1      LCM2402_Init();//LCM2402初始化
 901   1      beep_y();
 902   1      
 903   1                                 
 904   1      while(1){//主线程//
 905   2      //-----------------------------------------------------------------------------0 主显示
 906   2      	if(menu == 0){
 907   3      		RealTime_Display(); 			//在第一行显示时间部分 
 908   3      		print(0xc6," !AL");
 909   3      		print2(0xca,AT24C02_Read1Byte(0x03)+0x30);
 910   3      		print(0xcb,"  Used: ");
 911   3      		print2(0xd3,alarm_con/16+0x30);
 912   3      		print2(0xd4,alarm_con%16+0x30);
 913   3      		print(0xd5,"/25");
 914   3      		printTemperature();//显示温度
 915   3      		search_time();//定时值校对&处理函数
 916   3      		if (DT != 0xff){
 917   4      			if(DT>=0x00 && DT <0x0a){
 918   5      				uint16 i;
 919   5      				uint8 n=0,x=0xff,y=0xff;
 920   5      		  		LCM2402_Init();//LCM2402初始化
 921   5      				for(i=0;i<500;i++){
 922   6      					print(0x83,"{ Controller NO. }");
C51 COMPILER V6.12  2402TEST                                                               08/29/2007 22:42:54 PAGE 16  

 923   6      					print(0xc3,"{------ ");
 924   6      					print(0xcd," ------}");
 925   6      					if(DT>=0x00 && DT <0x0a){
 926   7      						switch (n){
 927   8      							case 0: x = DT;n++;i=0;break;//
 928   8      							case 1: y = DT;n--;i=0;break;//
 929   8      						}
 930   7      					print2(0xcb,x%16+0x30);
 931   7      					print2(0xcc,y%16+0x30);
 932   7      					beep_k();
 933   7      					DelayS250();
 934   7      					DT = 0xff;
 935   7      					}
 936   6      					if(DT == 0x4C){
 937   7      						print(0xca,"{OK}");
 938   7      						
 939   7      						
 940   7      						//ALARMing(i);//** 闹钟和无线遥控的键值处理 **
 941   7      
 942   7      						DelayS250();beep_y();DT = 0xff;
 943   7      					}
 944   6      				}
 945   5      			}
 946   4      			if(DT>0x12 && DT <0x17){//当按定时加减查看的几个键时会进入定时查看菜单
 947   5      				beep_y();menu = 2;
 948   5      			}
 949   4      			switch (DT){
 950   5      				uint8 alarm_bit;
 951   5      				case 0x1c: beep_y();menu = 1;break;//
 952   5      				case 0x2F: beep_y();menu =99;break;//
 953   5      				case 0x19: {alarm_bit++;if(alarm_bit>3){alarm_bit=0;};
 954   6      							AT24C02_Write1Byte(0x03,alarm_bit);
 955   6      							DelayS(500);beep_y();break;
 956   6      							}//定时动作选择:0 全关 1 只开闹钟 2 只开控制动作 3 全开
 957   5      				default:DT = 0xff;break;
 958   5      			}
 959   4      		LCM2402_Init();//LCM2402初始化
 960   4      		DT = 0xff;
 961   4      		}
 962   3      	}
 963   2      //-----------------------------------------------------------------------------1 是否调时?
 964   2      	if(menu == 1){      	
 965   3      	    print(0x80,"Set The Real Time ?");
 966   3      	    print(0xc5,"PP: OK   AV: Esc");
 967   3      		if (DT != 0xff){
 968   4      			switch (DT){
 969   5      				case 0x1D: beep_n();menu = 0;break;//
 970   5      				case 0x1B: beep_y();menu = 11;break;//
 971   5      				default:DT = 0xff;break;
 972   5      			}
 973   4      		LCM2402_Init();//LCM2402初始化
 974   4      		DT = 0xff;
 975   4      		}
 976   3      	}
 977   2      //-----------------------------------------------------------------------------2 定时查看
 978   2      	if(menu == 2){
 979   3      		alarm_Display(); 			//在第一行显示定时部分
 980   3      		print(0xc3,"] NO.");
 981   3      		print2(0xc8,0x30+rom/10);
 982   3      		print2(0xc9,0x30+rom%10);
 983   3      		print(0xce,"STORE: Set"); 
 984   3      		if (DT != 0xff){
C51 COMPILER V6.12  2402TEST                                                               08/29/2007 22:42:54 PAGE 17  

 985   4      			switch (DT){
 986   5      				case 0x18: beep_y();menu = 12;break;//
 987   5      				case 0x13: beep_k();rom++;break;//
 988   5      				case 0x14: beep_k();rom--;break;//
 989   5      				case 0x15: beep_k();rom=rom+5;break;//
 990   5      				case 0x16: beep_k();rom=rom-5;break;//
 991   5      				case 0x1D: beep_n();menu = 0;break;//
 992   5      				default:DT = 0xff;break;
 993   5      			}
 994   4      		if(rom >24 && rom <100){ rom = 0;}//当
 995   4      		if(rom >200){ rom = 24;}
 996   4      		LCM2402_Init();//LCM2402初始化
 997   4      		DT = 0xff;
 998   4      		}
 999   3      	}
1000   2      //-----------------------------------------------------------------------------99 帮助菜单
1001   2      	if(menu == 99){
1002   3      		uint8 i;
1003   3      		if (DT != 0xff){
1004   4      			if(DT == 0x2F){
1005   5      				i++;
1006   5      				if(i >9){i=0;}
1007   5      				DelayS(500);beep_k();      	
1008   5      			}
1009   4      			if(DT == 0x1D){
1010   5      				i = 0;
1011   5      				beep_n();menu = 0;
1012   5      			}
1013   4      		LCM2402_Init();//LCM2402初始化												
1014   4      		DT = 0xff;
1015   4      		}
1016   3      		switch (i){
1017   4      			case 0: print(0x80,"AV: Esc Help");print(0xc0,"MUTE: Next Help Page");break;//
1018   4      			case 1: print(0x80,"SLEEP: Set The Real Time");print(0xc0,"00~99: Controller NO.");break;//
1019   4      			case 2: print(0x80,"POWER: Key ON/OFF");print(0xc0,"RECALL: Alarm ON/OFF");break;//
1020   4      			case 3: print(0x80,"VOL+/-: Up/Down");print(0xc0,"PR.+/-: Alarm +/-1");break;//
1021   4      			case 4: print(0x80,"F.T.+/-: Alarm +/-5");print(0xc0,"STORE: Set Alarm");break;//
1022   4      			case 5: print(0x80,"-/--: Jumping");print(0xc0,"SEARCH: Set to ??");break;//
1023   4      			case 6: print(0x80,"!AL0: BEEP & ALARM OFF");print(0xc0,"!AL1: Only BEEP ON");break;//
1024   4      			case 7: print(0x80,"!AL2: Only ALARM ON");print(0xc0,"!AL3: BEEP & ALARM ON");break;//
1025   4      			case 8: print(0x80,"PP: OK!");print(0xc0,"AV: Exit/Clean!");break;//
1026   4      			case 9: print(0x81,"DoYoung.net | Dy-2402C");print(0xc5,"V1.0 2007-5-10 ");break;//
1027   4      			default:break;
1028   4      		}
1029   3      	}
1030   2      //-----------------------------------------------------------------------------11 调时输入
1031   2      	if(menu == 11){
1032   3      		static unsigned char i=0;
1033   3      		bit k;//定义静态 
1034   3      		RealTime_Display(); 			//在第一行显示时间部分
1035   3      		for(i=1;i<8;){//8个时钟数据的循环加位
1036   4      			switch (i){//显示设置项的说明
1037   5      				case 7:		print(0xc0,"AV:Esc (Second 00~59)^^");break;//		
1038   5      				case 6:		print(0xc4,"(Minute 00~59)^^");break;//		
1039   5      				case 5:		print(0xc3,"(Hour 00~23)^^");break;//		
1040   5      				case 4:		print(0xcc,"^(Week 1~7)");break;//			
1041   5      				case 3:		print(0xc8,"^^(Date 01~31)");break;//			
1042   5      				case 2:		print(0xc5,"^^(Month 01~12)");break;//		
1043   5      				case 1:		print(0xc2,"^^(Year 00~99) AV:Esc");break;//			
1044   5      			}
1045   4      			print(0x97,"?");
1046   4      			if(DT>=0x00 && DT < 0x0a){//DT办数据键码时动作 
C51 COMPILER V6.12  2402TEST                                                               08/29/2007 22:42:54 PAGE 18  

1047   5      				if(i == 4){//如果是星期设置则不必输入“十位”数据
1048   6      					k = 1;
1049   6      				}
1050   5      				Set_time(i,k);//在这里调用写时间的程序项
1051   5      				if(k==0){//第一次按键输入到“十位”
1052   6      					k = 1;
1053   6      				} 
1054   5      				else{//否则是第二次按键,输入到“个位”
1055   6      					k = 0;
1056   6      					i++;
1057   6      				}
1058   5      			LRDD();//清屏+刷新显示+延时+清空DT 一体函数
1059   5      			beep_k();
1060   5      			}
1061   4      			if(DT ==  0x11 || DT == 0x17){
1062   5      				i++;
1063   5      				LRDD();
1064   5      				beep_y();
1065   5      			}
1066   4      			if(DT ==  0x1A){
1067   5      				i--;if(i < 1){ i =7;};
1068   5      				LRDD();
1069   5      				beep_y();
1070   5      			}
1071   4      
1072   4      			if (DT == 0x1D){//按 AV 键退回到主界面 
1073   5      				LRDD();
1074   5      				beep_n();menu = 0;
1075   5      				i = 9;//用于退出上一级的for循环
1076   5      			}		 
1077   4      		}
1078   3      	}
1079   2      //-----------------------------------------------------------------------------12 定时值输入
1080   2      	if(menu == 12){
1081   3      		static unsigned char i=0;
1082   3      		bit k;//定义静态 
1083   3      		alarm_Display(); 			//在第一行显示时间部分
1084   3      		for(i=1;i<9;){//8个时钟数据的循环加位
1085   4      			switch (i){//显示设置项的说明
1086   5      				case 8:		print(0xc3,"< (Controller 00~99)");break;//		
1087   5      				case 7:		print(0xc7,"(Second 00~59)^^");break;//		
1088   5      				case 6:		print(0xc4,"(Minute 00~59)^^");break;//		
1089   5      				case 5:		print(0xc3,"(Hour 00~23)^^");break;//		
1090   5      				case 4:		print(0xcc,"^(Week 1~7)");break;//			
1091   5      				case 3:		print(0xc8,"^^(Date 01~31)");break;//			
1092   5      				case 2:		print(0xc5,"^^(Month 01~12)");break;//		
1093   5      				case 1:		print(0xc2,"^^(Year 00~99)  AV:Esc");break;//			
1094   5      			}
1095   4      			print(0x97,"!");
1096   4      			if(DT>=0x00 && DT < 0x0a || DT == 0x12){//DT办数据键码时动作 
1097   5      				if(i == 4 || DT == 0x12){//如果是星期设置则不必输入“十位”数据
1098   6      					k = 1;
1099   6      				}
1100   5      				Set_alarm(rom,i,k);//在这里调用写时间的程序项
1101   5      				if(k==0){//第一次按键输入到“十位”
1102   6      					k = 1;
1103   6      				} 
1104   5      				else{//否则是第二次按键,输入到“个位”
1105   6      					k = 0;
1106   6      					i++;
1107   6      				}
1108   5      			LADD();//清屏+刷新显示+延时+清空DT 一体函数
C51 COMPILER V6.12  2402TEST                                                               08/29/2007 22:42:54 PAGE 19  

1109   5      			beep_k();
1110   5      			}
1111   4      			switch (DT){//显示设置项的说明
1112   5      				case 0x11:		//i++;LADD();break;//// -/--	VOL+ SEARCH 则跳到下一项		
1113   5      				case 0x12:		//i++;LADD();break;//// -/--	VOL+ SEARCH 则跳到下一项		
1114   5      				case 0x17:		beep_y();i++;LADD();break;//// -/--	VOL+ SEARCH 则跳到下一项		
1115   5      				case 0x1A:		beep_y();i--;if(i < 1){ i =8;};LADD();break;////VOL- 跳回上一项	//循环设备	
1116   5      				case 0x1D:		beep_n();LADD();menu = 0;i = 19;break;////按 AV 键退回到主界面//i = 9;用于退出上一级的for

⌨️ 快捷键说明

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