?? main.lst
字號(hào):
C51 COMPILER V7.50 MAIN 03/19/2009 16:09:25 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include "reg52.h"
2 #include "intrins.h"
3 #include "1602lib.h"
4 #include "PCF8563lib.h"
*** WARNING C318 IN LINE 6 OF PCF8563lib.h: can't open file 'IIClib.h'
5
6 #define PAI_BASE 15
7 #define SCAN_CYCLE 10000
8
9 #define SECONDL 12 /*定義顯示字符位置*/
10 #define SECONDH 11
11 #define MINUTEL 9
12 #define MINUTEH 8
13 #define HOURL 6
14 #define HOURH 5
15 #define DAYL 10
16 #define DAYH 9
17 #define WEEKDAY 15
18 #define MONTHS 5
19 #define YEARL 15
20 #define YEARH 14
21 #define AMPM 14
22
23 typedef enum{ /*定義枚舉以標(biāo)識(shí)當(dāng)前設(shè)定位置*/
24 CUR_SECOND,
25 CUR_MINUTE,
26 CUR_HOUR,
27 CUR_DAY,
28 CUR_WEEKDAY,
29 CUR_MONTH,
30 CUR_YEAR
31 } Current;
32
33 typedef enum{ /*定義枚舉以標(biāo)識(shí)顯示內(nèi)容*/
34 SHOW_TIME,
35 SHOW_ALARM
36 } ShowItem;
37
38 uchar str1[] = "TIME:15:23:14 W7"; /*初始顯示時(shí)間*/
39 uchar str2[] = "DATE:JUN.30,2007";
40 bit alarmflg = 0;
41 bit timerflg = 0;
42 bit flg_100ms = 0;
43 struct c_s cs;
44 struct time tm;
45 struct alarm alm;
46 uchar set_min = 0,set_hour = 0,set_day = 0,set_weekday = 0,set_month = 0,set_year = 0,set_second = 0;
47 uchar setalarm_min = 0,setalarm_hour = 0;
48 Current current = CUR_MINUTE;
49 ShowItem showitem = SHOW_TIME;
50 uint keyFlag;
51
52 bit Int0Flag = 0;
53 uchar s_tableCounter,musicplayflg = 0;
54 uchar TH0Temp,TL0Temp;
C51 COMPILER V7.50 MAIN 03/19/2009 16:09:25 PAGE 2
55 const char code c_music[] = { 0x82,0x01,0x81,0x94,0x84, /*鬧鐘用生日快樂歌*/
56 0xb4,0xa4,0x04,
57 0x82,0x01,0x81,0x94,0x84,
58 0xc4,0xb4,0x04,
59 0x82,0x01,0x81,0xf4,0xd4,
60 0xb4,0xa4,0x94,
61 0xe2,0x01,0xe1,0xd4,0xb4,
62 0xc4,0xb4,0x04,
63 0x00};
64 const uint code c_musicFreq[] = {64260,64400,64524,64580, /*低音5,6,7,中音1*/
65 64684,64777,64820,64898, /*中音2,3,4,5*/
66 64968,65030,65058,65110, /*中音6,7,高音1,2*/
67 65157,65178,65217}; /*高音2,3,4,5*/
68
69 void TxData(uchar dat);
70 void Delay(uint n);
71 void ModShow(struct time tm); /*調(diào)整顯示內(nèi)容函數(shù)*/
72 uchar Ascii(uchar dat); /*獲取數(shù)字ASCII碼函數(shù)*/
73 void Months(uchar dat); /*月份數(shù)字轉(zhuǎn)字符函數(shù)*/
74 void PCF8563_Init(void); /*初始化PCF8563,包括控制狀態(tài)寄存器,時(shí)間及鬧鐘*/
75 void ModAlarm(struct alarm* alm); /*調(diào)整鬧鐘時(shí)間模塊*/
76 void ModTime(struct time * tm); /*調(diào)整時(shí)間模塊*/
77 void ScanKeys(void); /*掃描鍵盤模塊*/
78 uchar KeyJudge(void); /*按鍵預(yù)處理*/
79 void KeyHandle(uchar KeyIndex); /*按鍵處理模塊*/
80
81 void main(void)
82 {
83 1 TMOD = 0x11; /*TIMER0工作在MODE1,16位定時(shí)器,TIMER1工作在MODE2,自動(dòng)重新裝載模式*/
84 1
85 1 TH0 = 65536;
86 1 TL0 = 65536;
87 1 TH1 = (65536-SCAN_CYCLE)/256; /*設(shè)定TIMER1每隔SCAN_CYCLE 毫秒中斷一次*/
88 1 TL1 = (65536-SCAN_CYCLE)%256;
89 1 TR1 = 1; /*啟動(dòng)TIMER1*/
90 1 T2CON =0X38; /*令定時(shí)器2作為串口波特率發(fā)生器*/
91 1 TL2 = 0Xd9; /*設(shè)定串口波特率為9600,晶振為12MHz*/
92 1 TH2 = 0Xff;
93 1 RCAP2L = 0Xd9; /*根據(jù)串口波特率9600設(shè)定自動(dòng)重載寄存器*/
94 1 RCAP2H = 0xff;
95 1 TR2 = 1;
96 1 SCON = 0X50; /*設(shè)定UART工作在MODE3模式,可傳送和接收數(shù)據(jù),REN=1*/
97 1 IE = 0X8a; /*使能中斷,TIMER0,1中斷,外部中斷1,2*/
98 1 P2 = 0Xff;
99 1
100 1 LCD_init(); /*LCD初始化*/
101 1 DisplayString(0,0,str1); /*顯示第一行字符*/
102 1 DisplayString(0,1,str2); /*顯示第二行字符*/
103 1 PCF8563_Init(); /*PCF8563初始化*/
104 1
105 1 while(1)
106 1 {
107 2 uchar keyPtr;
108 2 keyPtr = KeyJudge(); /*鍵盤掃描判斷*/
109 2 if(keyPtr!=0x55) /*如果按某鍵則進(jìn)行相應(yīng)處理*/
110 2 {
111 3 KeyHandle(keyPtr);
112 3 }
113 2
114 2 if(flg_100ms){ /*判斷100MS到否*/
115 3 flg_100ms = 0;
116 3 if(showitem == SHOW_TIME){ /*如果需要時(shí)間顯示*/
C51 COMPILER V7.50 MAIN 03/19/2009 16:09:25 PAGE 3
117 4 PCF8563_ReadTime(&tm); /*讀PCF8563時(shí)間*/
118 4 ModShow(tm); /*調(diào)整顯示內(nèi)容*/
119 4 DisplayString(0,0,str1); /*顯示第一行字符*/
120 4 DisplayString(0,1,str2); /*顯示第二行字符*/
121 4
122 4 PCF8563_ReadCS(&cs); /*讀PCF8563控制/狀態(tài)字*/
123 4 if((cs.cs2&0x08)==0x08){ /*如果鬧鐘時(shí)間到*/
124 5 musicplayflg = 1; /*設(shè)置播放音樂標(biāo)志*/
125 5 TR0 = 1; /*啟動(dòng)TIMER0*/
126 5 cs.cs2 &= 0xf7; /*清鬧鐘標(biāo)志位*/
127 5 PCF8563_SetCS(cs); /*寫PCF8563控制/狀態(tài)字*/
128 5 }
129 4 }else if(showitem == SHOW_ALARM);{ /*如果需要顯示鬧鐘時(shí)間*/
130 4 ModAlarm(&alm); /*調(diào)整鬧鐘時(shí)間*/
131 4 tm.minutes = alm.minute; /*將鬧鐘時(shí)間作為時(shí)間顯示*/
132 4 tm.hours = alm.hour;
133 4 tm.days = alm.day;
134 4 tm.weekdays = alm.weekday;
135 4 ModShow(tm); /*調(diào)整顯示內(nèi)容*/
136 4 DisplayString(0,0,str1); /*顯示第一行字符*/
137 4 DisplayString(0,1,str2); /*顯示第二行字符*/
138 4 }
139 3 }
140 2 }
141 1 }
142 void PCF8563_Init(void)
143 {
144 1 cs.cs1 = 0x00;
145 1 cs.cs2 = 0x02; /*使能鬧鐘*/
146 1 PCF8563_SetCS(cs); /*設(shè)置控制/狀態(tài)字*/
147 1
148 1 tm.seconds = 50; /*設(shè)置初始時(shí)間*/
149 1 tm.minutes = 58;
150 1 tm.hours = 23;
151 1 tm.days = 31;
152 1 tm.weekdays = 2;
153 1 tm.mon_cen = 12;
154 1 tm.years = 6;
155 1 PCF8563_SetTime(tm);
156 1
157 1 alm.minute = 59; /*設(shè)定初始鬧鐘時(shí)間*/
158 1 alm.hour = 23;
159 1 alm.day = 00;
160 1 alm.weekday = 2;
161 1 PCF8563_SetAlarm(alm,1,1,0,0); /*設(shè)置鬧鐘*/
162 1 }
163
164 void ModShow(struct time tm)
165 {
166 1 uchar tmpL,tmpH;
167 1
168 1 tmpL = tm.seconds & 0x0f; /*調(diào)整秒顯示*/
169 1 tmpH = (tm.seconds & 0x7f)>>4; /*屏蔽VL位*/
170 1 str1[SECONDL] = Ascii(tmpL);
171 1 str1[SECONDH] = Ascii(tmpH);
172 1
173 1 tmpL = tm.minutes & 0x0f; /*調(diào)整分鐘顯示*/
174 1 tmpH = tm.minutes>>4;
175 1 str1[MINUTEL] = Ascii(tmpL);
176 1 str1[MINUTEH] = Ascii(tmpH);
177 1
178 1 tmpL = tm.hours & 0x0f; /*調(diào)整小時(shí)顯示*/
C51 COMPILER V7.50 MAIN 03/19/2009 16:09:25 PAGE 4
179 1 tmpH = tm.hours>>4;
180 1 str1[HOURL] = Ascii(tmpL);
181 1 str1[HOURH] = Ascii(tmpH);
182 1
183 1 tmpL = tm.days & 0x0f; /*調(diào)整天顯示*/
184 1 tmpH = tm.days>>4;
185 1 str2[DAYL] = Ascii(tmpL);
186 1 str2[DAYH] = Ascii(tmpH);
187 1
188 1 tmpL = tm.weekdays & 0x07; /*調(diào)整星期顯示*/
189 1 str1[WEEKDAY] = Ascii(tmpL);
190 1
191 1 tmpL = ((tm.mon_cen&0x7f)>>4)*10 + tm.mon_cen & 0x0f; /*體制哦啊橫月份顯示(BCD到HEX)*/
192 1 Months(tmpL); /*月份數(shù)字轉(zhuǎn)字符*/
193 1
194 1 tmpL = tm.years & 0x0f; /*調(diào)整年顯示*/
195 1 tmpH = tm.years>>4;
196 1 str2[YEARL] = Ascii(tmpL);
197 1 str2[YEARH] = Ascii(tmpH);
198 1 }
199
200 uchar Ascii(uchar dat)
201 {
202 1 return dat + 0x30; /*0~9得Ascii碼為其+0x30*/
203 1 }
204
205 void Months(uchar dat)
206 {
207 1 switch(dat){
208 2 case 1:str2[MONTHS]='J';str2[MONTHS+1]='A';str2[MONTHS+2]='N';break;
209 2 case 2:str2[MONTHS]='F';str2[MONTHS+1]='E';str2[MONTHS+2]='B';break;
210 2 case 3:str2[MONTHS]='M';str2[MONTHS+1]='A';str2[MONTHS+2]='R';break;
211 2 case 4:str2[MONTHS]='A';str2[MONTHS+1]='P';str2[MONTHS+2]='R';break;
212 2 case 5:str2[MONTHS]='M';str2[MONTHS+1]='A';str2[MONTHS+2]='Y';break;
213 2 case 6:str2[MONTHS]='J';str2[MONTHS+1]='U';str2[MONTHS+2]='N';break;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -