📄 24m点阵时钟.lst
字号:
441 4 if(start_word > (sizeof(TMP_WORDS)/16 - 8))
442 4 MSG_MV = MSG_MV_R;
443 4 break;
444 4 case STA_gWORD:
445 4 if(start_word > (sizeof(MY_WORDS)/16 - 8))
446 4 MSG_MV = MSG_MV_R;
447 4 default:
448 4 break;
449 4 }
450 3 if(start_word > (sizeof(TMP_WORDS)/16 - 4))
451 3 MSG_MV = MSG_MV_R;
452 3 }
453 2 else if((move_times == 9) && (MSG_MV == MSG_MV_R)){
454 3 move_times = 1;
455 3 Put_Wdispram(WORDS); //
456 3 start_word-- ;
457 3 switch(STATE){
458 4 case STA_gTEMP:
459 4 Disp_Temperature(); //
460 4 Put_gTEMP();
461 4 break;
462 4 default:
463 4 break;
464 4 }
465 3 if(start_word < 1){
466 4 MSG_MV = MSG_MV_L;
467 4 return;
468 4 }
469 3 }
470 2 // }
471 2 }
472 1 }
473 void Show_All_Word(){
474 1 int m,i;
475 1 //MSG_MV = MSG_MV_L;
476 1 for(start_word = 0;start_word < 8;start_word++){
477 2 for(move_times = 0; move_times < 8;move_times++){
478 3 for(m=0;m<4;m++){ //若要上下移动 m=16
479 4 for(i=0;i<16;i++){
480 5 Put_Hdispram(); //把第i行放入行缓冲
481 5 RL_Move(); //是否要左右移动
482 5 Show_Line();
483 5 }
484 4 }
485 3 }
486 2 }
C51 COMPILER V8.05a 24M点阵时钟 09/28/2010 07:26:18 PAGE 9
487 1 }
488
489 void delay()
490 {
491 1 uint i;
492 1 for(i=0;i<40;i++);
493 1 }
494
495 //------------------------------------
496 //----------字发送子程序-----------
497 void SendByte(void)
498 {
499 1 uchar m;
500 1 for(m=0;m<8;m++)
501 1 {
502 2 CLK = 0;
503 2 Red = (SendData & 0x80); //红屏显示
504 2 // Greed = (SendData & 0x80); //绿屏显示
505 2 SendData =SendData<<1;
506 2 CLK = 1; //移位时钟上升沿
507 2 }
508 1 }
509 //-----------------------------------
510 //----------行扫描子程序-------------
511 void RowsCan(void)
512 {
513 1 P2 = P2 & 0xf0;
514 1 P2 = P2 | hang;
515 1 hang++;
516 1 if (hang>=16)
517 1 {
518 2 hang =0x00;
519 2 }
520 1 }
521
522 void initial(void)
523 {
524 1 OE = 1;
525 1 Red = 1;
526 1 Greed = 1;
527 1 SendData = 0x00;
528 1 hang = 0x00;
529 1
530 1 }
531 /*****************************************************
532 函数功能:延时若干微秒
533 入口参数:n
534 ***************************************************/
535 void delaynus(unsigned char n)
536 {
537 1 unsigned char i;
538 1 // for(i=0;i<n;i++)
539 1 ;
540 1 }
*** WARNING C280 IN LINE 535 OF 24M点阵时钟.C: 'n': unreferenced local variable
*** WARNING C280 IN LINE 537 OF 24M点阵时钟.C: 'i': unreferenced local variable
541 /*****************************************************
542 函数功能:向1302写一个字节数据
543 入口参数:x
544 ***************************************************/
545 void Write1302(unsigned char dat)
546 {
C51 COMPILER V8.05a 24M点阵时钟 09/28/2010 07:26:18 PAGE 10
547 1 unsigned char i;
548 1 SCLK=0; //拉低SCLK,为脉冲上升沿写入数据做好准备
549 1 delaynus(2); //稍微等待,使硬件做好准备
550 1 for(i=0;i<8;i++) //连续写8个二进制位数据
551 1 {
552 2 DATA=dat&0x01; //取出dat的第0位数据写入1302
553 2 delaynus(2); //稍微等待,使硬件做好准备
554 2 SCLK=1; //上升沿写入数据
555 2 delaynus(2); //稍微等待,使硬件做好准备
556 2 SCLK=0; //重新拉低SCLK,形成脉冲
557 2 dat>>=1; //将dat的各数据位右移1位,准备写入下一个数据位
558 2 }
559 1
560 1 }
561 /*****************************************************
562 函数功能:根据命令字,向1302写一个字节数据
563 入口参数:Cmd,储存命令字;dat,储存待写的数据
564 ***************************************************/
565 void WriteSet1302(unsigned char Cmd,unsigned char dat)
566 {
567 1 RST=0; //禁止数据传递
568 1 SCLK=0; //确保写数居前SCLK被拉低
569 1 RST=1; //启动数据传输
570 1 delaynus(2); //稍微等待,使硬件做好准备
571 1 Write1302(Cmd); //写入命令字
572 1 Write1302(dat); //写数据
573 1 SCLK=1; //将时钟电平置于已知状态
574 1 RST=0; //禁止数据传递
575 1 }
576 /*****************************************************
577 函数功能:从1302读一个字节数据
578 入口参数:x
579 ***************************************************/
580 unsigned char Read1302(void)
581 {
582 1 unsigned char i,dat;
583 1 delaynus(2); //稍微等待,使硬件做好准备
584 1 for(i=0;i<8;i++) //连续读8个二进制位数据
585 1 {
586 2 dat>>=1; //将dat的各数据位右移1位,因为先读出的是字节的最低位
587 2 if(DATA==1) //如果读出的数据是1
588 2 dat|=0x80; //将1取出,写在dat的最高位
589 2 SCLK=1; //将SCLK置于高电平,为下降沿读出
590 2 delaynus(2); //稍微等待
591 2 SCLK=0; //拉低SCLK,形成脉冲下降沿
592 2 delaynus(2); //稍微等待
593 2 }
594 1 return dat; //将读出的数据返回
595 1 }
596 /*****************************************************
597 函数功能:根据命令字,从1302读取一个字节数据
598 入口参数:Cmd
599 ***************************************************/
600 unsigned char ReadSet1302(unsigned char Cmd)
601 {
602 1 unsigned char dat;
603 1 RST=0; //拉低RST
604 1 SCLK=0; //确保写数居前SCLK被拉低
605 1 RST=1; //启动数据传输
606 1 Write1302(Cmd); //写入命令字
607 1 dat=Read1302(); //读出数据
608 1 SCLK=1; //将时钟电平置于已知状态
C51 COMPILER V8.05a 24M点阵时钟 09/28/2010 07:26:18 PAGE 11
609 1 RST=0; //禁止数据传递
610 1 return dat; //将读出的数据返回
611 1 }
612 /*****************************************************
613 函数功能: 1302进行初始化设置
614 ***************************************************/
615 void Init_DS1302(void)
616 {
617 1 unsigned char flag;
618 1
619 1 flag= ReadSet1302(0x81);
620 1 if(flag&0x80) { //判断时钟芯片是否关闭
621 2 WriteSet1302(0x8E,0x00); //根据写状态寄存器命令字,写入不保护指令
622 2 WriteSet1302(0x80,((0/10)<<4|(0%10))); //根据写秒寄存器命令字,写入秒的初始值
623 2 WriteSet1302(0x82,((18/10)<<4|(18%10))); //根据写分寄存器命令字,写入分的初始值
624 2 WriteSet1302(0x84,((21/10)<<4|(21%10))); //根据写小时寄存器命令字,写入小时的初始值
625 2 WriteSet1302(0x86,((23/10)<<4|(23%10))); //根据写日寄存器命令字,写入日的初始值
626 2 WriteSet1302(0x88,((7/10)<<4|(7%10))); //根据写月寄存器命令字,写入月的初始值
627 2 //WriteSet1302(0x8A,2);
628 2 WriteSet1302(0x8c,((10/10)<<4|(10%10))); //根据写小时寄存器命令字,写入小时的初始值
629 2 WriteSet1302(0x90,0xa5);
630 2 WriteSet1302(0x8E,0x80);
631 2 }
632 1 //如果不想每次都初始化时间,也就是掉电后还想让时钟继续走时的话 就用上面的语句
633 1
634 1
635 1 /*--------------------这是每次都初始化的语句-----------------*/
636 1 /* WriteSet1302(0x8E,0x00); //根据写状态寄存器命令字,写入不保护指令
637 1 WriteSet1302(0x80,((0/10)<<4|(0%10))); //根据写秒寄存器命令字,写入秒的初始值
638 1 WriteSet1302(0x82,((18/10)<<4|(18%10))); //根据写分寄存器命令字,写入分的初始值
639 1 WriteSet1302(0x84,((21/10)<<4|(21%10))); //根据写小时寄存器命令字,写入小时的初始值
640 1 WriteSet1302(0x86,((23/10)<<4|(23%10))); //根据写日寄存器命令字,写入日的初始值
641 1 WriteSet1302(0x88,((7/10)<<4|(7%10))); //根据写月寄存器命令字,写入月的初始值
642 1 //WriteSet1302(0x8A,2);
643 1 WriteSet1302(0x8c,((10/10)<<4|(10%10))); //根据写小时寄存器命令字,写入小时的初始值
644 1 WriteSet1302(0x90,0xa5);
645 1 WriteSet1302(0x8E,0x80);
646 1 */
647 1
648 1
649 1
650 1 }
651 void write_time1302(){
652 1 WriteSet1302(0x8E,0x00); //根据写状态寄存器命令字,写入不保护指令
653 1 WriteSet1302(0x80,Time.Second); //根据写秒寄存器命令字,写入秒的初始值
654 1 WriteSet1302(0x82,Time.Minute); //根据写分寄存器命令字,写入分的初始值
655 1 WriteSet1302(0x84,Time.Hour); //根据写小时寄存器命令字,写入小时的初始值
656 1 WriteSet1302(0x86,Time.Day); //根据写日寄存器命令字,写入日的初始值
657 1 WriteSet1302(0x88,Time.Month); //根据写月寄存器命令字,写入月的初始值
658 1 WriteSet1302(0x8A,Time.Week);
659 1 WriteSet1302(0x8c,Time.Year); //根据写小时寄存器命令字,写入小时的初始值
660 1 // WriteSet1302(0x90,0xa5);
661 1 //WriteSet1302(0x8E,0x80);
662 1 }
663
664 //读时间
665 void Read_TIME(){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -