📄 clock.lst
字号:
716 1 {
717 2 DisplayOneChar(15,1,R1302(0x8b)%16+0x30);//显示星期
718 2 }
719 1 }
720
721 //********* LCM1602驱动程序 ***************
722 //写数据
723 void WriteDataLCM(unsigned char WDLCM)
724 {
725 1 ReadStatusLCM(); //检测忙
726 1 LCM_Data = WDLCM;
727 1 LCM_RS = 1;
728 1 LCM_RW = 0;
729 1 LCM_E = 0; //若晶振速度太高可以在这后加小的延时
730 1 LCM_E = 0; //延时
731 1 LCM_E = 1;
732 1 }
733 //写指令
734 void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测
735 {
736 1 if (BuysC) ReadStatusLCM(); //根据需要检测忙
737 1 LCM_Data = WCLCM;
C51 COMPILER V7.06 CLOCK 07/14/2008 21:00:26 PAGE 13
738 1 LCM_RS = 0;
739 1 LCM_RW = 0;
740 1 LCM_E = 0;
741 1 LCM_E = 0;
742 1 LCM_E = 1;
743 1 }
744 //读状态
745 unsigned char ReadStatusLCM(void)
746 {
747 1 LCM_Data = 0xFF;
748 1 LCM_RS = 0;
749 1 LCM_RW = 1;
750 1 LCM_E = 0;
751 1 LCM_E = 0;
752 1 LCM_E = 1;
753 1 while (LCM_Data & Busy); //检测忙信号
754 1 return(LCM_Data);
755 1 }
756 //LCM初始化
757 void LCMInit(void)
758 {
759 1 LCM_Data = 0;
760 1 WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
761 1 Delay5Ms();
762 1 WriteCommandLCM(0x38,0);
763 1 Delay5Ms();
764 1 WriteCommandLCM(0x38,0);
765 1 Delay5Ms();
766 1 WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号
767 1 WriteCommandLCM(0x08,1); //关闭显示
768 1 WriteCommandLCM(0x01,1); //显示清屏
769 1 WriteCommandLCM(0x06,1); // 显示光标移动设置
770 1 WriteCommandLCM(0x0C,1); // 显示开及光标设置
771 1 }
772 //按指定位置显示一个字符
773 void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
774 {
775 1 Y &= 0x1;
776 1 X &= 0xF; //限制X不能大于15,Y不能大于1
777 1 if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
778 1 X |= 0x80; //算出指令码
779 1 WriteCommandLCM(X, 0); //这里不检测忙信号,发送地址码
780 1 WriteDataLCM(DData);
781 1 }
782 //按指定位置显示一串字符 ***原来的遇到空格0x20就不显示***
783 void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
784 {
785 1 unsigned char ListLength,j;
786 1 ListLength = strlen(DData);
787 1 Y &= 0x1;
788 1 X &= 0xF; //限制X不能大于15,Y不能大于1
789 1 if (X <= 0xF) //X坐标应小于0xF
790 1 {
791 2 for(j=0;j<ListLength;j++)
792 2 {
793 3 DisplayOneChar(X, Y, DData[j]); //显示单个字符
794 3 X++;
795 3 }
796 2 }
797 1 }
798 //5ms延时
799 void Delay5Ms(void)
C51 COMPILER V7.06 CLOCK 07/14/2008 21:00:26 PAGE 14
800 {
801 1 unsigned int TempCyc = 5552;
802 1 while(TempCyc--);
803 1 }
804 //400ms延时
805 void Delay400Ms(void)
806 {
807 1 unsigned char TempCycA = 5;
808 1 unsigned int TempCycB;
809 1 while(TempCycA--)
810 1 {
811 2 TempCycB=7269;
812 2 while(TempCycB--);
813 2 };
814 1 }
815
816 //********DS1302读写程序***************
817 /********************************************************************
818 函 数 名:RTInputByte()
819 功 能:实时时钟写入一字节
820 说 明:往DS1302写入1Byte数据 (内部函数)
821 入口参数:d 写入的数据
822 返 回 值:无
823 ***********************************************************************/
824 void RTInputByte(uchar d)
825 {
826 1 uchar i;
827 1 ACC = d;
828 1 for(i=8; i>0; i--)
829 1 {
830 2 T_IO = ACC0; /*相当于汇编中的 RRC */
831 2 T_CLK = 1;
832 2 T_CLK = 0;
833 2 ACC = ACC >> 1;
834 2 }
835 1 }
836 /********************************************************************
837 函 数 名:RTOutputByte()
838 功 能:实时时钟读取一字节
839 说 明:从DS1302读取1Byte数据 (内部函数)
840 入口参数:无
841 返 回 值:ACC
842 设 计:zhaojunjie 日 期:2002-03-19
843 修 改: 日 期:
844 ***********************************************************************/
845 uchar RTOutputByte(void)
846 {
847 1 uchar i;
848 1 for(i=8; i>0; i--)
849 1 {
850 2 ACC = ACC >>1; /*相当于汇编中的 RRC */
851 2 ACC7 = T_IO;
852 2 T_CLK = 1;
853 2 T_CLK = 0;
854 2 }
855 1 return(ACC);
856 1 }
857 /********************************************************************
858 函 数 名:W1302()
859 功 能:往DS1302写入数据
860 说 明:先写地址,后写命令/数据 (内部函数)
861 调 用:RTInputByte() , RTOutputByte()
C51 COMPILER V7.06 CLOCK 07/14/2008 21:00:26 PAGE 15
862 入口参数:ucAddr: DS1302地址, ucData: 要写的数据
863 返 回 值:无
864 ***********************************************************************/
865 void W1302(uchar ucAddr, uchar ucDa)
866 {
867 1 T_RST = 0;
868 1 T_CLK = 0;
869 1 T_RST = 1;
870 1 RTInputByte(ucAddr); /* 地址,命令 */
871 1 RTInputByte(ucDa); /* 写1Byte数据*/
872 1 T_CLK = 1;
873 1 T_RST = 0;
874 1 }
875 /********************************************************************
876 函 数 名:R1302()
877 功 能:读取DS1302某地址的数据
878 说 明:先写地址,后读命令/数据 (内部函数)
879 调 用:RTInputByte() , RTOutputByte()
880 入口参数:ucAddr: DS1302地址
881 返 回 值:ucData :读取的数据
882 ***********************************************************************/
883 uchar R1302(uchar ucAddr)
884 {
885 1 uchar ucData;
886 1 T_RST = 0;
887 1 T_CLK = 0;
888 1 T_RST = 1;
889 1 RTInputByte(ucAddr); /* 地址,命令 */
890 1 ucData = RTOutputByte(); /* 读1Byte数据 */
891 1 T_CLK = 1;
892 1 T_RST = 0;
893 1 return(ucData);
894 1 }
895
896 /********************************************************************
897 函 数 名:Set1302()
898 功 能:设置初始时间
899 说 明:先写地址,后读命令/数据(寄存器多字节方式)
900 调 用:W1302()
901 入口参数:pClock: 设置时钟数据地址 格式为: 秒 分 时 日 月 星期 年
902 7Byte (BCD码)1B 1B 1B 1B 1B 1B 1B
903 返 回 值:无
904 ***********************************************************************/
905 void Set1302(uchar *pClock)
906 {
907 1 uchar i;
908 1 uchar ucAddr = 0x80;
909 1 W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
910 1 for(i =7; i>0; i--)
911 1 {
912 2 W1302(ucAddr,*pClock); /* 秒 分 时 日 月 星期 年 */
913 2 pClock++;
914 2 ucAddr +=2;
915 2 }
916 1 W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/
917 1 }
918
919 //*********** 18B20驱动 **************************
920 //延时
921 void delay(word useconds)
922 {
923 1 for(;useconds>0;useconds--);
C51 COMPILER V7.06 CLOCK 07/14/2008 21:00:26 PAGE 16
924 1 }
925
926 //复位
927 byte ow_reset(void)
928 {
929 1 byte presence;
930 1 DQ = 0; //拉低总线
931 1 delay(29); // 保持 480us
932 1 DQ = 1; // 释放总线
933 1 delay(3); // 等待回复
934 1 presence = DQ; // 读取信号
935 1 delay(25); // 等待结束信号
936 1 return(presence); // 返回 0:正常 1:不存在
937 1 }
938
939 //从 1-wire 总线上读取一个字节
940 byte read_byte(void)
941 {
942 1 byte i;
943 1 byte value = 0;
944 1 for (i=8;i>0;i--)
945 1 {
946 2 value>>=1;
947 2 DQ = 0;
948 2 DQ = 1;
949 2 delay(1);
950 2 if(DQ)value|=0x80;
951 2 delay(6);
952 2 }
953 1 return(value);
954 1 }
955
956 //向 1-WIRE 总线上写一个字节
957 void write_byte(char val)
958 {
959 1 byte i;
960 1 for (i=8; i>0; i--) // 一次写一位
961 1 {
962 2 DQ = 0; //
963 2 DQ = val&0x01;
964 2 delay(5); //
965 2 DQ = 1;
966 2 val=val/2;
967 2 }
968 1 delay(5);
969 1 }
970
971 //读取和显示温度
972 Read_Temperature(char xx,char yy)
973 {
974 1 unsigned char i,tl_temp;
975 1 unsigned int x;
976 1 unsigned char ct[8];
977 1 union{byte c[2]; int x;}temp;
978 1
979 1 ow_reset();
980 1 write_byte(0xCC); // Skip ROM
981 1 write_byte(0x44); // 转换温度
982 1 ow_reset();
983 1 write_byte(0xCC); //Skip ROM
984 1 write_byte(0xbe); // 读取寄存器
985 1 temp.c[1]=read_byte();//读出温度低8位
C51 COMPILER V7.06 CLOCK 07/14/2008 21:00:26 PAGE 17
986 1 temp.c[0]=read_byte();//读出温度高8位
987 1
988 1 // 零下温度判断
989 1 sflag=0; //温度零下标志 0:零上,1:零下
990 1 if((temp.c[0]&0xf8)!=0x00)
991 1 {
992 2 sflag=1; //零下标志位置1
993 2 temp.c[1]=~temp.c[1]; //低8位取反
994 2 temp.c[0]=~temp.c[0]; //高8位取反
995 2 tl_temp=temp.c[1]+1; //低8位加1
996 2 temp.c[1]=tl_temp; //计算后重新存入数组
997 2 if(tl_temp>255) temp.c[0]++; //如果低8位大于255,向高8位进1
998 2 }
999 1
1000 1 x=((temp.c[0]&0x07)*256+temp.c[1])*.625;
1001 1 for(i=0;i<8;i++)
1002 1 {
1003 2 ct[i]=0;
1004 2 }
1005 1 i=0;
1006 1 while(x/10)
1007 1 {
1008 2 ct[i]=x%10;
1009 2 x=x/10;
1010 2 i++;
1011 2 }
1012 1 ct[i]=x;
1013 1
1014 1 if(sflag==1) DisplayOneChar(xx-1,yy,0x2d);
1015 1 else DisplayOneChar(xx-1,yy,0x20);
1016 1 DisplayOneChar(xx, yy,ct[2]+0x30);//显示温度十位数
1017 1 DisplayOneChar(xx+1,yy,ct[1]+0x30);//显示温度个位数
1018 1 DisplayOneChar(xx+2,yy,0x2e);//显示小数点
1019 1 DisplayOneChar(xx+3,yy,ct[0]+0x30);//显示温度小数位
1020 1 DisplayOneChar(xx+4,yy,0x01);//显示自定义字符
1021 1 DisplayOneChar(xx+5,yy,0x43);//显示字符“C
1022 1 }
1023
1024 //温度分辨率调整
1025 void adjust_res(char res) ///res 分别等于 0x1f, 0x3f, 0x5f 温度读数分辨率分别对应
1026 // 0.5, 0.25, 0.125
1027 {
1028 1 ow_reset(); //复位
1029 1 write_byte(0xcc); //跳过Rom
1030 1 write_byte(0x4e); //写暂存器
1031 1 write_byte(0x02); //写TH
1032 1 write_byte(0x01); //写TL
1033 1 //write_byte(0x5f); //写结构寄存器
1034 1 write_byte(res);
1035 1 ow_reset(); //复位
1036 1 write_byte(0xcc); //跳过Rom
1037 1 write_byte(0x48); //把暂存器内容写到EPRam中
1038 1 }
1039
1040 void mychar()//自定义字符
1041 {
1042 1 ///////////////////////自定义字符
1043 1 WriteCommandLCM(0x48, 0); //第一行
1044 1 WriteDataLCM(0x02);
1045 1 WriteCommandLCM(0x49, 0); //第2行
1046 1 WriteDataLCM(0x05);
1047 1 WriteCommandLCM(0x4a, 0); //第3
C51 COMPILER V7.06 CLOCK 07/14/2008 21:00:26 PAGE 18
1048 1 WriteDataLCM(0x05);
1049 1 WriteCommandLCM(0x4b, 0); //第4
1050 1 WriteDataLCM(0x02);
1051 1 WriteCommandLCM(0x4c, 0); //第5
1052 1 WriteDataLCM(0x00);
1053 1 WriteCommandLCM(0x4d, 0); //第6
1054 1 WriteDataLCM(0x00);
1055 1 WriteCommandLCM(0x4e, 0); //第7
1056 1 WriteDataLCM(0x00);
1057 1 WriteCommandLCM(0x4f, 0); //第8
1058 1 WriteDataLCM(0x00);
1059 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 2812 ----
CONSTANT SIZE = 6 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 13 39
IDATA SIZE = ---- ----
BIT SIZE = 16 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -