📄 quan.lst
字号:
876 /*************************************************************************************************/
877 /////////////////////////////////////////////
878 ///// 函数名: 读出字节完整子函数 //////
879 ///// 函数功能: 从DS1302读出一个字节 //////
880 ///// 调用: InputByte(); OutputByte() //////
881 ///// 函数参数: 无 //////
882 ///// 返回值: 有(读出的字节内容) //////
883 /////////////////////////////////////////////
884
885 ReadFrom1302(unsigned char Add)
886 {
887 1 unsigned char Date;
888 1 RST2 = 0;
889 1 CLK = 0;
890 1 RST2 = 1;
891 1 InputByte(Add); // 先给地址,命令 //
892 1 Date = OutputByte(); // 再读一字节数据 //
893 1 CLK = 1;
894 1 RST2 =0;
895 1 return(Date);
896 1 }
897 /*************************************************************************************************/
898 /////////////////////////////////////////////////////////////////////////////////
899 ///// 函数名称: SetTime /////
- /////
900 ///// 功能: 设置初始时间 /////
901 ///// 调用: WriteTo1302() /////
902 ///// 输入: pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年 /////
903 ///// 返回值: 无 /////
904 /////////////////////////////////////////////////////////////////////////////////
905
906 void SetTime(unsigned char *pSecDa)
907 {
908 1 unsigned char i;
909 1 unsigned char Addr = 0x80;
910 1 WriteTo1302(0x8e,0x00); // 控制命令,WP=0,写操作 //
911 1 for(i =0;i<7;i++)
912 1 {
913 2 WriteTo1302(Addr,*pSecDa); // 秒 分 时 日 月 星期 年 //
914 2 pSecDa++;
915 2 Addr +=2;
916 2 }
917 1 WriteTo1302(0x8e,0x80); // 控制命令,WP=1,写保护 //
918 1 }
919 /**************************************************************************************************/
920 //////////////////////////////////////////////////////////////////////////////////////
921 ///// 名称: GetTime /////
922 ///// 说明: /////
C51 COMPILER V8.02 QUAN 07/29/2008 20:35:20 PAGE 16
923 ///// 功能: 读取DS1302当前时间 /////
924 ///// 调用: uc_R1302() /////
925 ///// 输入: ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年 /////
926 ///// 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B /////
927 ///// 返回值: 无 /////
928 //////////////////////////////////////////////////////////////////////////////////////
929
930 void GetTime(void)
931 {
932 1 unsigned char i;
933 1 unsigned char Addr = 0x81;
934 1 for (i=0;i<7;i++)
935 1 {
936 2 Curtime[i] = ReadFrom1302(Addr); // 格式为: 秒 分 时 日 月 星期 年 //
937 2 Addr += 2;
938 2 }
939 1 sec = Curtime[0];
940 1 min = Curtime[1];
941 1 hour = Curtime[2];
942 1 date = Curtime[3];
943 1 month = Curtime[4];
944 1 day = Curtime[5];
945 1 year = Curtime[6];
946 1 }
947 /**************************************************************************************************/
948 ////////////////////////////////////////////////////
949 ///// 函数名: 定时器T0初始化子函数 //////
950 ///// 函数功能: 初始化T0定时50ms //////
951 ///// 调用: 无 //////
952 ///// 函数参数: 无 //////
953 ///// 返回值: 无 //////
954 ////////////////////////////////////////////////////
955
956 void Init_T0(void)
957 {
958 1 TMOD=0x01; //定时器T0,工作模式1//
959 1 TH0=0x3c; //50ms//
960 1 TL0=0xb0;
961 1 EA=1;
962 1 ET0=1;
963 1 TR0=1;
964 1 }
965 /**************************************************************************************************/
966 ////////////////////////////////////////////////////
967 ///// 函数名: 闪烁信号产生子函数 //////
968 ///// 函数功能: 用定时中断方式产生闪烁信号 //////
969 ///// 调用: 无 //////
970 ///// 函数参数: 无 //////
971 ///// 返回值: 无 //////
972 ////////////////////////////////////////////////////
973
974 void T0_flash(void) interrupt 1 // 中断程序,产生时钟秒信号 //
975 {
976 1 TR0=0;
977 1 fla_cou++;
978 1 if(fla_cou==10) //闪烁间隔为50ms*10次=500ms//
979 1 {
980 2 flash=!flash;
981 2 fla_cou=0;
982 2 }
983 1 TH0=0x3c; //50ms//
984 1 TL0=0xb0;
C51 COMPILER V8.02 QUAN 07/29/2008 20:35:20 PAGE 17
985 1 TR0=1;
986 1 }
987 /**************************************************************************************************/
988 ////////////////////////////////////////////////////
989 ///// 函数名: 时间闪烁子函数 //////
990 ///// 函数功能: 选择确定闪烁位等待调整 //////
991 ///// 调用: Add(); //////
992 ///// 函数参数: 无 //////
993 ///// 返回值: 无 //////
994 ////////////////////////////////////////////////////
995
996 void FlashKey(void) //闪烁子函数//
997 {
998 1 if(P2_5==0)
999 1 {
1000 2 while(P2_5==0)
1001 2 Refresh();
1002 2 n++;
1003 2 }
1004 1 if(n==8) n=0;
1005 1 if(n!=1) K1=1;
1006 1 if(n!=2) K2=1;
1007 1 if(n!=3) K3=1;
1008 1 if(n!=4) K4=1;
1009 1 if(n!=5) K5=1;
1010 1 if(n!=6) K6=1;
1011 1 if(n!=7) K7=1;
1012 1 switch(n)
1013 1 {
1014 2 case 0:KT=0;break;
1015 2 case 1:K1=flash;hms=year;KT=1;break; //hms为调时临时变量,需要调整某位时则先把其初始值放到hms中/
-/
1016 2 case 2:K2=flash;hms=month;KT=1;break;
1017 2 case 3:K3=flash;hms=date;KT=1;break;
1018 2 case 4:K4=flash;hms=hour;KT=1;break;
1019 2 case 5:K5=flash;hms=min;KT=1;break;
1020 2 case 6:K6=flash;hms=sec;KT=1;break;
1021 2 case 7:K7=flash;hms=day;KT=1;break;
1022 2 }
1023 1 tiaoshi();
1024 1 }
1025 /*********************************************************************************************************
-/
1026 ////////////////////////////////////////////////////
1027 ///// 函数名: 时间调整子函数 //////
1028 ///// 函数功能: 对闪烁位进行调整(加减一) //////
1029 ///// 调用: SetTime();Refresh(); //////
1030 ///// 函数参数: 无 //////
1031 ///// 返回值: 无 //////
1032 ////////////////////////////////////////////////////
1033
1034 void tiaoshi(void) //调时子函数//
1035 {
1036 1 signed char item,max,mini;
1037 1 unsigned char ye;
1038 1 item=(hms/16)*10+hms%16;
1039 1 ye=(year/16)*10+year%16;
1040 1 if(P2_6==0) //按P2_6键进行时间加调整//
1041 1 {
1042 2 while(P2_6==0)
1043 2 Refresh();
1044 2 if(KT==1) //检验可调标志位KT//
C51 COMPILER V8.02 QUAN 07/29/2008 20:35:20 PAGE 18
1045 2 {
1046 3 item++;
1047 3 if(n==1) {max=99; mini=0;} //根据n不同,返回给不同的位: n=1 -> 返回给年位//
1048 3 if(n==2) {max=12; mini=1;} // n=2 -> 返回给月位//
1049 3 if((n==3)&(ye%4)) {max=28; mini=1;} //不闰年2月28天 依次类推 //
1050 3 if(!(ye%4)&(n==3)) {max=29; mini=1;} // 闰年2月29天
1051 3 if((n==3)&((month==0x01)|(month==0x03)|(month==0x05)|(month==0x07)|(month==0x08)|(month==0x10)|(month==
-0x12)))
1052 3 {max=31; mini=1;} //1,3,5,7,8,10,12月31天
1053 3 if((n==3)&((month==0x04)|(month==0x06)|(month==0x09)|(month==0x11)))
1054 3 {max=30; mini=1;} //4,6,9,11月满30天
1055 3 if(n==4) {max=23; mini=0;} // 24小时制 //
1056 3 if(n==5) {max=59; mini=0;}
1057 3 if(n==6) {max=59; mini=0;}
1058 3 if(n==7) {max=7; mini=1;}
1059 3 if(item>max)
1060 3 item=mini;
1061 3 hms=(item/10)*16+item%10;
1062 3 switch(n)
1063 3 {
1064 4 case 1:year=hms;break; //根据n不同,返回给不同的位: n=1 -> 返回给年位 //
1065 4 case 2:month=hms;break; // n=2 -> 返回给月位 //
1066 4 case 3:date=hms;break; // n=3 -> 返回给日位 //
1067 4 case 4:hour=hms;break; // n=4 -> 返回给小时位//
1068 4 case 5:min=hms;break; // 依次类推 //
1069 4 case 6:sec=hms;break;
1070 4 case 7:day=hms;break;
1071 4 }
1072 3 Curtime[0] = sec;
1073 3 Curtime[1] = min;
1074 3 Curtime[2] = hour;
1075 3 Curtime[3] = date;
1076 3 Curtime[4] = month;
1077 3 Curtime[5] = day;
1078 3 Curtime[6] = year;
1079 3 SetTime(&Curtime[0]); // 将调整过后的时间值写入DS1302 //
1080 3 }
1081 2 }
1082 1 if(P2_7==0) //按P2_7键进行时间减调整//
1083 1 {
1084 2 while(P2_7==0)
1085 2 Refresh();
1086 2 if(KT==1) //检验可调标志位KT//
1087 2 {
1088 3 item--;
1089 3 if(n==1) {max=99; mini=0;} //根据n不同,返回给不同的位: n=1 -> 返回给年位//
1090 3 if(n==2) {max=12; mini=1;} // n=2 -> 返回给月位//
1091 3 if((n==3)&(ye%4)) {max=28; mini=1;} //不闰年2月28天 依次类推 //
1092 3 if(!(ye%4)&(n==3)) {max=29; mini=1;} // 闰年2月2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -