?? main.lst
字號:
+1 862 ; I2C_SDA = 1;
+1 863 ; I2C_Delay();
+1 864 ; I2C_SCL = 1;
A51 MACRO ASSEMBLER MAIN 06/23/2006 11:55:35 PAGE 14
+1 865 ; I2C_Delay();
+1 866 ; I2C_SDA = 0;
+1 867 ; I2C_Delay();
+1 868 ; I2C_SCL = 0;
+1 869 ; I2C_Delay();
012B D2B5 +1 870 SETB I2C_SDA
+1 871 I2C_Delay
0133 D2B4 +1 874 SETB I2C_SCL
+1 875 I2C_Delay
013B C2B5 +1 878 CLR I2C_SDA
+1 879 I2C_Delay
0143 C2B4 +1 882 CLR I2C_SCL
+1 883 I2C_Delay
+1 886 ;}
014B 22 +1 887 RET
+1 888
+1 889
+1 890 ;*************************************************************************
+1 891 ;函數:I2C_Write()
+1 892 ;功能:向I2C總線寫1個字節的數據
+1 893 ;參數:
+1 894 ; dat:要寫到總線上的數據
+1 895 ;*************************************************************************
+1 896 ;void I2C_Write(unsigned char dat)
+1 897 ;dat = R7
014C +1 898 I2C_Write:
+1 899 ;{
+1 900 ; unsigned char t = 8;
+1 901 ; 指定:t = R1
014C 7908 +1 902 MOV R1, #8
014E EF +1 903 MOV A, R7
+1 904 ; do
014F +1 905 I2C_Write_do:
+1 906 ; {
+1 907 ; I2C_SDA = (bit)(dat & 0x80);
+1 908 ; dat <<= 1;
014F A2E7 +1 909 MOV C, ACC.7
0151 92B5 +1 910 MOV I2C_SDA, C
0153 25E0 +1 911 ADD A, ACC
+1 912 ; I2C_SCL = 1;
+1 913 ; I2C_Delay();
+1 914 ; I2C_SCL = 0;
+1 915 ; I2C_Delay();
0155 D2B4 +1 916 SETB I2C_SCL
+1 917 I2C_Delay
015D C2B4 +1 920 CLR I2C_SCL
+1 921 I2C_Delay
+1 924 ; } while ( --t != 0 );
0165 D9E8 +1 925 DJNZ R1, I2C_Write_do
+1 926 ;}
0167 22 +1 927 RET
+1 928
+1 929
+1 930 ;*************************************************************************
+1 931 ;函數:I2C_Read()
+1 932 ;功能:從從機讀取1個字節的數據
+1 933 ;返回:讀取的一個字節數據
+1 934 ;*************************************************************************
+1 935 ;unsigned char I2C_Read()
+1 936 ;返回值 = ACC
0168 +1 937 I2C_Read:
+1 938 ;{
+1 939 ; unsigned char dat;
+1 940 ; unsigned char t = 8;
+1 941 ; 指定:dat = ACC
+1 942 ; 指定:t = R1
A51 MACRO ASSEMBLER MAIN 06/23/2006 11:55:35 PAGE 15
0168 7908 +1 943 MOV R1, #8
+1 944 ; I2C_SDA = 1; //在讀取數據之前,要把SDA拉高
016A D2B5 +1 945 SETB I2C_SDA
+1 946 ; do
016C +1 947 I2C_Read_do:
+1 948 ; {
+1 949 ; I2C_SCL = 1;
+1 950 ; I2C_Delay();
+1 951 ; dat <<= 1;
+1 952 ; if ( I2C_SDA ) dat |= 0x01;
016C D2B4 +1 953 SETB I2C_SCL
+1 954 I2C_Delay
0174 25E0 +1 957 ADD A, ACC
0176 30B501 +1 958 JNB I2C_SDA, I2C_Read_endif
0179 04 +1 959 INC A
017A +1 960 I2C_Read_endif:
+1 961 ; I2C_SCL = 0;
+1 962 ; I2C_Delay();
017A C2B4 +1 963 CLR I2C_SCL
+1 964 I2C_Delay
+1 967 ; } while ( --t != 0 );
0182 D9E8 +1 968 DJNZ R1, I2C_Read_do
+1 969 ; return dat;
+1 970 ;}
0184 22 +1 971 RET
+1 972
+1 973
+1 974 ;*************************************************************************
+1 975 ;函數:I2C_GetAck()
+1 976 ;功能:讀取從機應答位
+1 977 ;返回:
+1 978 ; 0:從機應答
+1 979 ; 1:從機非應答
+1 980 ;說明:
+1 981 ; 從機在收到每個字節的數據后,要產生應答位
+1 982 ; 從機在收到最后1個字節的數據后,一般要產生非應答位
+1 983 ;*************************************************************************
+1 984 ;bit I2C_GetAck()
+1 985 ;返回值 = CY
0185 +1 986 I2C_GetAck:
+1 987 ;{
+1 988 ; bit ack;
+1 989 ; 指定:ack = CY
+1 990 ; I2C_SDA = 1;
+1 991 ; I2C_Delay();
+1 992 ; I2C_SCL = 1;
+1 993 ; I2C_Delay();
+1 994 ; ack = I2C_SDA;
+1 995 ; I2C_SCL = 0;
+1 996 ; I2C_Delay();
0185 D2B5 +1 997 SETB I2C_SDA
+1 998 I2C_Delay
018D D2B4 +1 1001 SETB I2C_SCL
+1 1002 I2C_Delay
0195 A2B5 +1 1005 MOV C, I2C_SDA
0197 C2B4 +1 1006 CLR I2C_SCL
+1 1007 I2C_Delay
+1 1010 ; return ack;
+1 1011 ;}
019F 22 +1 1012 RET
+1 1013
+1 1014
+1 1015 ;*************************************************************************
+1 1016 ;函數:I2C_PutAck()
+1 1017 ;功能:主機產生應答位或非應答位
+1 1018 ;參數:
A51 MACRO ASSEMBLER MAIN 06/23/2006 11:55:35 PAGE 16
+1 1019 ; ack=0:主機產生應答位
+1 1020 ; ack=1:主機產生非應答位
+1 1021 ;說明:
+1 1022 ; 主機在接收完每一個字節的數據后,都應當產生應答位
+1 1023 ; 主機在接收完最后一個字節的數據后,應當產生非應答位
+1 1024 ;*************************************************************************
+1 1025 ;void I2C_PutAck(bit ack)
+1 1026 ;ack = 0x20.0
01A0 +1 1027 I2C_PutAck:
+1 1028 ;{
+1 1029 ; I2C_SDA = ack;
+1 1030 ; I2C_Delay();
+1 1031 ; I2C_SCL = 1;
+1 1032 ; I2C_Delay();
+1 1033 ; I2C_SCL = 0;
+1 1034 ; I2C_Delay();
01A0 A200 +1 1035 MOV C, 0x20.0
01A2 92B5 +1 1036 MOV I2C_SDA, C
+1 1037 I2C_Delay
01AA D2B4 +1 1040 SETB I2C_SCL
+1 1041 I2C_Delay
01B2 C2B4 +1 1044 CLR I2C_SCL
+1 1045 I2C_Delay
+1 1048 ;}
01BA 22 +1 1049 RET
+1 1050
+1 1051
+1 1052 ;*************************************************************************
+1 1053 ;函數:I2C_Stop()
+1 1054 ;功能:產生I2C總線的停止狀態
+1 1055 ;說明:
+1 1056 ; SCL處于高電平期間,當SDA出現上升沿時停止I2C總線
+1 1057 ; 不論SDA和SCL處于什么電平狀態,本函數總能正確產生停止狀態
+1 1058 ; 本函數執行后,I2C總線處于空閑狀態
+1 1059 ;*************************************************************************
+1 1060 ;void I2C_Stop()
01BB +1 1061 I2C_Stop:
+1 1062 ;{
+1 1063 ; unsigned int t;
+1 1064 ; 指定:t = (R0,R1)
+1 1065 ; I2C_SDA = 0;
+1 1066 ; I2C_Delay();
+1 1067 ; I2C_SCL = 1;
+1 1068 ; I2C_Delay();
+1 1069 ; I2C_SDA = 1;
+1 1070 ; I2C_Delay();
01BB C2B5 +1 1071 CLR I2C_SDA
+1 1072 I2C_Delay
01C3 D2B4 +1 1075 SETB I2C_SCL
+1 1076 I2C_Delay
01CB D2B5 +1 1079 SETB I2C_SDA
+1 1080 I2C_Delay
+1 1083 ; t = I2C_STOP_WAIT_VALUE;
01D3 7800 +1 1084 MOV R0, #HIGH(I2C_STOP_WAIT_VALUE)
01D5 7901 +1 1085 MOV R1, #LOW(I2C_STOP_WAIT_VALUE)
+1 1086 ; while ( --t != 0 ); //在下一次產生Start之前,要加一定的延時
01D7 +1 1087 I2C_Stop_while:
+1 1088 DJNZ_W R0,R1, I2C_Stop_while ;宏DJNZ_W的定義見Branch.INC
+1 1097 ;}
01E0 22 +1 1098 RET
+1 1099
+1 1100
+1 1101 ;*************************************************************************
+1 1102 ;函數:I2C_Puts()
+1 1103 ;功能:主機通過I2C總線向從機發送多個字節的數據
+1 1104 ;參數:
A51 MACRO ASSEMBLER MAIN 06/23/2006 11:55:35 PAGE 17
+1 1105 ; SlaveAddr:從機地址(高7位是從機地址,最低位是寫標志0)
+1 1106 ; SubAddr:從機的子地址
+1 1107 ; Size:數據的字節數
+1 1108 ; *dat:要發送的數據
+1 1109 ;返回:
+1 1110 ; 0:發送成功
+1 1111 ; 1:在發送過程中出現異常
+1 1112 ;**************************************************
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -