📄 lcd_main.lst
字号:
C51 COMPILER V6.12 LCD_MAIN 08/01/2005 20:10:26 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE LCD_MAIN
OBJECT MODULE PLACED IN C:\DOCUME~1\ADMINI~1\MYDOCU~1\89C51\LCD_MAIN.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE C:\DOCUME~1\ADMINI~1\MYDOCU~1\89C51\LCD_MAIN.C DB SB OE
stmt level source
1
2 #include <AT89x51.H>
3 #include <STRING.H>
4 #include <INTRINS.H>
5
6 #define LCM_RW P1_7 //定义引脚
7 #define LCM_RS P1_6
8 #define LCM_E P3_4
9 #define LCM_Data P0
10 #define Busy 0x80 //用于检测LCM状态字中的Busy标识
11
12 #define Key_UP P2_0 //上调温度
13 #define Key_DOWN P2_1 //下调温度
14 #define Key_SET P2_2 //设定键(温度设定,长按开电源)
15 #define RelayOutPort P2_6 //继电器输出
16 #define tjrout P1_5
17 #define TMPort P1_1 //DS1820 DataPort
18 #define optin P2_3 //光藕开入
19 unsigned char code LCDDis[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x20,0x2d}; //0-9的ASCII码,
-0x20为空,0x2d为负号
20
21 unsigned char i,j,cj,cj2,rs,rs2,tjrx,k;
22
23 static unsigned char bdata StateREG; //可位寻址的状态寄存器
24 sbit DS1820ON = StateREG^0; //DS1820是否存在
25 sbit SetTF = StateREG^1; //是否是在温度设置状态
26 sbit KeySETDown = StateREG^2; //是否已按过SET键标识
27 sbit PowTF = StateREG^3; //电源标识
28 sbit KeyTF = StateREG^4; //键盘是否允许
29
30 //sbit KeySETDowning = StateREG^5; //SET是否正在按下
31 static unsigned char bdata TLV _at_ 0x0029; //温度变量高低位
32 static unsigned char bdata THV _at_ 0x0028;
33 static signed char TMV; //转换后的温度值
34 static unsigned char KeyV,TempKeyV; //键值
35 static signed char TMRomV _at_ 0x0027; //高温限制
36 static signed char TMSetV _at_ 0x0026; //温度设定值
37 static unsigned char KSDNum; //SET键连按时的采集次数
38 static unsigned char IntNum,IntNum2,IntNum3; //中断发生次数,IntNum用于SET长按检测,IntNum2用于设定状态
-时LCD闪烁
39 static signed char LCD_One,LCD_Two,LCD_Three; //LCD的显示位 LCD_One为十位,LCD_Two为个位
40 static signed char count_One,count_Two,count_Three,count_cj2; //LCD的显示位 LCD_One为十位,LCD_Two为个位
41 static signed char LCD_One_set,LCD_Two_set,LCD_Three_set; //设置时的LCD值
42 static unsigned char Sign, Sign_Set; //负号标识
43 static unsigned char ss,ss2,ss3; //负号标识
44
45 void WriteDataLCM(unsigned char WDLCM);
46 void WriteCommandLCM(unsigned char WCLCM,BuysC);
47 unsigned char ReadDataLCM(void);
48 unsigned char ReadStatusLCM(void);
49 void LCMInit(void);
50 void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
51 void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
52 void Delay5Ms(void);
53 void Delay400Ms(void);
C51 COMPILER V6.12 LCD_MAIN 08/01/2005 20:10:26 PAGE 2
54 unsigned char code relays_s[] = {"Relay Status: "};
55 unsigned char code cdle_net[] = {" WellCome! "};
56 unsigned char code test_ok[] = {" Test Over! :) "};
57 unsigned char code email[] = {" Press Power Key"};
58 unsigned char cur_temper[]={"Current Temp: "};
59 unsigned char cur_count[]= {"Tjr Count : "};
60 unsigned char cur_temper_set[]={"T_Set: "};
61 unsigned char code null[] ={" "};
62
63 unsigned char BF = 0; //定时中断标志,=1时显示当前温度值,=0显示欢迎
64
65 void main(void)
66 {
67 1 void InitDS1820(void); //定义函数
68 1 void ROMDS1820(void);
69 1 void TMVDS1820(void);
70 1 void TMRDS1820(void);
71 1 void TMWDS1820(void);
72 1 void dtod(void);
73 1 void TMREDS1820(void);
74 1 void TMERDS1820(void);
75 1 void ReadDS1820(void);
76 1 void WriteDS1820(void);
77 1 void Delay_510(void);
78 1 void Delay_110(void);
79 1 void Delay_10ms(void);
80 1 void Delay_4s(void);
81 1 void V2ToV(void);
82 1 void tjr(void);
83 1
84 1 StateREG = 0; //初始化变量
85 1 //SetTF = 1;
86 1 PowTF = 1; //关电源
87 1 //KeyTF = 1;
88 1 tjrout=1;
89 1 tjrx=0;
90 1 cj =0;
91 1 cj2 =0;
92 1 k =0;
93 1 THV = 0;
94 1 TLV = 0;
95 1 TMV = 0;
96 1 KeyV = 0;
97 1 TempKeyV = 0;
98 1 KSDNum = 0;
99 1 IntNum = 0;
100 1 IntNum2 = 0;
101 1 IntNum3 = 0;
102 1 InitDS1820(); //初始化
103 1 ROMDS1820(); //跳过ROM
104 1 TMERDS1820(); //E2PRAM中温度上限值调入RAM
105 1 InitDS1820(); //初始化
106 1 ROMDS1820(); //跳过ROM
107 1 TMRDS1820(); //读出温度指令
108 1 ReadDS1820(); //读出温度值和上限值
109 1 TMSetV = TMRomV; //拷贝保存在DS18B20ROM里的上限值到TMSetV
110 1 Delay400Ms(); //启动等待,等LCM讲入工作状态
111 1 LCMInit(); //LCM初始化
112 1 Delay5Ms(); //延时片刻(可不要)
113 1 EA = 1; //允许CPU中断
114 1 ET0 = 1; //定时器0中断打开
115 1 ET1 = 1;
C51 COMPILER V6.12 LCD_MAIN 08/01/2005 20:10:26 PAGE 3
116 1 TMOD = 0x11; //设定时器0为模式1,16位模式
117 1 TH0=0xB1;
118 1 TL0=0xDF; //设定时值为20000us(20ms)
119 1 TH1=0xB1;
120 1 TL1=0xDF; //设定时值为20000us(20ms)
121 1 TR0 = 1; //开始定时
122 1 TR1 = 1;
123 1 do
124 1 {
125 2 if (BF==2)
126 2 {
127 3
128 3
129 3 DisplayListChar(0, 1, test_ok); //显示欢迎信息
130 3 DisplayListChar(0, 0, null);
131 3 DisplayListChar(0, 2, null);
132 3 DisplayListChar(0, 3, null);
133 3 Delay_4s();
134 3 //for (j=0;i<4;j++)
135 3 //{
136 3 for (i=0;i<16;i++)
137 3 {
138 4 Delay_10ms();
139 4 Delay_10ms();
140 4 DisplayOneChar(j,1,null[i]);//LCD的第二行显示设置温度和继电器状态
141 4 Delay_10ms();
142 4 }
143 3 //}
144 3 PowTF = 1; //电源标识关
145 3 EA=0;
146 3 BF=0;
147 3 cj=0;
148 3 cj2=0;
149 3 tjrout=1;
150 3
151 3 }
152 2 if (BF==0)
153 2 {
154 3 for (j=0;j<4; j++)
155 3 {
156 4 for (i=0;i<16;i++)
157 4 {
158 5 Delay_10ms();
159 5 DisplayOneChar(i,j,null[i]);//LCD的第二行显示设置温度和继电器状态
160 5 // DisplayOneChar(i,1,null[i]);
161 5 // DisplayOneChar(i,2,null[i]);
162 5 //DisplayOneChar(i,3,null[i]);
163 5 //Delay_10ms();
164 5 //Delay_10ms();
165 5
166 5 }
167 4 }
168 3 DisplayListChar(0, 0, cdle_net); //显示欢迎信息
169 3 DisplayListChar(0, 1, email);
170 3 DisplayListChar(0, 2, null);
171 3 DisplayListChar(0, 2, null);
172 3 Delay_4s();
173 3 //PowTF = 1;
174 3 EA=1;
175 3 cj=0;
176 3 cj2=0;
177 3 tjrout=1;
C51 COMPILER V6.12 LCD_MAIN 08/01/2005 20:10:26 PAGE 4
178 3 }
179 2 if (BF==1)
180 2 {
181 3 for (i=0;i<16;i++)
182 3 {
183 4 DisplayOneChar(i,0,cur_temper[i]);//LCD的第1行显示当前温度
184 4 }
185 3 for (i=0;i<16;i++)
186 3 {
187 4 DisplayOneChar(i,1,cur_temper_set[i]);//LCD的第二行显示设置温度和继电器状态
188 4 }
189 3 //ReadDataLCM();//测试用句无意义
190 3 for (i=0;i<16;i++)
191 3 {
192 4 DisplayOneChar(i,2,cur_count[i]);
193 4 }
194 3 for (i=0;i<13;i++)
195 3 {
196 4 DisplayOneChar(i,3,relays_s[i]);
197 4 }
198 3 DisplayOneChar(13,3,ss);
199 3 DisplayOneChar(14,3,ss2);
200 3 DisplayOneChar(15,3,ss3);
201 3 EA=1;
202 3 }
203 2
204 2 }
205 1 while(1);
206 1 }
207 //定时器1中断处理
208
209 void tjrtime1(void) interrupt 3 using 3
210 {
211 1 TH1=0xB1;
212 1 TL1=0xDF; //设定时值为20000us(20ms)
213 1 dtod();
214 1 if (!optin)
215 1 {
216 2 rs++;
217 2 }
218 1 if (BF==1)
219 1 {
220 2 if(tjrx==50)
221 2 {
222 3 tjrout=~tjrout;
223 3 tjrx=0;
224 3 if(cj==99)
225 3 {
226 4 cj=0;
227 4 if(cj2==9)
228 4 {
229 5 cj2=0;
230 5 BF=2;
231 5 }
232 4 cj2++;
233 4 }
234 3 cj++;
235 3 if(rs>40)
236 3 {
237 4 rs2=1;
238 4 rs=0;
239 4 }
C51 COMPILER V6.12 LCD_MAIN 08/01/2005 20:10:26 PAGE 5
240 3 else
241 3 rs2=0;
242 3 rs=0;
243 3 }
244 2 tjrx++;
245 2 }
246 1 if (rs2==1) //根据采集到的继电器状态
247 1 {
248 2 ss =0x20; //" "
249 2 ss2=0x4f; //"O"
250 2 ss3=0x4e; //"N"
251 2 }
252 1 else
253 1 {
254 2 ss=0x4f; //"O"
255 2 ss2=0x46; //"F"
256 2 ss3=0x46; //"F"
257 2 }
258 1
259 1 }
260 //定时器0中断外理中键扫描和处理要显示的值
261 void KeyAndDis_Time0(void) interrupt 1 using 2
262 {
263 1 TH0=0xB1;
264 1 TL0=0xDF; //设定时值为20000us(20ms)
265 1
266 1 if (!Key_UP) KeyV = 1;
267 1 if (!Key_DOWN) KeyV = 2;
268 1 if (!Key_SET) KeyV = 3;
269 1 //KeySETDowning = 0; //清除
270 1 if (KeyV != 0) //有键按下
271 1 {
272 2 Delay_10ms(); //延时防抖 按下10ms再测
273 2 if (!Key_UP) TempKeyV = 1;
274 2 if (!Key_DOWN) TempKeyV = 2;
275 2 if (!Key_SET) TempKeyV = 3;
276 2
277 2 if (KeyV == TempKeyV) //两次值相等为确定接下了键
278 2 {
279 3 if (KeyV == 3) //按下SET键,如在SET状态就退出,否则进入
280 3 {
281 4 //KeySETDowning = 1; //表明SET正在按下
282 4 PowTF = 0; //电源标识开
283 4 if (!KeyTF) //KeyTF=0,键盘允许
284 4 if (SetTF)
285 4 {
286 5 SetTF = 0; //标识位标识退出设定
287 5 InitDS1820(); //初始化
288 5 ROMDS1820(); //跳过ROM
289 5 TMWDS1820(); //写温度上限指令
290 5 WriteDS1820(); //写温度上限到DS18B20ROM
291 5 WriteDS1820(); //写温度上限到DS18B20ROM
292 5 WriteDS1820(); //写温度上限到DS18B20ROM
293 5 InitDS1820(); //初始化
294 5 ROMDS1820(); //跳过ROM
295 5 TMREDS1820(); //温度上限值COPY回E2PRAM
296 5
297 5 // V2ToV();
298 5 }
299 4 else
300 4 SetTF = 1;
301 4 if (!KeySETDown) //没有第一次按下SET时,KeySETDown标识置1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -