⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.lst

📁 keilc关于LM75A温度计的使用例程
💻 LST
📖 第 1 页 / 共 5 页
字号:
                +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 + -