LED时钟.LST 47 KB

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