📄 1302.lst
字号:
258 ********************************************************/
259 void writetab(uchar num,uchar *tab)
260 {
261 1 unsigned char i;
262 1 lcd_wcmd(64+(num-1)*8); //写CGRAM
263 1 for (i = 0; i< 8; i++)
264 1 lcd_wdat(*tab++);
265 1 }
266 /*********************************************************************
267 函数描述:显示自定义字符
268 入口参数:row:显示位置(行)
269 col:显示位置(列)
270 num:自定义字符代码,范围1~8
271 出口参数:无
272 ***********************************************************************/
273 void xianshitab(uchar row,uchar col,uchar num)
274 { write_position(row,col);
275 1 lcd_wdat(num-1);
276 1 }
277
278 /*********************************************************
279 函数描述:写入指定n个字符到指定位置(位置向增加方向变化)
280 入口参数:num:指定字符数目
281 row:行(范围1~2)
282 col:列(范围1~16)
283 str:显示字符的起始地址
284 出口参数:无
285 ********************************************************/
286 void write_str1(uchar row,uchar col,uchar *str,uchar num)
287 {
288 1 uchar i=0;
289 1 lcd_wcmd(0x06); //移动右移光标
290 1 delay1(5);
291 1 write_position(row,col);
292 1 for(i=0;i<num;i++)
293 1 { lcd_wdat(*str++);
294 2 }
295 1 }
296 /*****************************************************************
297 函数描述:指定位置显示指定字符
298 入口参数:dat:显示的字符
299 row:行(范围1~2)
300 col:列(范围1~16)
301 出口参数:无
302 *******************************************************************/
303 void write_str3(uchar row,uchar col,uchar dat)
C51 COMPILER V7.06 1302 12/03/2007 08:44:24 PAGE 6
304 { write_position(row,col);
305 1 lcd_wdat(dat);
306 1 }
307
308 void int1(void) interrupt 3 //采用中断0 控制节拍//10ms
309 { TH1=0xd8;
310 1 TL1=0xef;
311 1 n--;
312 1 }
313
314 void delay2 (unsigned char m) //控制频率延时,基本延时为1ms
315 {
316 1 unsigned i=m;
317 1 while(--i);
318 1 }
319
320 void delayms(unsigned char a) //毫秒延时子程序
321 {
322 1 while(--a); //采用while(--a) 不要采用while(a--); 各位可编译一下看看汇编结果就知道了!
323 1 }
324 /*************************************************************************************************
325 函数描述:播放音乐两只老虎
326 入口参数:无
327 出口参数:无
328 调用模块: time_campare()
329 ***************************************************************************************************/
330 void playmusic()
331 { unsigned char p,m; //m为频率常数变量
332 1 unsigned char i=0;
333 1
334 1 TR1 = 1;
335 1 while(1)
336 1 { if(!K2)
337 2 break;
338 2 a: p=music_code[i];
339 2 if(p==0x00)
340 2 { i=0;
341 3 delayms(1000);
342 3 break;
343 3 } //如果碰到结束符,延时1秒,回到开始再来一遍
344 2 else if(p==0xff)
345 2 { i=i+1;
346 3 delayms(100);
347 3 TR1=0;
348 3 goto a;
349 3 } //若碰到休止符,延时100ms,继续取下一音符
350 2 else
351 2 {
352 3 m=music_code[i++];
353 3 n=music_code[i++];
354 3 } //取频率常数 和 节拍常数
355 2 TR1=1; //开定时器1
356 2 while(n!=0)
357 2 {
358 3 BEEP=!BEEP;
359 3 delay2(m);
360 3 } //等待节拍完成, 通过P2口输出音频(p2口任何一个口均可接蜂鸣器的输入端)
361 2 TR1=0; //关定时器1
362 2 } //等待节拍完成, 通过P2口输出音频(p2口任何一个口均可接蜂鸣器的输入端)
363 1 TR1=0;
364 1 //关定时器1
365 1 BEEP = 1;
C51 COMPILER V7.06 1302 12/03/2007 08:44:24 PAGE 7
366 1
367 1 }
368
369 /**************************************************************************
370 函数描述:向ds1302写一字节数据
371 入口参数:dat:所写的数据
372 出口参数:无
373 ***************************************************************************/
374 void write_dat(uchar dat)
375 {
376 1 uchar i;
377 1 for(i=0;i<8;i++)
378 1 {
379 2 CLK = 0; //写的时候低电平改变数据
380 2 if((dat&0x01)==0x01)
381 2 DATA = 1;
382 2 else
383 2 DATA = 0; //写的时候高电平,把数据写入ds1302
384 2 CLK = 1;
385 2 _nop_();
386 2 dat=dat>>1;
387 2 }
388 1 }
389 /*********************************************************************************
390 函数描述:从ds1302读一字节数据
391 入口参数:无
392 出口参数:dat:读到的数据
393 ***************************************************************************/
394 uchar read_dat()
395 {
396 1 uchar i,dat;
397 1 DATA = 1;
398 1 for(i=0;i<7;i++)
399 1 {
400 2 CLK = 0;
401 2 if(DATA == 1)
402 2 dat |=0x80;
403 2 else
404 2 dat &=0x7F;
405 2 CLK = 1;
406 2 dat=dat>>1;
407 2 }
408 1 return (dat);
409 1 }
410 /**************************************************************************
411 函数描述:往ds1302的某个地址写入数据
412 入口参数:addr:要写入的寄存器地址
413 出口参数:dat:要写入的数据
414 *****************************************************************************/
415 void write_1302(uchar addr,uchar dat)
416 {
417 1 CLK = 0;
418 1 RESET = 1;
419 1 write_dat(addr);
420 1 write_dat(dat);
421 1 CLK = 0;
422 1 RESET = 0;
423 1 }
424 /****************************************************************************
425 函数描述:从ds1302的某个地址读出一字节数据
426 入口参数:addr:所读的寄存器的地址
427 出口参数:无
C51 COMPILER V7.06 1302 12/03/2007 08:44:24 PAGE 8
428 *****************************************************************************/
429 uchar read_1302(uchar addr)
430 {
431 1 uchar dat;
432 1 CLK = 0;
433 1 RESET = 1;
434 1 write_dat(addr);
435 1 dat = read_dat();
436 1 CLK = 0;
437 1 RESET = 0;
438 1 return (dat);
439 1 }
440 /****************************************************************************
441 函数描述:从ds1302寄存器中读出时间值或数据
442 入口参数:addr:所读寄存器起始地址
443 str:存放数据的起始地址
444 num:要读数据的个数
445 出口参数:无
446 *****************************************************************************/
447 void read_time(uchar addr,uchar *str,uchar num)
448 {
449 1 for(;num>0;num--)
450 1 {
451 2 *str++ = read_1302(addr);
452 2 addr = addr+2;
453 2 }
454 1 }
455 /****************************************************************************
456 函数描述:设置ds1302寄存器的值
457 入口参数:addr:要设置的寄存器起始地址
458 str:存放所设数据的起始地址
459 num:要设置寄存器的个数
460 出口参数:无
461 *****************************************************************************/
462 void set_1302(uchar addr,uchar *str,uchar num)
463 {
464 1 write_1302(0x8e,0x00);
465 1 for(;num>0;num--)
466 1 {
467 2 write_1302(addr,*str++);
468 2 addr = addr+2;
469 2 }
470 1 write_1302(0x8e,0x80);
471 1 }
472 void init_1302()
473 {
474 1 RESET = 0;
475 1 CLK = 0;
476 1 write_1302(0x80,0x00);
477 1 write_1302(0x90,0xa6); //一个二极管+4K电阻充电
478 1 set_1302(0x80,init,7); //写入初始值
479 1 write_1302(0x8e,0x80); //写保护控制字,禁止写
480 1 }
481 /************************************************************************************
482 函数描述:把从ds1302读出的数据转换为ascii码
483 入口参数:instr: 指向要转换数据的指针
484 出口参数: outstr: 指向转换后的数据的指针
485 **************************************************************************************/
486 void change_time(uchar *instr,uchar *outstr)
487 { uchar i;
488 1 uchar j;
489 1 j = 0;
C51 COMPILER V7.06 1302 12/03/2007 08:44:24 PAGE 9
490 1 for(i=0;i<8;i++)
491 1 { outstr[j] = '0'+((instr[i]&0xf0)>>4);
492 2 j++;
493 2 outstr[j] = '0'+(instr[i]&0x0f);
494 2 j++;
495 2 }
496 1 }
497 /*************************************************************************************
498 函数描述:在lcd上显示日期,时间值
499 入口参数:str:指向要显示值的指针
500 出口参数:无
501 ***************************************************************************************/
502 void lcd_time(uchar *str)
503 { write_str3(1,1,str[12]) ;//年
504 1 write_str3(1,2,str[13]) ;
505 1 write_str3(1,4,str[8]) ;//月
506 1 write_str3(1,5,str[9]) ;
507 1 write_str3(1,7,str[6]) ;//日
508 1 write_str3(1,8,str[7]) ;
509 1 write_str3(1,16,str[11]);//星期
510 1 write_str3(2,7,str[4]) ;//时
511 1 write_str3(2,8,str[5]) ;
512 1 write_str3(2,10,str[2]) ;//分
513 1 write_str3(2,11,str[3]) ;
514 1 write_str3(2,13,str[0]) ;//秒
515 1 write_str3(2,14,str[1]) ;
516 1 }
517 /*********************************************************************************************
518 函数描述:在lcd的第2行地9,12列的位置交替显示':'和' ' ,以形成闪动效果
519 入口参数:无
520 出口参数:无
521 ***********************************************************************************************/
522 void flash()
523 { if(flag)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -