📄 51
字号:
C51 COMPILER V8.18 DA1302 12/15/2009 15:11:35 PAGE 13
736 1 DisplayListChar(5,1,reset); //显示reset
737 1 }
738 /**********************************退出***********************************************/
739 void model6()
740 {
741 1 OutputInformation(10,1,0x20); //不显示
742 1 OutputInformation(11,1,0x20); //不显示
743 1 DisplayListChar(0,1,lamp); //显示lamp
744 1 DisplayListChar(5,1,reset); //显示reset
745 1 if(a==1)
746 1 {OutputInformation(12,1,0x20); //不显示
747 2 OutputInformation(13,1,0x20); //不显示
748 2 OutputInformation(14,1,0x20); //不显示
749 2 OutputInformation(15,1,0x20); //不显示
750 2 }
751 1 else
752 1 DisplayListChar(12,1,exit); //显示exit
753 1 }
754
755
756
757 //********* LCM1602驱动程序 ***************
758 //写数据
759 void WriteDataLCM(uchar WDLCM)
760 {
761 1 ReadStatusLCM(); //检测忙
762 1
763 1 LCM_RS = 1;
764 1 LCM_RW = 0;
765 1 LCM_E = 0;
766 1 LCM_Data = WDLCM;
767 1 delayNOP() ;
768 1 LCM_E = 1 ;
769 1 delayNOP() ;
770 1 LCM_E = 0 ;
771 1 }
772 //写指令
773 void WriteCommandLCM(uchar WCLCM,BuysC) //BuysC为0时忽略忙检测
774 {
775 1 if (BuysC) ReadStatusLCM(); //根据需要检测忙
776 1
777 1 LCM_RS = 0;
778 1 LCM_RW = 0;
779 1 LCM_E = 0;
780 1 _nop_() ;
781 1 _nop_() ;
782 1 LCM_Data = WCLCM;
783 1 delayNOP() ;
784 1 LCM_E = 1;
785 1 delayNOP() ;
786 1 LCM_E = 0;
787 1 }
788 //读状态
789 uchar ReadStatusLCM(void)
790 {
791 1 LCM_RS = 0 ;
792 1 LCM_RW = 1 ;
793 1 LCM_E = 1 ;
794 1 delayNOP() ;
795 1 LCM_E = 1;
796 1 while (LCM_Data & Busy); //检测忙信号
797 1 LCM_E =0;
C51 COMPILER V8.18 DA1302 12/15/2009 15:11:35 PAGE 14
798 1 return(LCM_Data);
799 1 }
800 //LCM初始化
801 void LCMInit(void)
802 {
803 1
804 1
805 1
806 1 delay1(15) ;
807 1
808 1 WriteCommandLCM(0x01,1);
809 1 WriteCommandLCM(0x38,1);
810 1 delay1(5) ;
811 1 WriteCommandLCM(0x38,1);
812 1 delay1(5) ;
813 1 WriteCommandLCM(0x38,1);
814 1 delay1(5) ;
815 1 WriteCommandLCM(0x0c,1); //显示模式设置,开始要求每次检测忙信号
816 1 delay1(5) ;
817 1 WriteCommandLCM(0x06,1); // 显示光标移动设置
818 1
819 1 }
820 //按指定位置显示一个字符
821 void OutputInformation(uchar X, uchar Y, uchar DData)
822 {
823 1 Y &= 0x1;
824 1 X &= 0xF; //限制X不能大于15,Y不能大于1
825 1 if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
826 1 X |= 0x80; //算出指令码
827 1 WriteCommandLCM(X, 0); //这里不检测忙信号,发送地址码
828 1 WriteDataLCM(DData);
829 1 }
830 //按指定位置显示一串字符 ***原来的遇到空格0x20就不显示***
831 void DisplayListChar(uchar X, uchar Y, uchar code *DData)
832 {
833 1 uchar ListLength,j;
834 1 ListLength = strlen(DData);
835 1 Y &= 0x1;
836 1 X &= 0xF; //限制X不能大于15,Y不能大于1
837 1 if (X <= 0xF) //X坐标应小于0xF
838 1 {
839 2 for(j=0;j<ListLength;j++)
840 2 {
841 3 OutputInformation(X, Y, DData[j]); //显示单个字符
842 3 X++;
843 3 }
844 2 }
845 1 }
846 //5ms延时
847 void Delay5Ms(void)
848 {
849 1 unsigned int TempCyc = 5552;
850 1 while(TempCyc--);
851 1 }
852 //400ms延时
853 void Delay400Ms(void)
854 {
855 1 uchar TempCycA = 5;
856 1 unsigned int TempCycB;
857 1 while(TempCycA--)
858 1 {
859 2 TempCycB=7269;
C51 COMPILER V8.18 DA1302 12/15/2009 15:11:35 PAGE 15
860 2 while(TempCycB--);
861 2 }
862 1 }
863
864 //********DS1302读写程序***************//
865 /********************************************************************
866 函 数 名:RTInputByte()
867 功 能:实时时钟写入一字节
868 说 明:往DS1302写入1Byte数据 (内部函数)
869 入口参数:d 写入的数据
870 返 回 值:无
871 ***********************************************************************/
872 void RTInputByte(uchar d)
873 {
874 1 uchar i;
875 1 ACC = d;
876 1 for(i=8; i>0; i--)
877 1 {
878 2 T_IO = ACC0; /*相当于汇编中的 RRC */
879 2 T_CLK = 1;
880 2 T_CLK = 0;
881 2 ACC = ACC >> 1;
882 2 }
883 1 }
884 /********************************************************************
885 函 数 名:RTOutputByte()
886 功 能:实时时钟读取一字节
887 说 明:从DS1302读取1Byte数据 (内部函数)
888 入口参数:无
889 返 回 值:ACC
890 设 计:zhaojunjie 日 期:2002-03-19
891 修 改: 日 期:
892 ***********************************************************************/
893 uchar RTOutputByte(void)
894 {
895 1 uchar i;
896 1 for(i=8; i>0; i--)
897 1 {
898 2 ACC = ACC >>1; /*相当于汇编中的 RRC */
899 2 ACC7 = T_IO;
900 2 T_CLK = 1;
901 2 T_CLK = 0;
902 2 }
903 1 return(ACC);
904 1 }
905 /********************************************************************
906 函 数 名:W1302()
907 功 能:往DS1302写入数据
908 说 明:先写地址,后写命令/数据 (内部函数)
909 调 用:RTInputByte() , RTOutputByte()
910 入口参数:ucAddr: DS1302地址, ucData: 要写的数据
911 返 回 值:无
912 ***********************************************************************/
913 void W1302(uchar ucAddr, uchar ucDa)
914 {
915 1 T_RST = 0;
916 1 T_CLK = 0;
917 1 T_RST = 1;
918 1 RTInputByte(ucAddr); /* 地址,命令 */
919 1 RTInputByte(ucDa); /* 写1Byte数据*/
920 1 T_CLK = 1;
921 1 T_RST = 0;
C51 COMPILER V8.18 DA1302 12/15/2009 15:11:35 PAGE 16
922 1 }
923 /********************************************************************
924 函 数 名:R1302()
925 功 能:读取DS1302某地址的数据
926 说 明:先写地址,后读命令/数据 (内部函数)
927 调 用:RTInputByte() , RTOutputByte()
928 入口参数:ucAddr: DS1302地址
929 返 回 值:ucData :读取的数据
930 ***********************************************************************/
931 uchar R1302(uchar ucAddr)
932 {
933 1 uchar ucData;
934 1 T_RST = 0;
935 1 T_CLK = 0;
936 1 T_RST = 1;
937 1 RTInputByte(ucAddr); /* 地址,命令 */
938 1 ucData = RTOutputByte(); /* 读1Byte数据 */
939 1 T_CLK = 1;
940 1 T_RST = 0;
941 1 return(ucData);
942 1 }
943
944 /********************************************************************
945 函 数 名:Set1302()
946 功 能:设置初始时间
947 说 明:先写地址,后读命令/数据(寄存器多字节方式)
948 调 用:W1302()
949 入口参数:pClock: 设置时钟数据地址 格式为: 秒 分 时 日 月 星期 年
950 7Byte (BCD码)1B 1B 1B 1B 1B 1B 1B
951 返 回 值:无
952 ***********************************************************************/
953 void Set1302(uchar *pClock)
954 {
955 1 uchar i;
956 1 uchar ucAddr = 0x80;
957 1 W1302(0x8e,0x00); /* 控制命令,WP=0,写操作*/
958 1 for(i =7; i>0; i--)
959 1 {
960 2 W1302(ucAddr,*pClock); /* 秒 分 时 日 月 星期 年 */
961 2 pClock++;
962 2 ucAddr +=2;
963 2 }
964 1 W1302(0x8e,0x80); /* 控制命令,WP=1,写保护*/
965 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 3498 ----
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 + -