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