📄 da1302.lst
字号:
700 2 OutputInformation(8,1,0x20); //不显示
701 2 OutputInformation(9,1,0x20);
702 2 }
703 1 else
704 1 DisplayListChar(5,1,reset); //显示reset
705 1 }
706 /**********************************退出***********************************************/
707 void model6()
708 {
709 1 OutputInformation(10,1,0x20); //不显示
710 1 OutputInformation(11,1,0x20); //不显示
711 1 DisplayListChar(0,1,lamp); //显示lamp
712 1 DisplayListChar(5,1,reset); //显示reset
713 1 if(a==1)
714 1 {OutputInformation(12,1,0x20); //不显示
715 2 OutputInformation(13,1,0x20); //不显示
716 2 OutputInformation(14,1,0x20); //不显示
717 2 OutputInformation(15,1,0x20); //不显示
718 2 }
719 1 else
720 1 DisplayListChar(12,1,exit); //显示exit
721 1 }
722
723
724
725 //********* LCM1602驱动程序 ***************
726 //写数据
727 void WriteDataLCM(uchar WDLCM)
728 {
729 1 ReadStatusLCM(); //检测忙
730 1 LCM_Data = WDLCM;
731 1 LCM_RS = 1;
732 1 LCM_RW = 0;
733 1 LCM_E = 0; //若晶振速度太高可以在这后加小的延时
734 1 LCM_E = 0; //延时
735 1 LCM_E = 1;
C51 COMPILER V8.08 DA1302 09/16/2008 21:50:25 PAGE 13
736 1 }
737 //写指令
738 void WriteCommandLCM(uchar WCLCM,BuysC) //BuysC为0时忽略忙检测
739 {
740 1 if (BuysC) ReadStatusLCM(); //根据需要检测忙
741 1 LCM_Data = WCLCM;
742 1 LCM_RS = 0;
743 1 LCM_RW = 0;
744 1 LCM_E = 0;
745 1 LCM_E = 0;
746 1 LCM_E = 1;
747 1 }
748 //读状态
749 uchar ReadStatusLCM(void)
750 {
751 1 LCM_RS = 0;
752 1 LCM_RW = 1;
753 1 LCM_E = 0;
754 1 LCM_E = 0;
755 1 LCM_E = 1;
756 1 while (LCM_Data & Busy); //检测忙信号
757 1 return(LCM_Data);
758 1 }
759 //LCM初始化
760 void LCMInit(void)
761 {
762 1 LCM_Data = 0;
763 1 WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
764 1 Delay5Ms();
765 1 WriteCommandLCM(0x38,0);
766 1 Delay5Ms();
767 1 WriteCommandLCM(0x38,0);
768 1 Delay5Ms();
769 1 WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号
770 1 WriteCommandLCM(0x08,1); //关闭显示
771 1 WriteCommandLCM(0x01,1); //显示清屏
772 1 WriteCommandLCM(0x06,1); // 显示光标移动设置
773 1 WriteCommandLCM(0x0C,1); // 显示开及光标设置
774 1 }
775 //按指定位置显示一个字符
776 void OutputInformation(uchar X, uchar Y, uchar DData)
777 {
778 1 Y &= 0x1;
779 1 X &= 0xF; //限制X不能大于15,Y不能大于1
780 1 if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
781 1 X |= 0x80; //算出指令码
782 1 WriteCommandLCM(X, 0); //这里不检测忙信号,发送地址码
783 1 WriteDataLCM(DData);
784 1 }
785 //按指定位置显示一串字符 ***原来的遇到空格0x20就不显示***
786 void DisplayListChar(uchar X, uchar Y, uchar code *DData)
787 {
788 1 uchar ListLength,j;
789 1 ListLength = strlen(DData);
790 1 Y &= 0x1;
791 1 X &= 0xF; //限制X不能大于15,Y不能大于1
792 1 if (X <= 0xF) //X坐标应小于0xF
793 1 {
794 2 for(j=0;j<ListLength;j++)
795 2 {
796 3 OutputInformation(X, Y, DData[j]); //显示单个字符
797 3 X++;
C51 COMPILER V8.08 DA1302 09/16/2008 21:50:25 PAGE 14
798 3 }
799 2 }
800 1 }
801 //5ms延时
802 void Delay5Ms(void)
803 {
804 1 unsigned int TempCyc = 5552;
805 1 while(TempCyc--);
806 1 }
807 //400ms延时
808 void Delay400Ms(void)
809 {
810 1 uchar TempCycA = 5;
811 1 unsigned int TempCycB;
812 1 while(TempCycA--)
813 1 {
814 2 TempCycB=7269;
815 2 while(TempCycB--);
816 2 }
817 1 }
818
819 //********DS1302读写程序***************//
820 /********************************************************************
821 函 数 名:RTInputByte()
822 功 能:实时时钟写入一字节
823 说 明:往DS1302写入1Byte数据 (内部函数)
824 入口参数:d 写入的数据
825 返 回 值:无
826 ***********************************************************************/
827 void RTInputByte(uchar d)
828 {
829 1 uchar i;
830 1 ACC = d;
831 1 for(i=8; i>0; i--)
832 1 {
833 2 T_IO = ACC0; /*相当于汇编中的 RRC */
834 2 T_CLK = 1;
835 2 T_CLK = 0;
836 2 ACC = ACC >> 1;
837 2 }
838 1 }
839 /********************************************************************
840 函 数 名:RTOutputByte()
841 功 能:实时时钟读取一字节
842 说 明:从DS1302读取1Byte数据 (内部函数)
843 入口参数:无
844 返 回 值:ACC
845 设 计:zhaojunjie 日 期:2002-03-19
846 修 改: 日 期:
847 ***********************************************************************/
848 uchar RTOutputByte(void)
849 {
850 1 uchar i;
851 1 for(i=8; i>0; i--)
852 1 {
853 2 ACC = ACC >>1; /*相当于汇编中的 RRC */
854 2 ACC7 = T_IO;
855 2 T_CLK = 1;
856 2 T_CLK = 0;
857 2 }
858 1 return(ACC);
859 1 }
C51 COMPILER V8.08 DA1302 09/16/2008 21:50:25 PAGE 15
860 /********************************************************************
861 函 数 名:W1302()
862 功 能:往DS1302写入数据
863 说 明:先写地址,后写命令/数据 (内部函数)
864 调 用:RTInputByte() , RTOutputByte()
865 入口参数:ucAddr: DS1302地址, ucData: 要写的数据
866 返 回 值:无
867 ***********************************************************************/
868 void W1302(uchar ucAddr, uchar ucDa)
869 {
870 1 T_RST = 0;
871 1 T_CLK = 0;
872 1 T_RST = 1;
873 1 RTInputByte(ucAddr); /* 地址,命令 */
874 1 RTInputByte(ucDa); /* 写1Byte数据*/
875 1 T_CLK = 1;
876 1 T_RST = 0;
877 1 }
878 /********************************************************************
879 函 数 名:R1302()
880 功 能:读取DS1302某地址的数据
881 说 明:先写地址,后读命令/数据 (内部函数)
882 调 用:RTInputByte() , RTOutputByte()
883 入口参数:ucAddr: DS1302地址
884 返 回 值:ucData :读取的数据
885 ***********************************************************************/
886 uchar R1302(uchar ucAddr)
887 {
888 1 uchar ucData;
889 1 T_RST = 0;
890 1 T_CLK = 0;
891 1 T_RST = 1;
892 1 RTInputByte(ucAddr); /* 地址,命令 */
893 1 ucData = RTOutputByte(); /* 读1Byte数据 */
894 1 T_CLK = 1;
895 1 T_RST = 0;
896 1 return(ucData);
897 1 }
898
899 /********************************************************************
900 函 数 名:Set1302()
901 功 能:设置初始时间
902 说 明:先写地址,后读命令/数据(寄存器多字节方式)
903 调 用:W1302()
904 入口参数:pClock: 设置时钟数据地址 格式为: 秒 分 时 日 月 星期 年
905 7Byte (BCD码)1B 1B 1B 1B 1B 1B 1B
906 返 回 值:无
907 ***********************************************************************/
908 void Set1302(uchar *pClock)
909 {
910 1 uchar i;
911 1 uchar ucAddr = 0x80;
912 1 W1302(0x8e,0x00); /* 控制命令,WP=0,写操作*/
913 1 for(i =7; i>0; i--)
914 1 {
915 2 W1302(ucAddr,*pClock); /* 秒 分 时 日 月 星期 年 */
916 2 pClock++;
917 2 ucAddr +=2;
918 2 }
919 1 W1302(0x8e,0x80); /* 控制命令,WP=1,写保护*/
920 1 }
C51 COMPILER V8.08 DA1302 09/16/2008 21:50:25 PAGE 16
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 3417 ----
CONSTANT SIZE = 69 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 12 15
IDATA SIZE = ---- ----
BIT SIZE = 2 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -