📄 main.lst
字号:
C51 COMPILER V8.08 MAIN 01/11/2009 23:45:34 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: F:\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <reg52.h>
2 #include "LCD12864.h"
3 #include "SHT10.h"
4 #include "DS1302.h"
5 #include <delay.h>
6 #include<stdio.h>
7
8 #define ADDR_YEAR 0x8d
9 #define ADDR_MON 0x89
10 #define ADDR_DATE 0x87
11 #define ADDR_HOUR 0x85
12 #define ADDR_MIN 0x83
13 #define ADDR_SEC 0x81
14 #define ADDR_DAY 0x8B
15
16 #define POS_YEAR ADDR_LINE1+2
17 #define POS_MON ADDR_LINE1+4
18 #define POS_DATE ADDR_LINE1+6
19 #define POS_HOUR ADDR_LINE2
20 #define POS_MIN ADDR_LINE2+1
21 #define POS_SEC ADDR_LINE2+3
22 #define POS_DAY ADDR_LINE2+7
23 #define POS_TEMP ADDR_LINE3+5
24 #define POS_HUMI ADDR_LINE4+5
25
26 #define SEC 0
27 #define MIN 1
28 #define HOUR 2
29 #define DATE 3
30 #define MON 4
31 #define DAY 5
32 #define YEAR 6
33
34 float idata humiLimit = 80; //温湿度上限
35 float idata tempLimit = 28;
36
37 sbit buzzer=P2^5;
38 uchar idata sysData[7]={0x00,0x00,0x00,0x31,0x10,0x05,0x08};//DS1302数据(BCD码)
39 float tempf,humif;
40 uchar idata temps[5],humis[5];
41 uchar code MonSheet[2][19]={0,0x31,0x28,0x31,0x30,0x31,0x30,0x31,0x31,0x30,0,0,0,0,0,0,0x31,0x30,0x31,
42 0,0x31,0x29,0x31,0x30,0x31,0x30,0x31,0x31,0x30,0,0,0,0,0,0,0x31,0x30,0x31};
43
44
45 bit flagSettings,pFlagSettings,flagInc,flagDec,flagInc10,flagDec10; //依次为系统设置标志位,前次系统设置标
-志位,加标志位,减标志位(长按加标志位,长按减标志位,实现长按加减10的功能,尚未实现)
46 bit n;
47 uchar m;
48 uchar flagOpt; //选项的标志位,0-8,对应9项数据
49
50 sbit key1=P2^2;
51 sbit key2=P2^3;
52 sbit key3=P2^4;
53
54 uint SHTcount,blinkCount;
C51 COMPILER V8.08 MAIN 01/11/2009 23:45:34 PAGE 2
55 /********************************************************************
56 函数名称:keyscan
57 功 能:按键监测,分长按短按(用定时器实现),长按时间为1秒,按键1短按返回11,长按返
58 回12,按键2短按返回21,长按返回22,以此类推,同时改变按键对应
59 的标志位
60 入口参数:无
61 返回参数:a
62 ********************************************************************/
63 int keyscan()
64 {
65 1 unsigned char a;
66 1 if(key1==0)
67 1 {
68 2 delay(5);
69 2 if(key1==0)
70 2 {
71 3 TR0=1;
72 3
73 3 }
74 2 while(!key1);
75 2 delay(5);
76 2 while(!key1);
77 2 if(n==0)
78 2 {
79 3 if(flagSettings==1)
80 3 {
81 4 flagOpt++;
82 4 if(flagOpt==9)
83 4 flagOpt=0;
84 4 }
85 3 a=11;
86 3 m=0;
87 3 TR0=0;
88 3
89 3 }
90 2 else if(n==1)
91 2 {
92 3 flagSettings=~flagSettings; //系统设置的标志位,1进入系统设置,0退出
93 3 flagOpt=0;
94 3 LcdClear();
95 3 a=12;
96 3 n=0;
97 3 m=0;
98 3 TR0=0;
99 3 }
100 2 }
101 1 if(key2==0)
102 1 {
103 2 delay(5);
104 2 if(key2==0)
105 2 {
106 3 TR0=1;
107 3
108 3 }
109 2 while(!key2);
110 2 delay(5);
111 2 while(!key2);
112 2 if(n==0)
113 2 {
114 3 if(flagSettings==1)
115 3 flagInc=1;
116 3 a=21;
C51 COMPILER V8.08 MAIN 01/11/2009 23:45:34 PAGE 3
117 3 m=0;
118 3 TR0=0;
119 3
120 3 }
121 2 else if(n==1)
122 2 {
123 3 flagInc10=1;
124 3 a=22;
125 3 n=0;
126 3 m=0;
127 3 TR0=0;
128 3 }
129 2 }
130 1 if(key3==0)
131 1 {
132 2 delay(5);
133 2 if(key3==0)
134 2 {
135 3 TR0=1;
136 3
137 3 }
138 2 while(!key3);
139 2 delay(5);
140 2 while(!key3);
141 2 if(n==0)
142 2 {
143 3 if(flagSettings==1)
144 3 flagDec=1;
145 3 a=31;
146 3 m=0;
147 3 TR0=0;
148 3
149 3 }
150 2 else if(n==1)
151 2 {
152 3 flagDec10=1;
153 3 a=32;
154 3 n=0;
155 3 m=0;
156 3 TR0=0;
157 3 }
158 2 }
159 1 return a;
160 1 }
161
162 void timer0() interrupt 1 using 3
163 {
164 1 TH0=(65536-10000)/256;
165 1 TL0=(65536-10000)%256;
166 1 m++;
167 1 if(m==100)
168 1 {
169 2 m=0;
170 2 n=1;
171 2 }
172 1 }
173 /********************************************************************
174 函数名称:Display***()
175 功 能:显示年月日星期时分秒
176 入口参数:无
177 返回参数:无
178 ********************************************************************/
C51 COMPILER V8.08 MAIN 01/11/2009 23:45:34 PAGE 4
179
180
181 void DisplayYear()
182 {
183 1 WriteCmd12864(POS_YEAR);
184 1 WriteData12864(sysData[YEAR]/16+0x30);
185 1 WriteData12864(sysData[YEAR]%16+0x30);
186 1 }
187 void DisplayMon()
188 {
189 1 WriteCmd12864(POS_MON);
190 1 WriteData12864(sysData[MON]/16+0x30);
191 1 WriteData12864(sysData[MON]%16+0x30);
192 1 }
193 void DisplayDate()
194 {
195 1 WriteCmd12864(POS_DATE);
196 1 WriteData12864(sysData[DATE]/16+0x30);
197 1 WriteData12864(sysData[DATE]%16+0x30);
198 1 }
199 void DisplayHour()
200 {
201 1 WriteCmd12864(POS_HOUR);
202 1 WriteData12864(sysData[HOUR]/16+0x30);
203 1 WriteData12864(sysData[HOUR]%16+0x30);
204 1 }
205 void DisplayMin()
206 {
207 1 WriteCmd12864(POS_MIN);
208 1 WriteData12864(0x3A);
209 1 WriteData12864(sysData[MIN]/16+0x30);
210 1 WriteData12864(sysData[MIN]%16+0x30);
211 1 WriteData12864(0x3A);
212 1 }
213 void DisplaySec()
214 {
215 1 WriteCmd12864(POS_SEC);
216 1 WriteData12864(sysData[SEC]/16+0x30);
217 1 WriteData12864(sysData[SEC]%16+0x30);
218 1 }
219
220 void DisplayDay()
221 {
222 1 switch (sysData[DAY])
223 1 {
224 2 case 1: Display12864(POS_DAY,"一"); break;
225 2 case 2: Display12864(POS_DAY,"二"); break;
226 2 case 3: Display12864(POS_DAY,"三"); break;
227 2 case 4: Display12864(POS_DAY,"四"); break;
228 2 case 5: Display12864(POS_DAY,"五"); break;
229 2 case 6: Display12864(POS_DAY,"六"); break;
230 2 case 7: Display12864(POS_DAY,"日"); break;
231 2 default: break;
232 2 }
233 1 }
234 /********************************************************************
235 函数名称:DisplayFrame()
236 功 能:初试显示,仅在flagsettings发生变化的时候调用
237 入口参数:无
238 返回参数:无
239 ********************************************************************/
240
C51 COMPILER V8.08 MAIN 01/11/2009 23:45:34 PAGE 5
241
242
243 void DisplayFrame()
244 {
245 1 Display12864(ADDR_LINE1+3,"年");
246 1 Display12864(ADDR_LINE1+5,"月");
247 1 Display12864(ADDR_LINE1+7,"日");
248 1 Display12864(ADDR_LINE2+5,"星期");
249 1
250 1 DisplayYear();
251 1 DisplayMon();
252 1 DisplayDate();
253 1 DisplayHour();
254 1 DisplayMin();
255 1 DisplaySec();
256 1 DisplayDay();
257 1
258 1
259 1 if(flagSettings==0) //监视状态显示当前温湿度的字样,设置状态显示要设置的报警温湿度的字样
260 1 {
261 2 Display12864(ADDR_LINE3,"当前温度:");
262 2 Display12864(ADDR_LINE4,"当前湿度:");
263 2 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -