📄 lcm_t.lst
字号:
244 1 unsigned char i;
245 1 for(i=0;i<8;i++){
246 2 SID=bbyte&0x80; //取出最高位
247 2 SCLK=1;
248 2 SCLK=0;
249 2 bbyte<<=1; //左移
250 2 }
251 1 }
252
253 /******************************************************************************/
254 //延时(LCM占用)
255 void delaynms(unsigned int di) {
256 1 unsigned int da,db;
257 1 for(da=0;da<di;da++);
258 1 for(db=0;db<10;db++);
259 1 }
260
261 /*****************************************************************************/
262 //清屏函数
263 void lcm_clr(void){
264 1 lcm_w_test(0,0x01);
265 1 delaynms(40); //启动等待,等LCM讲入工作状态
266 1
267 1 }
268
269 /*****************************************************************************/
270 //向LCM发送一个字符串,长度64字符之内。
271 //应用:lcm_w_word("您好!");
272 void lcm_w_word(unsigned char *str){
273 1 while(*str != '\0'){
274 2 lcm_w_test(1,*str++);
275 2 }
276 1 *str = 0;
277 1 }
278 /******************************************************************************/
279 void Delay(int num)//延时函数
280 {
281 1 while(num--) ;
282 1 }
283 /******************************************************************************/
284 void Init_DS18B20(void)//初始化ds1820
285 {
286 1 unsigned char x=0;
287 1 DQ = 1; //DQ复位
288 1 Delay(8); //稍做延时
289 1 DQ = 0; //单片机将DQ拉低
290 1 Delay(80); //精确延时 大于 480us
291 1 DQ = 1; //拉高总线
292 1 Delay(14);
293 1 x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
294 1 Delay(20);
295 1 }
296 /******************************************************************************/
297 unsigned char ReadOneChar(void)//读一个字节
298 {
299 1 unsigned char i=0;
300 1 unsigned char dat = 0;
301 1 for (i=8;i>0;i--)
302 1 {
303 2 DQ = 0; // 给脉冲信号
C51 COMPILER V6.12 LCM_T 02/10/2007 00:13:53 PAGE 6
304 2 dat>>=1;
305 2 DQ = 1; // 给脉冲信号
306 2 if(DQ)
307 2 dat|=0x80;
308 2 Delay(4);
309 2 }
310 1 return(dat);
311 1 }
312
313 /******************************************************************************/
314 void WriteOneChar(unsigned char dat)//写一个字节
315 {
316 1 unsigned char i=0;
317 1 for (i=8; i>0; i--)
318 1 {
319 2 DQ = 0;
320 2 DQ = dat&0x01;
321 2 Delay(5);
322 2 DQ = 1;
323 2 dat>>=1;
324 2 }
325 1 }
326 /******************************************************************************/
327 unsigned int ReadTemperature(void)//读取温度
328 {
329 1 unsigned char a=0;
330 1 unsigned char b=0;
331 1 unsigned int t=0;
332 1 float tt=0;
333 1 Init_DS18B20();
334 1 WriteOneChar(0xCC); // 跳过读序号列号的操作
335 1 WriteOneChar(0x44); // 启动温度转换
336 1 Init_DS18B20();
337 1 WriteOneChar(0xCC); //跳过读序号列号的操作
338 1 WriteOneChar(0xBE); //读取温度寄存器
339 1 a=ReadOneChar(); //读低8位
340 1 b=ReadOneChar(); //读高8位
341 1 t=b;
342 1 t<<=8;
343 1 t=t|a;
344 1 tt=t*0.0625;
345 1 t= tt*10+0.5; //放大10倍输出并四舍五入
346 1 return(t);
347 1 }
348 /*****************************************************************************/
349 //声明
350 void lcm_w_ss(void);void lcm_w_mm(void);
351 void lcm_w_hh(void);void lcm_w_dd(void);
352 void lcm_w_mo(void);void lcm_w_yy(void);void lcm_w_xq(void);
353 unsigned char clock_in(void);
354 void clock_out(unsigned char dd);
355 void Init_1302(void);
356 unsigned char read_clock(unsigned char ord);
357 void read_clockS(void);
358 void Set_time(unsigned char sel);
359 void write_clock(unsigned char ord, unsigned char dd);
360 void updata (void);
361 /*****************************************************************************/
362 //常用时钟数据读取
363 void read_clockS(void){
364 1 ss = read_clock(0x81);//读取秒数据
365 1 mm = read_clock(0x83);//读取分钟数据
C51 COMPILER V6.12 LCM_T 02/10/2007 00:13:53 PAGE 7
366 1 hh = read_clock(0x85);//小时
367 1 dd = read_clock(0x87);//日
368 1 mo = read_clock(0x89);//月
369 1 xq = read_clock(0x8b);//星期
370 1 yy = read_clock(0x8d);//年
371 1 }
372 /*****************************************************************************/
373 //调时用加1程序
374 void Set_time(unsigned char sel){ //根据选择调整的相应项目加1并写入DS1302
375 1 signed char address,item;
376 1 signed char max,mini;
377 1 lcm_w_test(0,0x9a);
378 1 lcm_w_word("调整");
379 1 //if(sel==6) {lcm_w_word("秒钟");address=0x80; max=0;mini=0;} //秒7
380 1 if(sel==5) {lcm_w_word("分钟");address=0x82; max=59;mini=0;} //分钟6
381 1 if(sel==4) {lcm_w_word("小时");address=0x84; max=23;mini=0;} //小时5
382 1 if(sel==3) {lcm_w_word("星期");address=0x8a; max=7;mini=1;} //星期4
383 1 if(sel==2) {lcm_w_word("日期");address=0x86; max=31;mini=1;} //日3
384 1 if(sel==1) {lcm_w_word("月份");address=0x88; max=12;mini=1;} //月2
385 1 if(sel==0) {lcm_w_word("年份");address=0x8c; max=99; mini=0;} //年1
386 1
387 1 //读取1302某地址上的数值转换成10进制赋给item
388 1 item=((read_clock(address+1))/16)*10 + (read_clock(address+1))%16;
389 1 if(KEY_2 == 0){
390 2 item++;//数加 1
391 2 }
392 1 if(KEY_4 == 0){
393 2 item--;//数减 1
394 2 }
395 1 if(item>max) item=mini;//查看数值有效范围
396 1 if(item<mini) item=max;
397 1 write_clock(0x8e,0x00);//允许写操作
398 1 write_clock(address,(item/10)*16+item%10);//转换成16进制写入1302
399 1 write_clock(0x8e,0x80);//写保护,禁止写操作
400 1 updata (); //刷新数据
401 1 lcm_w_mm();//刷新 分
402 1 }
403 /*****************************************************************************/
404 //设置1302的初始时间
405 void Init_1302(void){//(2007年1月1日00时00分00秒星期一)
406 1 write_clock(0x8e,0x00);//允许写操作
407 1
408 1 write_clock(0x8c,0x07);//年
409 1 write_clock(0x8a,0x01);//星期
410 1 write_clock(0x88,0x01);//月
411 1 write_clock(0x86,0x01);//日
412 1 write_clock(0x84,0x00);//小时
413 1 write_clock(0x82,0x00);//分钟
414 1 write_clock(0x80,0x00);//秒
415 1 write_clock(0x90,0xa5);//充电
416 1 write_clock(0x8e,0x80);//禁止写操作
417 1 }
418 /*****************************************************************************/
419 //DS1302写数据(底层协议)
420 void write_clock(unsigned char ord, unsigned char dd){
421 1 clock_clk=0;
422 1 clock_Rst=0;
423 1 clock_Rst=1;
424 1 clock_out(ord);
425 1 clock_out(dd);
426 1 clock_Rst=0;
427 1 clock_clk=1;
C51 COMPILER V6.12 LCM_T 02/10/2007 00:13:53 PAGE 8
428 1 }
429 /*****************************************************************************/
430 //1302驱动程序(底层协议)
431 void clock_out(unsigned char dd){
432 1 ACC=dd;
433 1 clock_dat=a0; clock_clk=1; clock_clk=0;
434 1 clock_dat=a1; clock_clk=1; clock_clk=0;
435 1 clock_dat=a2; clock_clk=1; clock_clk=0;
436 1 clock_dat=a3; clock_clk=1; clock_clk=0;
437 1 clock_dat=a4; clock_clk=1; clock_clk=0;
438 1 clock_dat=a5; clock_clk=1; clock_clk=0;
439 1 clock_dat=a6; clock_clk=1; clock_clk=0;
440 1 clock_dat=a7; clock_clk=1; clock_clk=0;
441 1 }
442 /*****************************************************************************/
443 //DS1302写入字节(底层协议)
444 unsigned char clock_in(void){
445 1 clock_dat=1;
446 1 a0=clock_dat;
447 1 clock_clk=1; clock_clk=0; a1=clock_dat;
448 1 clock_clk=1; clock_clk=0; a2=clock_dat;
449 1 clock_clk=1; clock_clk=0; a3=clock_dat;
450 1 clock_clk=1; clock_clk=0; a4=clock_dat;
451 1 clock_clk=1; clock_clk=0; a5=clock_dat;
452 1 clock_clk=1; clock_clk=0; a6=clock_dat;
453 1 clock_clk=1; clock_clk=0; a7=clock_dat;
454 1 return(ACC);
455 1 }
456 /*****************************************************************************/
457 //DS1302读数据(底层协议)
458 unsigned char read_clock(unsigned char ord){
459 1 unsigned char dd=0;
460 1 clock_clk=0;
461 1 clock_Rst=0;
462 1 clock_Rst=1;
463 1 clock_out(ord);
464 1 dd=clock_in();
465 1 clock_Rst=0;
466 1 clock_clk=1;
467 1 return(dd);
468 1 }
469 /*****************************************************************************/
470 //向LCM中填写 年 数据
471 void lcm_w_yy(void){
472 1 //if(read_clock(0x8d) != yy){
473 1 yy = read_clock(0x8d);
474 1 lcm_w_test(0,0x83);
475 1 lcm_w_word("20");
476 1 lcm_w_test(0,0x84);
477 1 lcm_w_test(1,(yy/16)+0x30);
478 1 lcm_w_test(1,yy%16+0x30);
479 1 } //}
480 /*****************************************************************************/
481 //向LCM中填写 月 数据
482 void lcm_w_mo(void){
483 1 //if(read_clock(0x89) != mo){
484 1 mo = read_clock(0x89);
485 1 lcm_w_test(0,0x90);
486 1 if(mo/16 != 0){lcm_w_test(1,(mo/16)+0x30);} //十位消隐
487 1 else{lcm_w_test(1,0x20);}//同上
488 1 lcm_w_test(1,mo%16+0x30);
489 1 lcm_w_test(0,0x91);
C51 COMPILER V6.12 LCM_T 02/10/2007 00:13:53 PAGE 9
490 1 lcm_w_word("月");
491 1 } //}
492 /*****************************************************************************/
493 //星期处理并送入LCM的指定区域
494 void lcm_w_xq(void){
495 1 unsigned char sel;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -