📄 main.lst
字号:
C51 COMPILER V7.50 MAIN 09/13/2006 09:30:06 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 //头文件包含-----------------------------------------------------
2 #include<LCD.H>
3 #include<12887.H>
4 #include<DS18B20.H>
5 #include<WAVE.H>
6 #include<reg51.h>
7 //全局变量--------------------------------------------------------------
8 bit Ex0Flag=0; //外部中断标志
9 bit AlarmFlag=0; //定时中断标志
10
11 idata unsigned char Key=0; //键值
12 idata unsigned char CurIndex=0; //主菜单标号
13
14 idata unsigned char DisBuf; //距离变量
15 idata unsigned char TempBuf; //温度变量
16 idata unsigned char DateBuf[6]={6,9,7,4,2,0}; //时间日期变量
17 idata unsigned char AlarmBuf[3]={0}; //定时时间变量
18 idata unsigned char DateTbl[6]={2,6,10,0,4,8}; //时间在字符串中的位置
19
20 idata char Date[]="2006年09月08日"; //日期显示缓冲区
21 idata char Time[]="00:00:00"; //时间显示缓冲区
22 idata char Dis[]="测试距离:000mm"; //距离显示缓冲区
23 idata char Temp[]="温度:00^C"; //温度显示缓冲区
24 //系统函数声明--------------------------------------------------------
25 void FstGrap(void); //显示开机画面函数
26 void ShowTime(void); //显示时间函数
27 void ShowDate(void); //显示日期函数
28 void ShowDis(void); //显示距离函数
29 void ShowTemp(void); //显示温度函数
30 void ShowDis(void); //显示距离函数
31 void SetDate(void); //设置时间日期函数
32 void SetClk(void); //设置定时时间函数
33 unsigned char ReadKey(void); //按键扫描函数
34 void delay1(unsigned int t); //延时函数
35 struct MENU{ //菜单结构体
36 char code *name; //菜单的名字
37 void (*Fun)(void);} //对应的函数指针
38 Menu[]={ //菜单结构体数组初始化
39 {"显示时间",ShowTime},
40 {"显示日期",ShowDate},
41 {"显示温度",ShowTemp},
42 {"检测距离",ShowDis},
43 {"设置时间日期",SetDate},
44 {"设置定时时间",SetClk}};
45 //主函数----------------------------------------------------------------
46 main()
47 {
48 1 unsigned char i;
49 1 entry:
50 1 Lcd_init(); //系统初始化函数
51 1 DS12887_init();
52 1 Clr_grap();Scr_clr();
53 1 delay1(5000);
54 1 FstGrap();
55 1
C51 COMPILER V7.50 MAIN 09/13/2006 09:30:06 PAGE 2
56 1 do{Key=ReadKey();}
57 1 while(Key==0);
58 1 Clr_grap();
59 1 Scr_clr();
60 1 while(1)
61 1 {
62 2 if(Key!=0) //如果有间按下则进行相应的处理
63 2 {
64 3 switch(Key) //按键处理程序
65 3 {
66 4 case 1: //确定键,执行相应的函数
67 4 Menu[CurIndex].Fun();
68 4 break;
69 4 case 2: //光标上移
70 4 if(CurIndex++==5)
71 4 CurIndex=0;
72 4 break;
73 4 case 3: //光标下移
74 4 if(CurIndex--==0)
75 4 CurIndex=5;
76 4 break;
77 4 case 4: //取消键,返回
78 4 goto entry;
79 4 break;
80 4 }
81 3
82 3 Scr_clr(); //重新绘制显示界面
83 3 Set_addr(1,2);
84 3 if(CurIndex<4) //绘制前四个菜单
85 3 {
86 4 for(i=0;i<4;i++)
87 4 {
88 5 Set_addr(i+1,2);
89 5 Write_str(Menu[i].name);
90 5 }
91 4
92 4 Set_addr(CurIndex+1,1); //绘制光标
93 4 Write_char(62);
94 4 }
95 3 else
96 3 {
97 4 Set_addr(1,2); //绘制后两个菜单
98 4 Write_str(Menu[4].name);
99 4 Set_addr(2,2);
100 4 Write_str(Menu[5].name);
101 4
102 4 Set_addr((CurIndex+1)%4,1); //绘制光标
103 4 Write_char(62);
104 4 }
105 3 }
106 2 Key=ReadKey();
107 2 if(AlarmFlag) //如果闹铃开了,检测定时时间是否到了
108 2 {
109 3 Read_12887(DateBuf);
110 3 if((AlarmBuf[0]==DateBuf[3])&&(AlarmBuf[1]==DateBuf[4])&&(AlarmBuf[2]==DateBuf[5]))
111 3 {
112 4 Scr_clr();
113 4 delay1(5000);
114 4 Set_addr(2,2);
115 4 Write_str("定时时间到了");
116 4 do{Key=ReadKey();}
117 4 while(Key==0);
C51 COMPILER V7.50 MAIN 09/13/2006 09:30:06 PAGE 3
118 4 Key=2;
119 4 }
120 3 }
121 2 }
122 1 }
123 //中断函数-------------------------------------------------------
124 void extern0_ISR() interrupt 0
125 {
126 1 EX0=0;TR0=0;//WAV=0;
127 1 Ex0Flag=1;
128 1 }
129 //函数定义部分----------------------------------------------------
130 void delay1(unsigned int t)
131 {
132 1 while(--t);
133 1 }
134 //---------------------------------------------
135 //函数:unsigned char ReadKey(void)
136 //功能:按键扫描程序
137 //返回:返回按键值
138 //---------------------------------------------
139 unsigned char ReadKey(void)
140 {
141 1 unsigned char KeyValue,a,i;
142 1 char code keytbl[]={0x02,0x01,0x20,0x80};
143 1 P2=P2|0xa3;
144 1 KeyValue=P2;
145 1 KeyValue=~KeyValue;
146 1 KeyValue=KeyValue&0xa3;
147 1 if(!KeyValue) return(0);
148 1 delay1(1000);
149 1 P2=P2|0xa3;
150 1 KeyValue=P2;
151 1 KeyValue=~KeyValue;
152 1 KeyValue=KeyValue&0xa3;
153 1 if(!KeyValue) return(0);
154 1 do{a=P2|~0xa3;}
155 1 while(a!=0xff);
156 1 for(i=0;i<4;i++)
157 1 if(KeyValue==keytbl[i])
158 1 return(i+1);
159 1 }
160 //---------------------------------
161 //函数:char* itoa(unsigned char c)
162 //功能:将数值转换成字符串
163 //---------------------------------
164 char* itoa(unsigned char c)
165 {
166 1 char str1[2];
167 1 str1[0]=c/10+48;
168 1 str1[1]=c%10+48;
169 1 return(str1);
170 1 }
171 void ProcAlarm(void)
172 {
173 1 char *a;
174 1 a=itoa(AlarmBuf[0]); //时
175 1 Time[DateTbl[3]]=a[0];Time[DateTbl[3]+1]=a[1];
176 1 a=itoa(AlarmBuf[1]); //分
177 1 Time[DateTbl[4]]=a[0];Time[DateTbl[4]+1]=a[1];
178 1 a=itoa(AlarmBuf[2]); //秒
179 1 Time[DateTbl[5]]=a[0];Time[DateTbl[5]+1]=a[1];
C51 COMPILER V7.50 MAIN 09/13/2006 09:30:06 PAGE 4
180 1 }
181 void ProcTime(void)
182 {
183 1 char *a;
184 1 a=itoa(DateBuf[3]); //时
185 1 Time[DateTbl[3]]=a[0];Time[DateTbl[3]+1]=a[1];
186 1 a=itoa(DateBuf[4]); //分
187 1 Time[DateTbl[4]]=a[0];Time[DateTbl[4]+1]=a[1];
188 1 a=itoa(DateBuf[5]); //秒
189 1 Time[DateTbl[5]]=a[0];Time[DateTbl[5]+1]=a[1];
190 1 }
191 void ProcDate(void)
192 {
193 1 char *a;
194 1 a=itoa(DateBuf[0]); //年
195 1 Date[DateTbl[0]]=a[0];Date[DateTbl[0]+1]=a[1];
196 1 a=itoa(DateBuf[1]); //月
197 1 Date[DateTbl[1]]=a[0];Date[DateTbl[1]+1]=a[1];
198 1 a=itoa(DateBuf[2]); //日
199 1 Date[DateTbl[2]]=a[0];Date[DateTbl[2]+1]=a[1];
200 1 }
201 //------------------------------------------------------------
202 //函数:void ShowTime(void)
203 //功能:在液晶上显示时间
204 //------------------------------------------------------------
205 void ShowTime(void)
206 {
207 1 unsigned int t=0; //时分秒添加到成字符串
208 1 Key=0;
209 1 Scr_clr();Set_addr(2,2);
210 1 while(Key==0)
211 1 {
212 2 Read_12887(DateBuf); //读取时间信息
213 2
214 2 ProcTime(); //将数值转换成字符串
215 2
216 2 Set_addr(2,2); //在液晶上显示
217 2 Write_str("当前时间为");
218 2 Set_addr(3,2);
219 2 Write_str(Time);
220 2
221 2 Key=ReadKey();
222 2 delay1(5000);
223 2 }
224 1 }
225 //------------------------------------------------------------------
226 //函数:void ShowDateBuf(void)
227 //功能:将读取的时间转换成字符串,在液晶中显示
228 //-------------------------------------------------------------------
229 void ShowDate(void)
230 {
231 1 Key=0; //年月日添加到成字符串
232 1 Scr_clr();Set_addr(2,2);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -