📄 main.lst
字号:
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{ /*定义枚举以标识当前设定位置*/
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{ /*定义枚举以标识显示内容*/
34 SHOW_TIME,
35 SHOW_ALARM
36 } ShowItem;
37
38 uchar str1[] = "TIME:15:23:14 W7"; /*初始显示时间*/
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); /*调整显示内容函数*/
72 uchar Ascii(uchar dat); /*获取数字ASCII码函数*/
73 void Months(uchar dat); /*月份数字转字符函数*/
74 void PCF8563_Init(void); /*初始化PCF8563,包括控制状态寄存器,时间及闹钟*/
75 void ModAlarm(struct alarm* alm); /*调整闹钟时间模块*/
76 void ModTime(struct time * tm); /*调整时间模块*/
77 void ScanKeys(void); /*扫描键盘模块*/
78 uchar KeyJudge(void); /*按键预处理*/
79 void KeyHandle(uchar KeyIndex); /*按键处理模块*/
80
81 void main(void)
82 {
83 1 TMOD = 0x11; /*TIMER0工作在MODE1,16位定时器,TIMER1工作在MODE2,自动重新装载模式*/
84 1
85 1 TH0 = 65536;
86 1 TL0 = 65536;
87 1 TH1 = (65536-SCAN_CYCLE)/256; /*设定TIMER1每隔SCAN_CYCLE 毫秒中断一次*/
88 1 TL1 = (65536-SCAN_CYCLE)%256;
89 1 TR1 = 1; /*启动TIMER1*/
90 1 T2CON =0X38; /*令定时器2作为串口波特率发生器*/
91 1 TL2 = 0Xd9; /*设定串口波特率为9600,晶振为12MHz*/
92 1 TH2 = 0Xff;
93 1 RCAP2L = 0Xd9; /*根据串口波特率9600设定自动重载寄存器*/
94 1 RCAP2H = 0xff;
95 1 TR2 = 1;
96 1 SCON = 0X50; /*设定UART工作在MODE3模式,可传送和接收数据,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) /*如果按某键则进行相应处理*/
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){ /*如果需要时间显示*/
C51 COMPILER V7.50 MAIN 03/19/2009 16:09:25 PAGE 3
117 4 PCF8563_ReadTime(&tm); /*读PCF8563时间*/
118 4 ModShow(tm); /*调整显示内容*/
119 4 DisplayString(0,0,str1); /*显示第一行字符*/
120 4 DisplayString(0,1,str2); /*显示第二行字符*/
121 4
122 4 PCF8563_ReadCS(&cs); /*读PCF8563控制/状态字*/
123 4 if((cs.cs2&0x08)==0x08){ /*如果闹钟时间到*/
124 5 musicplayflg = 1; /*设置播放音乐标志*/
125 5 TR0 = 1; /*启动TIMER0*/
126 5 cs.cs2 &= 0xf7; /*清闹钟标志位*/
127 5 PCF8563_SetCS(cs); /*写PCF8563控制/状态字*/
128 5 }
129 4 }else if(showitem == SHOW_ALARM);{ /*如果需要显示闹钟时间*/
130 4 ModAlarm(&alm); /*调整闹钟时间*/
131 4 tm.minutes = alm.minute; /*将闹钟时间作为时间显示*/
132 4 tm.hours = alm.hour;
133 4 tm.days = alm.day;
134 4 tm.weekdays = alm.weekday;
135 4 ModShow(tm); /*调整显示内容*/
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); /*设置控制/状态字*/
147 1
148 1 tm.seconds = 50; /*设置初始时间*/
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; /*设定初始闹钟时间*/
158 1 alm.hour = 23;
159 1 alm.day = 00;
160 1 alm.weekday = 2;
161 1 PCF8563_SetAlarm(alm,1,1,0,0); /*设置闹钟*/
162 1 }
163
164 void ModShow(struct time tm)
165 {
166 1 uchar tmpL,tmpH;
167 1
168 1 tmpL = tm.seconds & 0x0f; /*调整秒显示*/
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; /*调整分钟显示*/
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; /*调整小时显示*/
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; /*调整天显示*/
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; /*调整星期显示*/
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); /*月份数字转字符*/
193 1
194 1 tmpL = tm.years & 0x0f; /*调整年显示*/
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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -