📄 hclcd.lst
字号:
780 2 temp =temp<<1;
781 2 SCL = 0;
782 2 SomeNOP();
783 2 SDA = CY;
784 2 SomeNOP();
785 2 SCL = 1;
786 2 SomeNOP();
787 2 }
788 1 SCL = 0;
789 1 SomeNOP();
790 1 SDA = 1;
791 1 SomeNOP();
792 1 }
793 /*I2C读数据程序(从数据线上读出一个BYTE)返回值为读出的数据(BYTE型)*/
794 Uchar Readx(void)
795 {
796 1 Uchar i,j,k=0;
797 1 SCL = 0;
798 1 SomeNOP();
C51 COMPILER V7.06 HCLCD 09/24/2008 15:03:44 PAGE 14
799 1 SDA = 1;
800 1 for (i=0;i<8;i++) // 串行移位,先读出高位,后读出低位//
801 1 {
802 2 SomeNOP();
803 2 SCL = 1;
804 2 SomeNOP();
805 2 if(SDA ==1) j=1;
806 2 else j=0;
807 2 k =(k<<1)|j;
808 2 SCL = 0;
809 2 }
810 1 SomeNOP();
811 1 return(k); //返回读出的值//
812 1 }
813
814 //******************以下为对24CXX系列的读写程序******************************//
815 //*************24CXX的device address 为写0A0H,读为0A1H*********************//
816 /*某个地址写数据*/
817 void X24_Write(Uchar Addresshigh,Uchar Addresslow,Uchar Write_date)
818 {
819 1 I2CStart();
820 1 Writex(0xA0);
821 1 AutoACK();
822 1 Writex(Addresshigh);
823 1 AutoACK();
824 1 Writex(Addresslow);
825 1 AutoACK();
826 1 Writex(Write_date);
827 1 AutoACK();
828 1 I2CStop();
829 1 Delay_1ms(10);
830 1 }
831
832 /*对某个地址读操作,函数值为读出的数据*/
833 Uchar X24_Read(Uchar Addresshigh,Uchar Addresslow)
834 {
835 1 Uchar i;
836 1 I2CStart();
837 1 Writex(0xA0);
838 1 AutoACK();
839 1 Writex(Addresshigh);
840 1 AutoACK();
841 1 Writex(Addresslow);
842 1 AutoACK();
843 1 I2CStart();
844 1 Writex(0xA1);
845 1 AutoACK();
846 1 i =Readx();
847 1 //ACK(); //注意:这里不能有ACK应答信号//
848 1 I2CStop();
849 1 Delay_1ms(0);
850 1 return(i);
851 1 }
852
853 /*对内存中的数据块写入,入口为写EEPROM的地址,内存缓冲中的数据的起始地址(是IDATA的数据)*/
854 void X24_WritePage(Uchar Addresshigh,Uchar Addresslow,Uchar idata *Writeip)
855 {
856 1 Uchar i;
857 1 I2CStart();
858 1 Writex(0xA0);
859 1 AutoACK();
860 1 Writex(Addresshigh);
C51 COMPILER V7.06 HCLCD 09/24/2008 15:03:44 PAGE 15
861 1 AutoACK();
862 1 Writex(Addresslow);
863 1 AutoACK();
864 1 for(i=0;i<64;i++)
865 1 {
866 2 Writex(*Writeip++);
867 2 AutoACK();
868 2 }
869 1 I2CStop();
870 1 }
871 /*把EEPROM中的数据读出来存放在内存缓冲中,起始地址为(是IDATA的数据)*/
872 void X24_ReadPage(Uchar Addresshigh,Uchar Addresslow,Uchar idata *Readip)
873 {
874 1 Uchar i;
875 1 I2CStart();
876 1 Writex(0xA0);
877 1 AutoACK();
878 1 Writex(Addresshigh);
879 1 AutoACK();
880 1 Writex(Addresslow);
881 1 AutoACK();
882 1 I2CStart();
883 1 Writex(0xA1);
884 1 AutoACK();
885 1 for(i=0;i<63;i++) //PAGE读的时候最后一个BYTE不要ACK信号//
886 1 {
887 2 *Readip = Readx();
888 2 Readip = Readip++;
889 2 ACK();
890 2 }
891 1 *Readip = Readx();
892 1 NACK();
893 1 I2CStop();
894 1 Delay_1ms(0);
895 1 }
896
897
898 //*******************以下为对PCF8383/PCF8563的读写子程序********************//
899 //**********时钟片device address的写地址为0A2H,读地址为0A3H******************//
900 /*对PCF8563的时钟读到内存中,以IDATA指针开始的连续7个BYTE*/
901 //****读出的内容依次为“秒,分钟,小时,日,星期,月/世纪,年********************//
902 //PCF8585依次为“秒,分钟,小时,日,星期月
903 void GetPCF8563(Uchar idata *Getip)
904 {
905 1 Uchar i;
906 1 I2CStart();
907 1 Writex(0xA2);
908 1 AutoACK();
909 1 Writex(0x02); //从秒地址开始读//
910 1 AutoACK();
911 1 I2CStart();
912 1 Writex(0xA3);
913 1 AutoACK();
914 1 for(i=0;i<6;i++)
915 1 {
916 2 *Getip = Readx();
917 2 Getip = Getip++;
918 2 ACK();
919 2 }
920 1 *Getip = Readx();
921 1 NACK();
922 1 I2CStop();
C51 COMPILER V7.06 HCLCD 09/24/2008 15:03:44 PAGE 16
923 1 Delay_1ms(0);
924 1 }
925 /*设定8563/8583的时间内容依次为“秒,分钟,小时,日,星期,月/世纪,年*/
926 //PCF8585依次为“秒,分钟,小时,日,星期月
927 void SetPCF8563(Uchar idata *Setip)
928 {
929 1 Uchar i;
930 1 I2CStart();
931 1 Writex(0xA2);
932 1 AutoACK();
933 1 Writex(0x02);
934 1 AutoACK();
935 1 for(i=0;i<7;i++)
936 1 {
937 2 Writex(*Setip++);
938 2 AutoACK();
939 2 }
940 1 I2CStop();
941 1 }
942
943 Uchar ReadPCF8563(Uchar AddrePCF)
944 {
945 1 Uchar i;
946 1 I2CStart();
947 1 Writex(0xA2);
948 1 AutoACK();
949 1 Writex(AddrePCF);
950 1 AutoACK();
951 1 I2CStart();
952 1 Writex(0xA3);
953 1 AutoACK();
954 1 i =Readx();
955 1 //ACK(); //注意:这里不能有ACK应答信号//
956 1 I2CStop();
957 1 Delay_1ms(0);
958 1 return(i);
959 1 }
960 void WritePCF8563(Uchar AddrePCF,Uchar PCFdata)
961 {
962 1 I2CStart();
963 1 Writex(0xA2);
964 1 AutoACK();
965 1 Writex(AddrePCF);
966 1 AutoACK();
967 1 Writex(PCFdata);
968 1 AutoACK();
969 1 I2CStop();
970 1 Delay_1ms(10);
971 1 }
972
973
974
975 void SetWaring (Uchar Wyear,Uchar Wmonth,Uchar Wday)
976 {
977 1 X24_Write(0x07,0xf0,Wyear);
978 1 X24_Write(0x07,0xf1,Wmonth);
979 1 X24_Write(0x07,0xf2,Wday);
980 1 }
981
982
983 /*返回值为1和0,1为已溢出,0为没有溢出*/
984 bit CheckTime(void)
C51 COMPILER V7.06 HCLCD 09/24/2008 15:03:44 PAGE 17
985 {
986 1 Uchar j,k;
987 1 j = X24_Read(0x07,0xcb);
988 1 k = ReadPCF8563(0x08 ); /*读年的时间*/
989 1 if(k<j)
990 1 {
991 2 return(0);
992 2 }
993 1 else
994 1 {
995 2 if(k>j)
996 2 {
997 3 return(1);
998 3 }
999 2 else
1000 2 {
1001 3 j = X24_Read(0x07,0xcc);
1002 3 k = ReadPCF8563(0x07)&0x1f; /*读月的时间*/
1003 3 if (k<j)
1004 3 {
1005 4 return(0);
1006 4 }
1007 3 else
1008 3 {
1009 4 if(k>j)
1010 4 {
1011 5 return(1);
1012 5 }
1013 4 else
1014 4 {
1015 5 j = X24_Read(0x07,0xcd);
1016 5 k = ReadPCF8563(0x05)&0x3f; /*读日的时间*/
1017 5 if (k>j)return(1);
1018 5 else return(0);
1019 5 }
1020 4 }
1021 3 }
1022 2 }
1023 1 }
1024
1025
1026
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 2590 ----
CONSTANT SIZE = 3052 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 29 10
IDATA SIZE = 71 ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -