📄 main.lst
字号:
214 2 case 7:str2[MONTHS]='J';str2[MONTHS+1]='U';str2[MONTHS+2]='L';break;
215 2 case 8:str2[MONTHS]='A';str2[MONTHS+1]='U';str2[MONTHS+2]='G';break;
216 2 case 9:str2[MONTHS]='S';str2[MONTHS+1]='E';str2[MONTHS+2]='P';break;
217 2 case 10:str2[MONTHS]='O';str2[MONTHS+1]='C';str2[MONTHS+2]='T';break;
218 2 case 11:str2[MONTHS]='N';str2[MONTHS+1]='O';str2[MONTHS+2]='V';break;
219 2 case 12:str2[MONTHS]='D';str2[MONTHS+1]='E';str2[MONTHS+2]='C';break;
220 2
221 2 }
222 1 }
223
224 void Delay(uint n)
225 {
226 1 uint i;
227 1 for(i=0;i<n;i++);
228 1 }
229
230 void TxData(uchar dat)
231 {
232 1 SBUF = dat;
233 1 while(TI!=1);
234 1 TI = 0;
235 1 }
236
237 void Timer0Int() interrupt 1 using 2
238 {
239 1 if(Int0Flag==1) /*如果需要产生音乐频率则按音频改变TIMER0得中断周期*/
240 1 {
C51 COMPILER V7.50 MAIN 03/19/2009 16:09:25 PAGE 5
241 2 P3^3 = ~P3^3; /*每个TIMER0中断翻转一下P3.3的电平以产生相应频率的方波*/
*** ERROR C141 IN LINE 241 OF MAIN.C: syntax error near '='
242 2 TH0 = TH0Temp;
243 2 TL0 = TL0Temp;
244 2 }
245 1 }
246
247 void Timer1Int() interrupt 3 using 3 /*TIMER1中断服务程序,中断周期为10MS*/
248 {
249 1 uchar ucharTemp,ucharTemp1;
250 1 static uchar s_paiCounter,s_paiNum;
251 1 uint temp;
252 1 static uint counter = 0;
253 1
254 1 if(++counter>=10){ /*如果100ms到则这只100ms标志位*/
255 2 flg_100ms = 1;
256 2 counter = 0;
257 2 }
258 1 temp = 65536-SCAN_CYCLE; /*中断周期为10ms*/
259 1 TH1 = temp>>8; /*temp/256相当于右移8位*/
260 1 TL1 = temp-((temp>>8)<<8); /*temp%256*/
261 1
262 1 if(musicplayflg==1){ /*如果需要播放音乐*/
263 2 if(++s_paiCounter>=s_paiNum) /**音乐一拍的时间*/
264 2 {
265 3 s_paiCounter = 0;
266 3 ucharTemp = c_music[s_tableCounter++];
267 3 if(ucharTemp==0x00) /*如果差到0x00则标识本首歌曲结束*/
268 3 {
269 4 Int0Flag = 0; /*产生音乐平率标志置零*/
270 4 s_paiNum = 4*PAI_BASE; /*歌曲结束后停止播放*/
271 4 P3^3 = 1; /*把喇叭关掉*/
*** ERROR C141 IN LINE 271 OF MAIN.C: syntax error near '='
272 4 s_tableCounter = 0;
273 4 musicplayflg = 0;
274 4 TR0 = 0;
275 4 }
276 3 else /*如果查到非0X00则标识是音乐标识码*/
277 3 {
278 4 s_paiNum = (ucharTemp&0x0f)*PAI_BASE; /*音乐包是吗的低四位为节拍码*/
279 4 ucharTemp1 = (ucharTemp&0xf0)>>4;
280 4 if(ucharTemp1 == 0) /*如果音频码为零则标识不发音*/
281 4 {
282 5 Int0Flag = 0;
283 5 }
284 4 else /*如果音频码不为零则按此改变TIMER0得中断周期*/
285 4 {
286 5 Int0Flag = 0;
287 5 temp = c_musicFreq[ucharTemp1-1];
288 5 TH0 = temp>>8; /*temp/256相当于右移8位*/
289 5 TL0 = temp-((temp>>8)<<8); /*temp%256*/
290 5 TH0Temp = TH0; /*保存新的代表音频得TIMER0周期值*/
291 5 TL0Temp = TL0;
292 5 Int0Flag = 1;
293 5 }
294 4 }
295 3 }
296 2 }
297 1 }
298
299 void ScanKeys(void) /*扫描键盘模块*/
300 {
C51 COMPILER V7.50 MAIN 03/19/2009 16:09:25 PAGE 6
301 1 uchar scanValue = 0xef,iScan,scanTempUchar;
302 1 for(iScan = 0;iScan<4;iScan++)
303 1 {
304 2 P1 = scanValue; /*发扫描值*/
305 2 scanTempUchar = P1; /*读入扫描值*/
306 2 if((scanTempUchar&0X01) == 0X00) /*第一列被按*/
307 2 {
308 3 keyFlag|=(0x0001<<(iScan*4+0)); /*设置此键的标志位*/
309 3 }
310 2 else
311 2 {
312 3 keyFlag&=~(0x0001<<(iScan*4+0)); /*清此键的标志位*/
313 3 }
314 2 if((scanTempUchar&0x02) == 0x00) /*第二列被按*/
315 2 {
316 3 keyFlag|=(0x0001<<(iScan*4+1)); /*置此键的标志位*/
317 3 }
318 2 else
319 2 {
320 3 keyFlag&=~(0x0001<<(iScan*4+1)); /*清此键的标志位*/
321 3 }
322 2 if((scanTempUchar&0x04) == 0x00) /*第三列被按*/
323 2 {
324 3 keyFlag|=0x0001<<(iScan*4+2); /*置此键的标志位*/
325 3 }
326 2 else
327 2 {
328 3 keyFlag&=~(0x0001<<(iScan*4+2)); /*清此键的标志位*/
329 3 }
330 2 if((scanTempUchar&0x08) == 0x00) /*第四列被按*/
331 2 {
332 3 keyFlag|=0x0001<<(iScan*4+3); /*置此键的标志位*/
333 3 }
334 2 else
335 2 {
336 3 keyFlag&=~(0x0001<<(iScan*4+3)); /*清此键标志位*/
337 3 }
338 2 scanValue = scanValue<<1|0x01; /*置下次扫描值*/
339 2 }
340 1 }
341
342 uchar KeyJudge(void) /*按键预处理*/
343 {
344 1 uchar j,counterKeyPressedNum;
345 1 uchar keyRet = 0x55; /*初始按键返回码设定为无按码0x55*/
346 1 uint uintTemp;
347 1
348 1 ScanKeys(); /*扫描键盘*/
349 1 if(keyFlag!=0)
350 1 {
351 2 Delay(1000); /*掩饰10ms以消除抖动*/
352 2 ScanKeys();
353 2 P1 = 0x0f;
354 2 while((P1&0x0f)!=0x0f); /*没松开按键就等按键松开*/
355 2 counterKeyPressedNum = 0;
356 2 for(j=0;j<16;j++)
357 2 {
358 3 uintTemp = ((uint)0x0001)<<j;
359 3 if((keyFlag&uintTemp)==uintTemp)
360 3 /*依次检测键盘扫描标志KeyFlag,如某位置一则按键个数寄存器加1*/
361 3 {
362 4 counterKeyPressedNum++;
C51 COMPILER V7.50 MAIN 03/19/2009 16:09:25 PAGE 7
363 4 keyRet = j;
364 4 }
365 3 }
366 2 if(counterKeyPressedNum>1) /*如果不止一个键被按则丢弃此状态返回无码0x55*/
367 2 {
368 3 return 0x55;
369 3 }
370 2 else /*某键被按,返回此键的标识码*/
371 2 {
372 3 return(keyRet);
373 3 }
374 2 }
375 1 return(0x55); /*无键被按则返回无按码*/
376 1 }
377
378 void KeyHandle(uchar keyIndex) /*按键处理模块*/
379 {
380 1 static uchar cnt = 0;
381 1 switch(keyIndex)
382 1 {
383 2 case 0x00: /*按1键*/
384 2 showitem = SHOW_TIME; /*标识当前显示时间*/
385 2 str1[0]='T';str1[1]='I';str1[2]='M';str1[3]='E';
386 2 cnt = 0;
387 2 current = CUR_MINUTE;
388 2 if((cs.cs2 & 0x08) == 0x08){ /*如果闹钟标志位置位(设定闹钟过程中可能会设置)*/
389 3 cs.cs2 &= 0xf7; /*清闹钟标志位*/
390 3 PCF8563_SetCS(cs); /*写8563控制/状态字*/
391 3 }
392 2 break;
393 2 case 0x01: /*按2键*/
394 2 showitem = SHOW_ALARM; /*标识当前显示闹钟*/
395 2 str1[0]='A';str1[1]='L';str1[2]='R';str1[3]='M';
396 2 cnt = 0;
397 2 current = CUR_MINUTE;
398 2 break;
399 2 case 0x02: /*按3见*/
400 2 if(showitem == SHOW_TIME){ /*如果显示时间*/
401 3 switch(cnt){ /*设定项目更改*/
402 4 case 0:current = CUR_MINUTE;break;
403 4 case 1:current = CUR_HOUR;break;
404 4 case 2:current = CUR_DAY;break;
405 4 case 3:current = CUR_WEEKDAY;break;
406 4 case 4:current = CUR_MONTH;break;
407 4 case 5:current = CUR_YEAR;break;
408 4 case 6:current = CUR_SECOND;break;
409 4 }
410 3 if(++cnt>6){ /*轮回*/
411 4 cnt = 0;
412 4 }
413 3 }else if(showitem == SHOW_ALARM){ /*如果显示闹钟*/
414 3 switch(cnt){
415 4 case 0:current = CUR_MINUTE;break;
416 4 case 1:current = CUR_HOUR;break;
417 4 }
418 3 if(++cnt>1){ /*轮回*/
419 4 cnt = 0;
420 4 }
421 3 }
422 2 break;
423 2 case 0x03: /*INC*/
424 2 if(showitem == SHOW_TIME){ /*如果显示时间*/
C51 COMPILER V7.50 MAIN 03/19/2009 16:09:25 PAGE 8
425 3 PCF8563_ReadTime(&tm); /*读时间*/
426 3 set_min = (tm.minutes>>4)*10+(tm.minutes&0x0f); /*BCD到HEX*/
427 3 set_hour = (tm.hours>>4)*10+(tm.hours&0x0f);
428 3 set_day = (tm.days>>4)*10+(tm.days&0x0f);
429 3 set_weekday = tm.weekdays;
430 3 set_month = (tm.mon_cen>>4)*10+(tm.mon_cen&0x0f);
431 3 set_year = (tm.years>>4)*10+(tm.years&0x0f);
432 3 set_second = (tm.seconds>>4)*10+(tm.seconds&0x0f);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -