|
|
@@ -0,0 +1,760 @@
|
|
|
+C51 COMPILER V8.02 LED时钟 07/22/2014 16:33:38 PAGE 1
|
|
|
+
|
|
|
+
|
|
|
+C51 COMPILER V8.02, COMPILATION OF MODULE LED时钟
|
|
|
+OBJECT MODULE PLACED IN LED时钟.OBJ
|
|
|
+COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE LED时钟.c BROWSE DEBUG OBJECTEXTEND
|
|
|
+
|
|
|
+line level source
|
|
|
+
|
|
|
+ 1 #include <REGx51.H>
|
|
|
+ 2 #include "ds1302.h" //包含DS1302头文件
|
|
|
+ 3 #include "music_two_tiger.h"
|
|
|
+ 4 //#include "AT25F4096.h"
|
|
|
+ 5 sfr P0M1 = 0X93;
|
|
|
+ 6 sfr P0M0 = 0X94;
|
|
|
+ 7 sfr P1M1 = 0X91;
|
|
|
+ 8 sfr P1M0 = 0X92;
|
|
|
+ 9 sfr P2M1 = 0X95;
|
|
|
+ 10 sfr P2M0 = 0X96;
|
|
|
+ 11 #define leddata P0 //定义LED数据口
|
|
|
+ 12
|
|
|
+ 13 sbit SET=P2^0; //按键定义,下同
|
|
|
+ 14 sbit UP=P2^1;
|
|
|
+ 15 sbit DOWN=P2^2;
|
|
|
+ 16 sbit MODE=P2^3;
|
|
|
+ 17
|
|
|
+ 18 sbit led0=P2^7; //LED位选,因为布线不是按顺序布的,程序定义一下就可以了,下同
|
|
|
+ 19 sbit led1=P2^6;
|
|
|
+ 20 sbit led2=P2^5;
|
|
|
+ 21 sbit led3=P2^4;
|
|
|
+ 22
|
|
|
+ 23 sbit SYSLED=P1^4;
|
|
|
+ 24 sbit COL=P1^3;
|
|
|
+ 25
|
|
|
+ 26 volatile SYSTEMTIME SysTime;
|
|
|
+ 27 unsigned char s_state = HOU_MIN;
|
|
|
+ 28 //sbit led4=P2^6;
|
|
|
+ 29 //sbit led5=P2^5;
|
|
|
+ 30 //**************函数声明*****************
|
|
|
+ 31 void delays(unsigned char);
|
|
|
+ 32 void display(void);
|
|
|
+ 33 void Scan_Key(void);
|
|
|
+ 34 void id_case1_key();
|
|
|
+ 35 void id_case2_key();
|
|
|
+ 36 void Set_id(unsigned char ,unsigned char);
|
|
|
+ 37 //*************变量定义******************
|
|
|
+ 38 bit If_start_run_ringtime=0;
|
|
|
+ 39
|
|
|
+ 40 char per_run_time = _PER_RUN_TIME; //每首曲子运行2次
|
|
|
+ 41 char ring_space_1min = _RING_SPACE_1MIN; //每遍间隔1分钟
|
|
|
+ 42 char ring_run_time = _RING_RUN_TIME; //重复5遍
|
|
|
+ 43 char ring_flash_countdown = _RING_FLASH_COUNTDOWN/50; //闪烁3秒
|
|
|
+ 44
|
|
|
+ 45 unsigned char Ringtime_HOU=0xFF,Ringtime_MIN=0xFF,Ringtime_HOU_tmp=0xFF,Ringtime_MIN_tmp=0xFF;
|
|
|
+ 46 unsigned char id=0,timecount=0,re_disp=0,second_time=0; //定义用到的变量,id为调整模式用,不为0时表示调整
|
|
|
+ -模式,调整哪个量由id值确定
|
|
|
+ 47 //timecount用于500ms定时记数,时间到取反flag标志位,re_disp记数200次共10s,调整状态下按键无操作
|
|
|
+ -10s自动返回正常显示状态
|
|
|
+ 48 bit hour,minute,second,month,days,years_1,years_2,flag,flag_1302_1s,system_1s_flag; //定义位变量,hour,
|
|
|
+ -minute,second分别为调整时闪烁标志位,flag 500ms取反一次,调整位闪烁及冒号闪烁用
|
|
|
+ 49 unsigned char system_26s_flag;
|
|
|
+ 50 unsigned char set_flash_flag = 0xFF;
|
|
|
+ 51 bit If_play_music = 0;
|
|
|
+ 52 bit If_start_flash = 0;
|
|
|
+C51 COMPILER V8.02 LED时钟 07/22/2014 16:33:38 PAGE 2
|
|
|
+
|
|
|
+ 53 bit If_Into_set_ringtime = 0; //1进入,0退出
|
|
|
+ 54 //unsigned char code tab[]={0x48,0xEE,0x54,0xC4,0xE2,0xC1,0x41,0xEC,0x40,0xC0,0x60}; //LED码表,根据硬件修
|
|
|
+ -改
|
|
|
+ 55 unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
|
|
|
+ 56
|
|
|
+ 57 unsigned char inittime[7]={0x00,0x00,0x12,0x16,0x07,0x29,0x24}; //初始化1302时用到的初始化数据 年20
|
|
|
+ -14-1990=24
|
|
|
+ 58 // 秒 分钟 小时 日 月 星期 年
|
|
|
+ 59 /*
|
|
|
+ 60 void t0(void) interrupt 1 using 0 //中断处理程序,主要用于取反标志位,返回正常显示状态
|
|
|
+ 61 {
|
|
|
+ 62 TH0=(65535-50000)/256; //50ms定时
|
|
|
+ 63 TL0=(65535-50000)%256;
|
|
|
+ 64 timecount++;re_disp++;second_time++;
|
|
|
+ 65
|
|
|
+ 66 if(timecount == 9) //10*50ms == 500ms
|
|
|
+ 67 {
|
|
|
+ 68 flag=~flag;
|
|
|
+ 69 timecount = 0;
|
|
|
+ 70 }
|
|
|
+ 71 if(second_time == 19) //20*50ms == 1000ms
|
|
|
+ 72 {
|
|
|
+ 73 flag_1302_1s=~flag_1302_1s;
|
|
|
+ 74 second_time = 0;
|
|
|
+ 75
|
|
|
+ 76 system_26s_flag++;
|
|
|
+ 77 if(system_26s_flag > 25) system_26s_flag = 0;
|
|
|
+ 78 }
|
|
|
+ 79
|
|
|
+ 80 if(re_disp>200){re_disp=0;if(id)id=0;}
|
|
|
+ 81 }*/
|
|
|
+ 82 void delays(unsigned char k) //延时函数
|
|
|
+ 83 {
|
|
|
+ 84 1 unsigned char i,j;
|
|
|
+ 85 1 for(i=0;i<k;i++)
|
|
|
+ 86 1 for(j=0;j<50;j++);
|
|
|
+ 87 1 }
|
|
|
+ 88
|
|
|
+ 89 void display() //显示函数
|
|
|
+ 90 {
|
|
|
+ 91 1 unsigned char year_temp; //获取一次
|
|
|
+ 92 1 unsigned char secound_temp; //COL的显示
|
|
|
+ 93 1 if(secound_temp != SysTime.Second)
|
|
|
+ 94 1 {
|
|
|
+ 95 2 flag_1302_1s = !flag_1302_1s;
|
|
|
+ 96 2 secound_temp = SysTime.Second;
|
|
|
+ 97 2 }
|
|
|
+ 98 1 if(If_start_flash == 1)
|
|
|
+ 99 1 {
|
|
|
+ 100 2 if(set_flash_flag == 0) {s_state=HOU_MIN;hour=1;minute=1;}
|
|
|
+ 101 2 else if(set_flash_flag == 1) {s_state=SET_HOU_MIN;hour=1;minute=1;} //不显示
|
|
|
+ 102 2 else if(set_flash_flag == 2) {s_state=SET_HOU_MIN;hour=1;minute=1;}
|
|
|
+ 103 2 else if(set_flash_flag == 3) {s_state=HOU_MIN;hour=1;minute=1;} //不显示
|
|
|
+ 104 2 }
|
|
|
+ 105 1
|
|
|
+ 106 1 switch(s_state)
|
|
|
+ 107 1 {
|
|
|
+ 108 2 case HOU_MIN:
|
|
|
+ 109 2 if(flag&hour) //如hour为1表示调整时,flag为1时不显示
|
|
|
+ 110 2 {
|
|
|
+ 111 3 led0=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led0=1;
|
|
|
+ 112 3 led1=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led1=1; //&~((unsigned char)~flag<<6)该句根据flag的值决
|
|
|
+C51 COMPILER V8.02 LED时钟 07/22/2014 16:33:38 PAGE 3
|
|
|
+
|
|
|
+ -定来显示小数点,为1时显示,4个小数点组成两对冒号,下同
|
|
|
+ 113 3 }
|
|
|
+ 114 2 else //flag为0时显示,产生闪烁效果,下同
|
|
|
+ 115 2 {
|
|
|
+ 116 3 leddata=(tab[SysTime.Hour/16]&0x7F)|((P0_7?1:0)<<7);led0=0;delays(10);led0=1;
|
|
|
+ 117 3 leddata=(tab[SysTime.Hour%16]&0x7F)|((P0_7?1:0)<<7);led1=0;delays(10);led1=1;
|
|
|
+ 118 3 }
|
|
|
+ 119 2 if(flag&minute)
|
|
|
+ 120 2 {
|
|
|
+ 121 3 led2=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led2=1;
|
|
|
+ 122 3 led3=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led3=1;
|
|
|
+ 123 3 }
|
|
|
+ 124 2 else
|
|
|
+ 125 2 {
|
|
|
+ 126 3 leddata=(tab[SysTime.Minute/16]&0x7F)|((P0_7?1:0)<<7);led2=0;delays(10);led2=1;
|
|
|
+ 127 3 leddata=(tab[SysTime.Minute%16]&0x7F)|((P0_7?1:0)<<7);led3=0;delays(10);led3=1;
|
|
|
+ 128 3 }
|
|
|
+ 129 2 //dis cos
|
|
|
+ 130 2 P0_7 = COL = flag_1302_1s; delays(10);
|
|
|
+ 131 2
|
|
|
+ 132 2 break;
|
|
|
+ 133 2 case MON_DAY_HOU_MIN:
|
|
|
+ 134 2 if(system_26s_flag < 20)
|
|
|
+ 135 2 {
|
|
|
+ 136 3 if(flag&hour) //如hour为1表示调整时,flag为1时不显示
|
|
|
+ 137 3 {
|
|
|
+ 138 4 led0=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led0=1;
|
|
|
+ 139 4 led1=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led1=1; //&~((unsigned char)~flag<<6)该句根据flag的值�
|
|
|
+ -龆ɡ聪允拘∈�悖��1时显示,4个小数点组成两对冒号,下同
|
|
|
+ 140 4 }
|
|
|
+ 141 3 else //flag为0时显示,产生闪烁效果,下同
|
|
|
+ 142 3 {
|
|
|
+ 143 4 leddata=(tab[SysTime.Hour/16]&0x7F)|((P0_7?1:0)<<7);led0=0;delays(10);led0=1;
|
|
|
+ 144 4 leddata=(tab[SysTime.Hour%16]&0x7F)|((P0_7?1:0)<<7);led1=0;delays(10);led1=1;
|
|
|
+ 145 4 }
|
|
|
+ 146 3 if(flag&minute)
|
|
|
+ 147 3 {
|
|
|
+ 148 4 led2=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led2=1;
|
|
|
+ 149 4 led3=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led3=1;
|
|
|
+ 150 4 }
|
|
|
+ 151 3 else
|
|
|
+ 152 3 {
|
|
|
+ 153 4 leddata=leddata=(tab[SysTime.Minute/16]&0x7F)|((P0_7?1:0)<<7);led2=0;delays(10);led2=1;
|
|
|
+ 154 4 leddata=(tab[SysTime.Minute%16]&0x7F)|((P0_7?1:0)<<7);led3=0;delays(10);led3=1;
|
|
|
+ 155 4 }
|
|
|
+ 156 3 //dis cos
|
|
|
+ 157 3 P0_7 = COL = flag_1302_1s; delays(10);
|
|
|
+ 158 3
|
|
|
+ 159 3 }
|
|
|
+ 160 2 else
|
|
|
+ 161 2 {
|
|
|
+ 162 3 if(flag&month) //如min为1表示调整时,flag为1时不显示
|
|
|
+ 163 3 {
|
|
|
+ 164 4 led0=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led0=1;
|
|
|
+ 165 4 led1=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led1=1; //&~((unsigned char)~flag<<6)该句根据flag的值�
|
|
|
+ -龆ɡ聪允拘∈�悖��1时显示,4个小数点组成两对冒号,下同
|
|
|
+ 166 4 }
|
|
|
+ 167 3 else //flag为0时显示,产生闪烁效果,下同
|
|
|
+ 168 3 {
|
|
|
+ 169 4 leddata=(tab[SysTime.Month/16]&0x7F)|((P0_7?1:0)<<7);led0=0;delays(10);led0=1;
|
|
|
+ 170 4 leddata=(tab[SysTime.Month%16]&0x7F)|((P0_7?1:0)<<7);led1=0;delays(10);led1=1;
|
|
|
+ 171 4 }
|
|
|
+C51 COMPILER V8.02 LED时钟 07/22/2014 16:33:38 PAGE 4
|
|
|
+
|
|
|
+ 172 3 if(flag&days)
|
|
|
+ 173 3 {
|
|
|
+ 174 4 led2=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led2=1;
|
|
|
+ 175 4 led3=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led3=1;
|
|
|
+ 176 4 }
|
|
|
+ 177 3 else
|
|
|
+ 178 3 {
|
|
|
+ 179 4 leddata=(tab[SysTime.Day/16]&0x7F)|((P0_7?1:0)<<7);led2=0;delays(10);led2=1;
|
|
|
+ 180 4 leddata=(tab[SysTime.Day%16]&0x7F)|((P0_7?1:0)<<7);led3=0;delays(10);led3=1;
|
|
|
+ 181 4 }
|
|
|
+ 182 3 //dis cos
|
|
|
+ 183 3 P0_7 = COL = 1; delays(10);
|
|
|
+ 184 3
|
|
|
+ 185 3 }
|
|
|
+ 186 2
|
|
|
+ 187 2 break;
|
|
|
+ 188 2 case MIN_SECOND:
|
|
|
+ 189 2 if(flag&minute) //如min为1表示调整时,flag为1时不显示
|
|
|
+ 190 2 {
|
|
|
+ 191 3 led0=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led0=1;
|
|
|
+ 192 3 led1=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led1=1; //&~((unsigned char)~flag<<6)该句根据flag的值决
|
|
|
+ -定来显示小数点,为1时显示,4个小数点组成两对冒号,下同
|
|
|
+ 193 3 }
|
|
|
+ 194 2 else //flag为0时显示,产生闪烁效果,下同
|
|
|
+ 195 2 {
|
|
|
+ 196 3 leddata=(tab[SysTime.Minute/16]&0x7F)|((P0_7?1:0)<<7);led0=0;delays(10);led0=1;
|
|
|
+ 197 3 leddata=(tab[SysTime.Minute%16]&0x7F)|((P0_7?1:0)<<7);led1=0;delays(10);led1=1;
|
|
|
+ 198 3 }
|
|
|
+ 199 2 if(flag&second)
|
|
|
+ 200 2 {
|
|
|
+ 201 3 led2=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led2=1;
|
|
|
+ 202 3 led3=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led3=1;
|
|
|
+ 203 3 }
|
|
|
+ 204 2 else
|
|
|
+ 205 2 {
|
|
|
+ 206 3 leddata=(tab[SysTime.Second/16]&0x7F)|((P0_7?1:0)<<7);led2=0;delays(10);led2=1;
|
|
|
+ 207 3 leddata=(tab[SysTime.Second%16]&0x7F)|((P0_7?1:0)<<7);led3=0;delays(10);led3=1;
|
|
|
+ 208 3 }
|
|
|
+ 209 2 //dis cos
|
|
|
+ 210 2 P0_7 = COL = flag_1302_1s; delays(10);
|
|
|
+ 211 2
|
|
|
+ 212 2 break;
|
|
|
+ 213 2
|
|
|
+ 214 2 case MON_DAY:
|
|
|
+ 215 2 if(flag&month) //如min为1表示调整时,flag为1时不显示
|
|
|
+ 216 2 {
|
|
|
+ 217 3 led0=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led0=1;
|
|
|
+ 218 3 led1=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led1=1; //&~((unsigned char)~flag<<6)该句根据flag的值决
|
|
|
+ -定来显示小数点,为1时显示,4个小数点组成两对冒号,下同
|
|
|
+ 219 3 }
|
|
|
+ 220 2 else //flag为0时显示,产生闪烁效果,下同
|
|
|
+ 221 2 {
|
|
|
+ 222 3 leddata=(tab[SysTime.Month/16]&0x7F)|((P0_7?1:0)<<7);led0=0;delays(10);led0=1;
|
|
|
+ 223 3 leddata=(tab[SysTime.Month%16]&0x7F)|((P0_7?1:0)<<7);led1=0;delays(10);led1=1;
|
|
|
+ 224 3 }
|
|
|
+ 225 2 if(flag&days)
|
|
|
+ 226 2 {
|
|
|
+ 227 3 led2=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led2=1;
|
|
|
+ 228 3 led3=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led3=1;
|
|
|
+ 229 3 }
|
|
|
+ 230 2 else
|
|
|
+ 231 2 {
|
|
|
+C51 COMPILER V8.02 LED时钟 07/22/2014 16:33:38 PAGE 5
|
|
|
+
|
|
|
+ 232 3 leddata=(tab[SysTime.Day/16]&0x7F)|((P0_7?1:0)<<7);led2=0;delays(10);led2=1;
|
|
|
+ 233 3 leddata=(tab[SysTime.Day%16]&0x7F)|((P0_7?1:0)<<7);led3=0;delays(10);led3=1;
|
|
|
+ 234 3 }
|
|
|
+ 235 2 //dis cos
|
|
|
+ 236 2 P0_7 = COL = 1; delays(10); //关闭col
|
|
|
+ 237 2
|
|
|
+ 238 2 break;
|
|
|
+ 239 2 case SET_HOU_MIN:
|
|
|
+ 240 2 if(flag&hour) //如hour为1表示调整时,flag为1时不显示
|
|
|
+ 241 2 {
|
|
|
+ 242 3 led0=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led0=1;
|
|
|
+ 243 3 led1=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led1=1; //&~((unsigned char)~flag<<6)该句根据flag的值决
|
|
|
+ -定来显示小数点,为1时显示,4个小数点组成两对冒号,下同
|
|
|
+ 244 3 }
|
|
|
+ 245 2 else //flag为0时显示,产生闪烁效果,下同
|
|
|
+ 246 2 {
|
|
|
+ 247 3 leddata=(tab[Ringtime_HOU_tmp/10]&0x7F)|((P0_7?1:0)<<7);led0=0;delays(10);led0=1; //已转化10进制
|
|
|
+ 248 3 leddata=(tab[Ringtime_HOU_tmp%10]&0x7F)|((P0_7?1:0)<<7);led1=0;delays(10);led1=1;
|
|
|
+ 249 3 }
|
|
|
+ 250 2 if(flag&minute)
|
|
|
+ 251 2 {
|
|
|
+ 252 3 led2=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led2=1;
|
|
|
+ 253 3 led3=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led3=1;
|
|
|
+ 254 3 }
|
|
|
+ 255 2 else
|
|
|
+ 256 2 {
|
|
|
+ 257 3 leddata=(tab[Ringtime_MIN_tmp/10]&0x7F)|((P0_7?1:0)<<7);led2=0;delays(10);led2=1; //已转化10进制
|
|
|
+ 258 3 leddata=(tab[Ringtime_MIN_tmp%10]&0x7F)|((P0_7?1:0)<<7);led3=0;delays(10);led3=1;
|
|
|
+ 259 3 }
|
|
|
+ 260 2 //dis cos
|
|
|
+ 261 2 P0_7 = COL = flag_1302_1s; delays(10);
|
|
|
+ 262 2 break;
|
|
|
+ 263 2 case YEAR_S:
|
|
|
+ 264 2 year_temp = SysTime.Year/16*10 + SysTime.Year%16;
|
|
|
+ 265 2 if(flag&years_1) //如min为1表示调整时,flag为1时不显示
|
|
|
+ 266 2 {
|
|
|
+ 267 3 led0=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led0=1;
|
|
|
+ 268 3 led1=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led1=1; //&~((unsigned char)~flag<<6)该句根据flag的值决
|
|
|
+ -定来显示小数点,为1时显示,4个小数点组成两对冒号,下同
|
|
|
+ 269 3 }
|
|
|
+ 270 2 else //flag为0时显示,产生闪烁效果,下同
|
|
|
+ 271 2 {
|
|
|
+ 272 3 leddata=(tab[((year_temp+1990)/1000)%10]&0x7F)|((P0_7?1:0)<<7);led0=0;delays(10);led0=1;
|
|
|
+ 273 3 leddata=(tab[((year_temp+1990)/100)%10]&0x7F)|((P0_7?1:0)<<7);led1=0;delays(10);led1=1;
|
|
|
+ 274 3 }
|
|
|
+ 275 2 if(flag&years_2)
|
|
|
+ 276 2 {
|
|
|
+ 277 3 led2=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led2=1;
|
|
|
+ 278 3 led3=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led3=1;
|
|
|
+ 279 3 }
|
|
|
+ 280 2 else
|
|
|
+ 281 2 {
|
|
|
+ 282 3 leddata=(tab[((year_temp+1990)/10)%10]&0x7F)|((P0_7?1:0)<<7);led2=0;delays(10);led2=1;
|
|
|
+ 283 3 leddata=(tab[((year_temp+1990)/1)%10]&0x7F)|((P0_7?1:0)<<7);led3=0;delays(10);led3=1;
|
|
|
+ 284 3 }
|
|
|
+ 285 2
|
|
|
+ 286 2 //dis cos
|
|
|
+ 287 2 P0_7 = COL = 1; delays(10);
|
|
|
+ 288 2
|
|
|
+ 289 2 break;
|
|
|
+ 290 2
|
|
|
+ 291 2 default:
|
|
|
+C51 COMPILER V8.02 LED时钟 07/22/2014 16:33:38 PAGE 6
|
|
|
+
|
|
|
+ 292 2 break;
|
|
|
+ 293 2 }
|
|
|
+ 294 1
|
|
|
+ 295 1 #if 0
|
|
|
+ if(flag&second)
|
|
|
+ {
|
|
|
+ led4=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led4=1;
|
|
|
+ led5=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led5=1;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ leddata=tab[SysTime.Second/16];led4=0;delays(10);led4=1;
|
|
|
+ leddata=tab[SysTime.Second%16];led5=0;delays(10);led5=1;
|
|
|
+ }
|
|
|
+ #endif
|
|
|
+ 307 1 }
|
|
|
+ 308
|
|
|
+ 309 void just_play_when_beep(void)
|
|
|
+ 310 {
|
|
|
+ 311 1 unsigned char secound_temp; //COL的显示
|
|
|
+ 312 1 static char i=1;
|
|
|
+ 313 1
|
|
|
+ 314 1 if(secound_temp != SysTime.Second)
|
|
|
+ 315 1 {
|
|
|
+ 316 2 flag_1302_1s = !flag_1302_1s;
|
|
|
+ 317 2 secound_temp = SysTime.Second;
|
|
|
+ 318 2 }
|
|
|
+ 319 1 if(!SET || !UP ||!DOWN ||!MODE)
|
|
|
+ 320 1 {
|
|
|
+ 321 2 //跳出铃声
|
|
|
+ 322 2 m=0xFF;n=0xFF;per_run_time=0; //跳出次数
|
|
|
+ 323 2 //关闭蜂鸣器
|
|
|
+ 324 2 TR0=0;beepIO=0;
|
|
|
+ 325 2 //初始化
|
|
|
+ 326 2 If_start_run_ringtime=0; //关着的
|
|
|
+ 327 2 ring_space_1min = _RING_SPACE_1MIN; //每遍间隔1分钟
|
|
|
+ 328 2 ring_run_time = _RING_RUN_TIME; //重复5遍
|
|
|
+ 329 2 }
|
|
|
+ 330 1 switch(i)
|
|
|
+ 331 1 {
|
|
|
+ 332 2 case 1:
|
|
|
+ 333 2 led3=1;leddata=(0x7F)|((P0_7?1:0)<<7);leddata=(tab[SysTime.Hour/16]&0x7F)|((P0_7?1:0)<<7);led0=0;i=2;
|
|
|
+ 334 2 break;
|
|
|
+ 335 2 case 2:
|
|
|
+ 336 2 led0=1;leddata=(0x7F)|((P0_7?1:0)<<7);leddata=(tab[SysTime.Hour%16]&0x7F)|((P0_7?1:0)<<7);led1=0;i=3;
|
|
|
+ 337 2 break;
|
|
|
+ 338 2 case 3:
|
|
|
+ 339 2 led1=1;leddata=(0x7F)|((P0_7?1:0)<<7);leddata=(tab[SysTime.Minute/16]&0x7F)|((P0_7?1:0)<<7);led2=0;i=4;
|
|
|
+ 340 2 break;
|
|
|
+ 341 2 case 4:
|
|
|
+ 342 2 led2=1;leddata=(0x7F)|((P0_7?1:0)<<7);leddata=(tab[SysTime.Minute%16]&0x7F)|((P0_7?1:0)<<7);led3=0;i=5;
|
|
|
+ 343 2 break;
|
|
|
+ 344 2 case 5:
|
|
|
+ 345 2 P0_7 = COL = flag_1302_1s;
|
|
|
+ 346 2 leddata=(0x7F)|((P0_7?1:0)<<7);led0=led1=led2=led3=1;
|
|
|
+ 347 2 i=1;
|
|
|
+ 348 2 break;
|
|
|
+ 349 2 default:
|
|
|
+ 350 2 break;
|
|
|
+ 351 2 }
|
|
|
+ 352 1 }
|
|
|
+ 353
|
|
|
+C51 COMPILER V8.02 LED时钟 07/22/2014 16:33:38 PAGE 7
|
|
|
+
|
|
|
+ 354 void Set_ringtime_id(unsigned char sel,unsigned char sel_1) //执行调整项目的函数
|
|
|
+ 355 {
|
|
|
+ 356 1 signed char max,mini,address,item;
|
|
|
+ 357 1 if(sel==1) {address=DS1302_HOUR; max=23;mini=0;} //小时 //根据id值确定要调整的项,并确定调整上下限,�
|
|
|
+ -峦�
|
|
|
+ 358 1 else if(sel==2) {address=DS1302_MINUTE; max=59;mini=0;} //分钟
|
|
|
+ 359 1 if(sel==1)
|
|
|
+ 360 1 item=Ringtime_HOU_tmp; //从相应的地址读取当前数据并转换为十进制
|
|
|
+ 361 1 else if(sel==2)
|
|
|
+ 362 1 item=Ringtime_MIN_tmp;
|
|
|
+ 363 1 if (sel_1==0) item--; else item++; //确定是对项目加还是减,并对越限处理
|
|
|
+ 364 1 if(item>max) item=mini;
|
|
|
+ 365 1 if(item<mini) item=max;
|
|
|
+ 366 1
|
|
|
+ 367 1 if(sel==1)
|
|
|
+ 368 1 Ringtime_HOU_tmp = item;
|
|
|
+ 369 1 if(sel==2)
|
|
|
+ 370 1 Ringtime_MIN_tmp = item;
|
|
|
+ 371 1 }
|
|
|
+ 372
|
|
|
+ 373 void set_ringtime_case0(void) //键盘处理函数,只有按下set键时才会进入,
|
|
|
+ 374 {
|
|
|
+ 375 1 display();
|
|
|
+ 376 1 if (!DOWN) //不保存
|
|
|
+ 377 1 {
|
|
|
+ 378 2 while(!DOWN)display(); //等待按键释放,如一直按下一直调用显示函数,防止显示中断
|
|
|
+ 379 2 Ringtime_HOU = 0xFF;
|
|
|
+ 380 2 Ringtime_MIN = 0xFF;
|
|
|
+ 381 2 If_start_run_ringtime = 0; //闹钟计时不开始
|
|
|
+ 382 2 If_start_flash = 1; //退出模式,闪烁
|
|
|
+ 383 2 If_Into_set_ringtime = 0; //退出模式,进入小时-分
|
|
|
+ 384 2 }
|
|
|
+ 385 1 if (!UP) //保存
|
|
|
+ 386 1 {
|
|
|
+ 387 2 while(!UP)display();
|
|
|
+ 388 2 Ringtime_HOU = Ringtime_HOU_tmp/10*16+Ringtime_HOU_tmp%10; //16进制保存
|
|
|
+ 389 2 Ringtime_MIN = Ringtime_MIN_tmp/10*16+Ringtime_MIN_tmp%10;
|
|
|
+ 390 2 If_start_run_ringtime = 1; //闹钟计时开始
|
|
|
+ 391 2 If_start_flash = 1; //退出模式,进入闪烁
|
|
|
+ 392 2 If_Into_set_ringtime = 0; //退出模式,进入小时-分
|
|
|
+ 393 2 }
|
|
|
+ 394 1 //直接退出
|
|
|
+ 395 1 if (!MODE)
|
|
|
+ 396 1 {
|
|
|
+ 397 2 while(!MODE)display();
|
|
|
+ 398 2 Ringtime_HOU = 0xFF;
|
|
|
+ 399 2 Ringtime_MIN = 0xFF;
|
|
|
+ 400 2 If_start_run_ringtime = 0;
|
|
|
+ 401 2 If_Into_set_ringtime = 0;
|
|
|
+ 402 2 s_state=HOU_MIN;hour=0;minute=0; //退出模式,进入小时-分,不闪烁
|
|
|
+ 403 2 }
|
|
|
+ 404 1 }
|
|
|
+ 405 void set_ringtime_case1(void) //键盘处理函数,只有按下set键时才会进入,
|
|
|
+ 406 {
|
|
|
+ 407 1 display();
|
|
|
+ 408 1 if (!DOWN) //减少
|
|
|
+ 409 1 {
|
|
|
+ 410 2 while(!DOWN)display(); //等待按键释放,如一直按下一直调用显示函数,防止显示中断
|
|
|
+ 411 2 re_disp=0; //清除记数,重新开始10s定时
|
|
|
+ 412 2 Set_ringtime_id(id,0); //跳到加减判断函数,下同,
|
|
|
+ 413 2 }
|
|
|
+ 414 1 if (!UP) //增加
|
|
|
+C51 COMPILER V8.02 LED时钟 07/22/2014 16:33:38 PAGE 8
|
|
|
+
|
|
|
+ 415 1 {
|
|
|
+ 416 2 while(!UP)display();
|
|
|
+ 417 2 re_disp=0;
|
|
|
+ 418 2 Set_ringtime_id(id,1);
|
|
|
+ 419 2 }
|
|
|
+ 420 1 //直接退出
|
|
|
+ 421 1 if (!MODE)
|
|
|
+ 422 1 {
|
|
|
+ 423 2 while(!MODE)display();
|
|
|
+ 424 2 Ringtime_HOU = 0xFF;
|
|
|
+ 425 2 Ringtime_MIN = 0xFF;
|
|
|
+ 426 2 If_start_run_ringtime = 0;
|
|
|
+ 427 2 If_Into_set_ringtime = 0;
|
|
|
+ 428 2 s_state=HOU_MIN;hour=0;minute=0; //退出模式,进入小时-分,不闪烁
|
|
|
+ 429 2 }
|
|
|
+ 430 1 }
|
|
|
+ 431
|
|
|
+ 432 void Into_set_ringtime(void) //定时铃声函数
|
|
|
+ 433 {
|
|
|
+ 434 1 unsigned char set_i;
|
|
|
+ 435 1 If_Into_set_ringtime = 1;
|
|
|
+ 436 1 If_start_flash = 1;//开始闪
|
|
|
+ 437 1 //初始化set time数据
|
|
|
+ 438 1 set_i = id = 1;
|
|
|
+ 439 1 Ringtime_HOU_tmp = SysTime.Hour/16*10+SysTime.Hour%16; //取出并转化10进制 (用)
|
|
|
+ 440 1 Ringtime_MIN_tmp = SysTime.Minute/16*10+SysTime.Minute%16;
|
|
|
+ 441 1 // Ringtime_HOU_tmp = item/10*16+item%10; //转化16进制 (存)
|
|
|
+ 442 1 // Ringtime_MIN_tmp = item/10*16+item%10;
|
|
|
+ 443 1
|
|
|
+ 444 1 while(If_Into_set_ringtime)
|
|
|
+ 445 1 {
|
|
|
+ 446 2 //修改定时时间 SET移动,UP+,DOWN-
|
|
|
+ 447 2 if (!SET)
|
|
|
+ 448 2 {
|
|
|
+ 449 3 while(!SET)display(); //等待按键释放,如一直按下一直调用显示函数,防止显示中断
|
|
|
+ 450 3 re_disp=0; //清除记数,重新开始10s定时
|
|
|
+ 451 3 set_i++;if(set_i>2)set_i=0; //id加1,后面根据id值对应调整项目
|
|
|
+ 452 3 id = set_i;
|
|
|
+ 453 3 s_state=SET_HOU_MIN;
|
|
|
+ 454 3 }
|
|
|
+ 455 2 if(id==0){hour=0;minute=0;set_ringtime_case0();} //根据id值跳到相应处理函数
|
|
|
+ 456 2 if(id==1){hour=1;set_ringtime_case1();} //id为1,选择调整小时位,闪烁标志位置1,然后跳到键盘处理函�
|
|
|
+ -��峦�
|
|
|
+ 457 2 else if(id==2){hour=0;minute=1;set_ringtime_case1();}
|
|
|
+ 458 2 }
|
|
|
+ 459 1
|
|
|
+ 460 1 }
|
|
|
+ 461
|
|
|
+ 462 void Scan_Key(void) //键盘检测函数
|
|
|
+ 463 {
|
|
|
+ 464 1 display(); //程序开头调用显示函数
|
|
|
+ 465 1 if(!SET)
|
|
|
+ 466 1 {
|
|
|
+ 467 2 while(!SET)display(); //等待按键释放,如一直按下一直调用显示函数,防止显示中断
|
|
|
+ 468 2 re_disp=0; //清除记数,重新开始10s定时
|
|
|
+ 469 2 id++;if(id>7)id=0; //id加1,后面根据id值对应调整项目
|
|
|
+ 470 2 switch(id)
|
|
|
+ 471 2 {
|
|
|
+ 472 3 case 0: s_state=HOU_MIN;break;
|
|
|
+ 473 3 case 1: s_state=HOU_MIN;break;
|
|
|
+ 474 3 case 2: s_state=HOU_MIN;break;
|
|
|
+ 475 3 case 3: s_state=MON_DAY;break;
|
|
|
+C51 COMPILER V8.02 LED时钟 07/22/2014 16:33:38 PAGE 9
|
|
|
+
|
|
|
+ 476 3 case 4: s_state=MON_DAY;break;
|
|
|
+ 477 3 case 5: s_state=YEAR_S;break;
|
|
|
+ 478 3 case 6: s_state=YEAR_S;break;
|
|
|
+ 479 3 case 7: s_state=SET_HOU_MIN;break;
|
|
|
+ 480 3 default:break;
|
|
|
+ 481 3 }
|
|
|
+ 482 2 }
|
|
|
+ 483 1
|
|
|
+ 484 1 switch(id)
|
|
|
+ 485 1 {
|
|
|
+ 486 2 case 0: hour=0;minute=0;second=0;month=0;days=0;years_1=0;years_2=0;id_case2_key();break; //根据id值跳�
|
|
|
+ -较嘤Υ�砗��
|
|
|
+ 487 2 case 1: hour=1;id_case1_key();break; //id为1,选择调整小时位,闪烁标志位置1,然后跳到键盘处理函数,�
|
|
|
+ -峦�
|
|
|
+ 488 2 case 2: hour=0;minute=1;id_case1_key();break;
|
|
|
+ 489 2 case 3: minute=0;month=1;id_case1_key();break;
|
|
|
+ 490 2 case 4: month=0;days=1;id_case1_key();break;
|
|
|
+ 491 2 case 5: days=0;years_1=1;id_case1_key();break;
|
|
|
+ 492 2 case 6: years_1=0;years_2=1;id_case1_key();break;
|
|
|
+ 493 2 case 7: years_2=0;Into_set_ringtime();break;
|
|
|
+ 494 2 default:break;
|
|
|
+ 495 2 }
|
|
|
+ 496 1 //if(id==3){minute=0;second=1;id_case1_key();}
|
|
|
+ 497 1 }
|
|
|
+ 498 void id_case1_key(void) //键盘处理函数,只有按下set键时才会进入,
|
|
|
+ 499 {
|
|
|
+ 500 1 display();
|
|
|
+ 501 1 if (!DOWN) //减少
|
|
|
+ 502 1 {
|
|
|
+ 503 2 while(!DOWN)display(); //等待按键释放,如一直按下一直调用显示函数,防止显示中断
|
|
|
+ 504 2 re_disp=0; //清除记数,重新开始10s定时
|
|
|
+ 505 2 Set_id(id,0); //跳到加减判断函数,下同,
|
|
|
+ 506 2 }
|
|
|
+ 507 1 if (!UP) //增加
|
|
|
+ 508 1 {
|
|
|
+ 509 2 while(!UP)display();
|
|
|
+ 510 2 re_disp=0;
|
|
|
+ 511 2 Set_id(id,1);
|
|
|
+ 512 2 }
|
|
|
+ 513 1 }
|
|
|
+ 514 void id_case2_key(void) //键盘处理函数,只有id==0时才会进入,
|
|
|
+ 515 {
|
|
|
+ 516 1 static char DOWN_key_add = HOU_MIN;
|
|
|
+ 517 1 display();
|
|
|
+ 518 1 if (!DOWN) //
|
|
|
+ 519 1 {
|
|
|
+ 520 2 while(!DOWN)display(); //等待按键释放,如一直按下一直调用显示函数,防止显示中断
|
|
|
+ 521 2 DOWN_key_add ++;
|
|
|
+ 522 2 if(DOWN_key_add > 2) DOWN_key_add = 0;
|
|
|
+ 523 2 if(DOWN_key_add == 0) s_state = HOU_MIN;
|
|
|
+ 524 2 else if(DOWN_key_add == 1) s_state = MON_DAY_HOU_MIN;
|
|
|
+ 525 2 else if(DOWN_key_add == 2) s_state = MIN_SECOND;
|
|
|
+ 526 2 }
|
|
|
+ 527 1 if (!UP) //
|
|
|
+ 528 1 {
|
|
|
+ 529 2 while(!UP)display(); //等待按键释放,如一直按下一直调用显示函数,防止显示中断
|
|
|
+ 530 2 DOWN_key_add --;
|
|
|
+ 531 2 if(DOWN_key_add < 0) DOWN_key_add = 2;
|
|
|
+ 532 2 if(DOWN_key_add == 0) s_state = HOU_MIN;
|
|
|
+ 533 2 else if(DOWN_key_add == 1) s_state = MON_DAY_HOU_MIN;
|
|
|
+ 534 2 else if(DOWN_key_add == 2) s_state = MIN_SECOND;
|
|
|
+ 535 2 }
|
|
|
+C51 COMPILER V8.02 LED时钟 07/22/2014 16:33:38 PAGE 10
|
|
|
+
|
|
|
+ 536 1 if (!MODE)
|
|
|
+ 537 1 {
|
|
|
+ 538 2 while(!MODE)display(); //等待按键释放,如一直按下一直调用显示函数,防止显示中断
|
|
|
+ 539 2 Into_set_ringtime();
|
|
|
+ 540 2 }
|
|
|
+ 541 1 }
|
|
|
+ 542 //根据选择调整相应项目并写入DS1302
|
|
|
+ 543 void Set_id(unsigned char sel,unsigned char sel_1) //执行调整项目的函数
|
|
|
+ 544 {
|
|
|
+ 545 1 signed char max,mini,address,item;
|
|
|
+ 546 1 switch(sel)
|
|
|
+ 547 1 {
|
|
|
+ 548 2 case 1: address=DS1302_HOUR; max=23;mini=0;break; //小时 //根据id值确定要调整的项,并确定调整上下限,�
|
|
|
+ -峦�
|
|
|
+ 549 2 case 2: address=DS1302_MINUTE; max=59;mini=0;break; //分钟
|
|
|
+ 550 2 case 3: address=DS1302_MONTH; max=12;mini=1;break; //月
|
|
|
+ 551 2 case 4: address=DS1302_DAY; max=31;mini=0;break; //日
|
|
|
+ 552 2 case 5: address=DS1302_YEAR; max=20;mini=20;break; //年20
|
|
|
+ 553 2 case 6: address=DS1302_YEAR; max=99;mini=0;break; //年14
|
|
|
+ 554 2 default:break;
|
|
|
+ 555 2 }
|
|
|
+ 556 1 //if(sel==3) {address=sec; max=0;mini=0;} //秒
|
|
|
+ 557 1
|
|
|
+ 558 1 item=Read1302(address|DS1302_READ)/16*10+Read1302(address|DS1302_READ)%16; //从相应的地址读取当前数据并
|
|
|
+ -转换为十进制
|
|
|
+ 559 1 if (sel_1==0) item--; else item++; //确定是对项目加还是减,并对越限处理
|
|
|
+ 560 1 if(item>max) item=mini;
|
|
|
+ 561 1 if(item<mini) item=max;
|
|
|
+ 562 1 Write1302(0x8e,0x00);//允许写操作
|
|
|
+ 563 1 Write1302(address,item/10*16+item%10); //将调整结果转换成压缩BCD码重新写入1302
|
|
|
+ 564 1 Write1302(0x8e,0x80);//写保护,禁止写操作
|
|
|
+ 565 1 }
|
|
|
+ 566
|
|
|
+ 567 void DS1302_SetTime(unsigned char Address, unsigned char Value) // 设置时间函数
|
|
|
+ 568 {
|
|
|
+ 569 1 Write1302(0x8e,0x00);//允许写操作
|
|
|
+ 570 1 Write1302(Address, ((Value/10)<<4 | (Value%10))); //高4位为十位,低4位为个位
|
|
|
+ 571 1 Write1302(0x8e,0x80);//写保护,禁止写操作
|
|
|
+ 572 1 }
|
|
|
+ 573 void Initial_DS1302(void)
|
|
|
+ 574 {
|
|
|
+ 575 1 unsigned char Second=Read1302(DS1302_SECOND|DS1302_READ);
|
|
|
+ 576 1 if(Second&0x80) //如果第七为1(表明没有启动), 则启动时钟
|
|
|
+ 577 1 DS1302_SetTime(DS1302_SECOND,Second&0x3F); //小于60秒 3F=63
|
|
|
+ 578 1 }
|
|
|
+ 579
|
|
|
+ 580 void t1(void) interrupt 3 using 0 //中断处理程序,主要用于取反标志位,返回正常显示状态
|
|
|
+ 581 {
|
|
|
+ 582 1 TH1=(65535-50000)/256; //50ms定时
|
|
|
+ 583 1 TL1=(65535-50000)%256;
|
|
|
+ 584 1 timecount++;re_disp++;second_time++;
|
|
|
+ 585 1
|
|
|
+ 586 1 if(If_start_flash == 1 && set_flash_flag <= 3)
|
|
|
+ 587 1 {
|
|
|
+ 588 2 if(ring_flash_countdown-- == 0) //50ms*60 == 3s
|
|
|
+ 589 2 {
|
|
|
+ 590 3 ring_flash_countdown = _RING_FLASH_COUNTDOWN/50;
|
|
|
+ 591 3 If_start_flash = 0;
|
|
|
+ 592 3 set_flash_flag = 0xFF;
|
|
|
+ 593 3 if(If_Into_set_ringtime) {s_state = SET_HOU_MIN;hour=1;minute=0;} //最后到设置,闪
|
|
|
+ 594 3 else {s_state = HOU_MIN;hour=0;minute=0;} //最后退出设置,不闪
|
|
|
+ 595 3 }
|
|
|
+C51 COMPILER V8.02 LED时钟 07/22/2014 16:33:38 PAGE 11
|
|
|
+
|
|
|
+ 596 2 }
|
|
|
+ 597 1
|
|
|
+ 598 1 if(timecount >= 9) //10*50ms == 500ms
|
|
|
+ 599 1 {
|
|
|
+ 600 2 flag=~flag;
|
|
|
+ 601 2 if(set_flash_flag > 3) set_flash_flag = 0;
|
|
|
+ 602 2 if(If_start_flash == 1) set_flash_flag ++;
|
|
|
+ 603 2 timecount = 0;
|
|
|
+ 604 2 }
|
|
|
+ 605 1 if(second_time >= 19) //20*50ms == 1000ms
|
|
|
+ 606 1 {
|
|
|
+ 607 2 second_time = 0;
|
|
|
+ 608 2 system_1s_flag=~system_1s_flag; //系统读秒1302
|
|
|
+ 609 2
|
|
|
+ 610 2 system_26s_flag++;
|
|
|
+ 611 2 if(system_26s_flag > 25) system_26s_flag = 0;
|
|
|
+ 612 2 }
|
|
|
+ 613 1
|
|
|
+ 614 1 if(re_disp>200){re_disp=0;if(id)id=0;}
|
|
|
+ 615 1 }
|
|
|
+ 616
|
|
|
+ 617 void InitialT0T1(void) //
|
|
|
+ 618 {
|
|
|
+ 619 1 TMOD=0x11; //初始化定时器 方式2 波特率发生器
|
|
|
+ 620 1 //TH0=0xFF; //T0高八位
|
|
|
+ 621 1 //TL0=0xFF; //T0低八位
|
|
|
+ 622 1 TH1=(65535-50000)/256; //T1高八位
|
|
|
+ 623 1 TL1=(65535-50000)%256; //T1低八位
|
|
|
+ 624 1
|
|
|
+ 625 1 EA=1; //总中断开关
|
|
|
+ 626 1 ET0=1; //T0中断
|
|
|
+ 627 1 //TR0=0; //定时器T0 不开始计时
|
|
|
+ 628 1 ET1=1; //T1中断
|
|
|
+ 629 1 TR1=1; //定时器T1 开始计时
|
|
|
+ 630 1 }
|
|
|
+ 631 /*
|
|
|
+ 632 void InitialT1(void) //
|
|
|
+ 633 {
|
|
|
+ 634 TMOD|=0x10; //初始化定时器 方式2 波特率发生器
|
|
|
+ 635 TH1=(65535-50000)/256; //T0高八位
|
|
|
+ 636 TL1=(65535-50000)%256; //T0低八位
|
|
|
+ 637 EA=1; //总中断开关
|
|
|
+ 638 ET1=1; //T0中断
|
|
|
+ 639 TR1=1; //定时器T0 开始计时
|
|
|
+ 640 }*/
|
|
|
+ 641 void main() //主函数
|
|
|
+ 642 {
|
|
|
+ 643 1 //配置播放器T0 模式3下 占用T1资源,所以 只能用T1(波特率发生器)
|
|
|
+ 644 1 //配置定时器T1
|
|
|
+ 645 1 //InitialT1();
|
|
|
+ 646 1 InitialT0T1();
|
|
|
+ 647 1 //初始化,并启动DS1302的时钟
|
|
|
+ 648 1 Write1302(0x90,0xa0);//关闭充电二级管,不能对后备电池进行充电,防止发胀,原来的程序是打开的请关闭
|
|
|
+ 649 1 Write1302(0x8e,0x80);//写保护,禁止写操作
|
|
|
+ 650 1 Initial_DS1302();
|
|
|
+ 651 1 if(!UP&!DOWN)Set1302(inittime); //如果同时按下UP和DOWN键则初始化1302,该语句在while(1)前,只执行一次,
|
|
|
+ -需要复位,防止误操作
|
|
|
+ 652 1 //配置P0口,全部推挽输出 01
|
|
|
+ 653 1 P0M0 = 0x00;
|
|
|
+ 654 1 P0M1 = 0xFF;
|
|
|
+ 655 1 //延时稳定
|
|
|
+ 656 1 SYSLED = 0; //系统灯开
|
|
|
+C51 COMPILER V8.02 LED时钟 07/22/2014 16:33:38 PAGE 12
|
|
|
+
|
|
|
+ 657 1 delays(100);
|
|
|
+ 658 1 SYSLED = 1; //系统灯关
|
|
|
+ 659 1 while(1)
|
|
|
+ 660 1 {
|
|
|
+ 661 2 SYSLED = system_1s_flag; //系统灯闪
|
|
|
+ 662 2 DS1302_GetTime(&SysTime); //获取时间
|
|
|
+ 663 2 Scan_Key(); //键盘检测和显示
|
|
|
+ 664 2 if(!P3_0)
|
|
|
+ 665 2 {
|
|
|
+ 666 3 while(!P3_0)display(); //等待按键释放,如一直按下一直调用显示函数,防止显示中断
|
|
|
+ 667 3 If_play_music = 1;
|
|
|
+ 668 3 play_2tigers();
|
|
|
+ 669 3 If_play_music = 0;
|
|
|
+ 670 3 }
|
|
|
+ 671 2 if(If_start_run_ringtime)
|
|
|
+ 672 2 {
|
|
|
+ 673 3 if(Ringtime_HOU == SysTime.Hour && Ringtime_MIN == SysTime.Minute)
|
|
|
+ 674 3 {
|
|
|
+ 675 4 if(ring_run_time--==0) //到了次数,不再播放
|
|
|
+ 676 4 {
|
|
|
+ 677 5 Ringtime_HOU = 0xFF;
|
|
|
+ 678 5 Ringtime_MIN = 0xFF;
|
|
|
+ 679 5 If_start_run_ringtime = 0;
|
|
|
+ 680 5 ring_run_time = _RING_RUN_TIME; //初始化一下 下个5遍运行 ,不然ring_run_time--后,0xFF一直间隔响
|
|
|
+ 681 5 }
|
|
|
+ 682 4 else //重装,间隔x分钟 ring_space_1min
|
|
|
+ 683 4 {
|
|
|
+ 684 5 Ringtime_HOU_tmp = Ringtime_HOU_tmp + (Ringtime_MIN_tmp + ring_space_1min)/59;
|
|
|
+ 685 5 Ringtime_MIN_tmp = (Ringtime_MIN_tmp + ring_space_1min)%59;
|
|
|
+ 686 5 Ringtime_HOU = Ringtime_HOU_tmp/10*16+Ringtime_HOU_tmp%10; //16进制保存
|
|
|
+ 687 5 Ringtime_MIN = Ringtime_MIN_tmp/10*16+Ringtime_MIN_tmp%10;
|
|
|
+ 688 5 If_start_run_ringtime = 1;
|
|
|
+ 689 5 }
|
|
|
+ 690 4 If_play_music = 1;
|
|
|
+ 691 4 play_2tigers();
|
|
|
+ 692 4 If_play_music = 0;
|
|
|
+ 693 4 }
|
|
|
+ 694 3 }
|
|
|
+ 695 2 }
|
|
|
+ 696 1 }
|
|
|
+
|
|
|
+
|
|
|
+MODULE INFORMATION: STATIC OVERLAYABLE
|
|
|
+ CODE SIZE = 4123 ----
|
|
|
+ CONSTANT SIZE = 186 ----
|
|
|
+ XDATA SIZE = ---- ----
|
|
|
+ PDATA SIZE = ---- ----
|
|
|
+ DATA SIZE = 51 9
|
|
|
+ IDATA SIZE = ---- ----
|
|
|
+ BIT SIZE = 14 ----
|
|
|
+END OF MODULE INFORMATION.
|
|
|
+
|
|
|
+
|
|
|
+C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
|