📄 lcd1602.lst
字号:
199
200 //------------------------------------
201 //时分秒显示子函数
202 void write_sfm(uchar add,uchar dat)//向LCD写时分秒,有显示位置加、现示数据,两个参数
203 {
204 1 uchar gw,sw;
205 1 gw=dat%10;//取得个位数字
206 1 sw=dat/10;//取得十位数字
207 1 write_1602com(er+add);//er是头文件规定的值0x80+0x40
208 1 write_1602dat(0x30+sw);//数字+30得到该数字的LCD1602显示码
209 1 write_1602dat(0x30+gw);//数字+30得到该数字的LCD1602显示码
210 1
211 1 }
212
213 //-------------------------------------
214 //年月日显示子函数
215 void write_nyr(uchar add,uchar dat)//向LCD写年月日,有显示位置加数、显示数据,两个参数
216
217 {
218 1 uchar gw,sw;
219 1 gw=dat%10;//取得个位数字
220 1 sw=dat/10;//取得十位数字
221 1 write_1602com(yh+add);//设定显示位置为第一个位置+add
222 1 write_1602dat(0x30+sw);//数字+30得到该数字的LCD1602显示码
223 1 write_1602dat(0x30+gw);//数字+30得到该数字的LCD1602显示码
224 1
225 1 }
226
227 //-------------------------------------------
228 void write_week(uchar week)//写星期函数
229 {
230 1 write_1602com(yh+0x0c);//星期字符的显示位置
231 1 switch(week)
232 1 {
233 2 case 1:write_1602dat('M');//星期数为1时,显示
234 2 write_1602dat('O');
235 2 write_1602dat('N');
236 2 break;
237 2
238 2 case 2:write_1602dat('T');//星期数据为2时显示
239 2 write_1602dat('U');
240 2 write_1602dat('E');
241 2 break;
C51 COMPILER V8.02 LCD1602 07/12/2011 20:57:59 PAGE 5
242 2
243 2 case 3:write_1602dat('W');//星期数据为3时显示
244 2 write_1602dat('E');
245 2 write_1602dat('D');
246 2 break;
247 2
248 2 case 4:write_1602dat('T');//星期数据为4是显示
249 2 write_1602dat('H');
250 2 write_1602dat('U');
251 2 break;
252 2
253 2 case 5:write_1602dat('F');//星期数据为5时显示
254 2 write_1602dat('R');
255 2 write_1602dat('I');
256 2 break;
257 2
258 2 case 6:write_1602dat('S');//星期数据为6时显示
259 2 write_1602dat('T');
260 2 write_1602dat('A');
261 2 break;
262 2
263 2 case 7:write_1602dat('S');//星期数据为7时显示
264 2 write_1602dat('U');
265 2 write_1602dat('N');
266 2 break;
267 2
268 2 }
269 1
270 1 }
271
272
273 //****************键盘扫描有关函数**********************
274
275 void keyscan()
276 {
277 1 if(key1==0)//---------------key1为功能键(设置键)--------------------
278 1 {
279 2 delay(9);//延时,用于消抖动
280 2 if(key1==0)//延时后再次确认按键按下
281 2 {
282 3 buzzer=0;//蜂鸣器短响一次
283 3 delay(20);
284 3 buzzer=1;
285 3 while(!key1);
286 3 key1n++;
287 3 if(key1n==9)
288 3 key1n=1;//设置按键共有秒、分、时、星期、日、月、年、返回,8个功能循环
289 3 switch(key1n)
290 3 {
291 4
292 4 case 1: TR0=0;//关闭定时器
293 4 //TR1=0;
294 4 write_1602com(er+0x09);//设置按键按动一次,秒位置显示光标
295 4 write_1602com(0x0f);//设置光标为闪烁
296 4 temp=(miao)/10*16+(miao)%10;//秒数据写入DS1302
297 4 write_1302(0x8e,0x00);
298 4 write_1302(0x80,0x80|temp);//miao
299 4 write_1302(0x8e,0x80);
300 4 break;
301 4 case 2: write_1602com(er+6);//按2次fen位置显示光标
302 4
303 4 //write_1602com(0x0f);
C51 COMPILER V8.02 LCD1602 07/12/2011 20:57:59 PAGE 6
304 4 break;
305 4 case 3: write_1602com(er+3);//按动3次,shi
306 4 //write_1602com(0x0f);
307 4 break;
308 4 case 4: write_1602com(yh+0x0e);//按动4次,week
309 4 //write_1602com(0x0f);
310 4 break;
311 4 case 5: write_1602com(yh+0x0a);//按动5次,ri
312 4 //write_1602com(0x0f);
313 4 break;
314 4 case 6: write_1602com(yh+0x07);//按动6次,yue
315 4 //write_1602com(0x0f);
316 4 break;
317 4 case 7: write_1602com(yh+0x04);//按动7次,nian
318 4 //write_1602com(0x0f);
319 4 break;
320 4 case 8:
321 4 write_1602com(0x0c);//按动到第8次,设置光标不闪烁
322 4 TR0=1;//打开定时器
323 4 temp=(miao)/10*16+(miao)%10;
324 4 write_1302(0x8e,0x00);
325 4 write_1302(0x80,0x00|temp);//miao数据写入DS1302
326 4 write_1302(0x8e,0x80);
327 4 break;
328 4
329 4 }
330 3
331 3
332 3
333 3 }
334 2
335 2 }
336 1 //------------------------------加键key2----------------------------
337 1 if(key1n!=0)//当key1按下以下。再按以下键才有效(按键次数不等于零)
338 1 {
339 2
340 2 if(key2==0) //上调键
341 2 {
342 3 delay(10);
343 3 if(key2==0)
344 3 {
345 4 buzzer=0;//蜂鸣器短响一次
346 4 delay(20);
347 4 buzzer=1;
348 4 while(!key2);
349 4 switch(key1n)
350 4 {
351 5 case 1:miao++;//设置键按动1次,调秒
352 5 if(miao==60)
353 5 miao=0;//秒超过59,再加1,就归零
354 5 write_sfm(0x08,miao);//令LCD在正确位置显示"加"设定好的秒数
355 5 temp=(miao)/10*16+(miao)%10;//十进制转换成DS1302要求的DCB码
356 5 write_1302(0x8e,0x00); //允许写,禁止写保护
357 5 write_1302(0x80,temp); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码
358 5 write_1302(0x8e,0x80); //打开写保护
359 5 write_1602com(er+0x09);//因为设置液晶的模式是写入数据后,光标自动右移,所以要指定返回
360 5 //write_1602com(0x0b);
361 5 break;
362 5 case 2:fen++;
363 5 if(fen==60)
364 5 fen=0;
365 5 write_sfm(0x05,fen);//令LCD在正确位置显示"加"设定好的分数据
C51 COMPILER V8.02 LCD1602 07/12/2011 20:57:59 PAGE 7
366 5 temp=(fen)/10*16+(fen)%10;//十进制转换成DS1302要求的DCB码
367 5 write_1302(0x8e,0x00);//允许写,禁止写保护
368 5 write_1302(0x82,temp);//向DS1302内写分寄存器82H写入调整后的分数据BCD码
369 5 write_1302(0x8e,0x80);//打开写保护
370 5 write_1602com(er+6);//因为设置液晶的模式是写入数据后,指针自动加一,在这里是写回原来的位置
371 5 break;
372 5 case 3:shi++;
373 5 if(shi==24)
374 5 shi=0;
375 5 write_sfm(2,shi);//令LCD在正确的位置显示"加"设定好的小时数据
376 5 temp=(shi)/10*16+(shi)%10;//十进制转换成DS1302要求的DCB码
377 5 write_1302(0x8e,0x00);//允许写,禁止写保护
378 5 write_1302(0x84,temp);//向DS1302内写小时寄存器84H写入调整后的小时数据BCD码
379 5 write_1302(0x8e,0x80);//打开写保护
380 5 write_1602com(er+3);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
381 5 break;
382 5 case 4:week++;
383 5 if(week==8)
384 5 week=1;
385 5 write_1602com(yh+0x0C);//指定'加'后的周数据显示位置
386 5 write_week(week);//指定周数据显示内容
387 5 temp=(week)/10*16+(week)%10;//十进制转换成DS1302要求的DCB码
388 5 write_1302(0x8e,0x00);//允许写,禁止写保护
389 5 write_1302(0x8a,temp);//向DS1302内写周寄存器8aH写入调整后的周数据BCD码
390 5 write_1302(0x8e,0x80);//打开写保护
391 5 write_1602com(yh+0x0e);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
392 5 break;
393 5 case 5:ri++;
394 5 if(ri==32)
395 5 ri=1;
396 5 write_nyr(9,ri);//令LCD在正确的位置显示"加"设定好的日期数据
397 5 temp=(ri)/10*16+(ri)%10;//十进制转换成DS1302要求的DCB码
398 5 write_1302(0x8e,0x00);//允许写,禁止写保护
399 5 write_1302(0x86,temp);//向DS1302内写日期寄存器86H写入调整后的日期数据BCD码
400 5 write_1302(0x8e,0x80);//打开写保护
401 5 write_1602com(yh+10);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
402 5 break;
403 5 case 6:yue++;
404 5 if(yue==13)
405 5 yue=1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -