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

📄 iic接口读写.lis

📁 atmage8中的I2C口读写程序
💻 LIS
📖 第 1 页 / 共 2 页
字号:
 00C6 11F0              breq L32
 00C8           X9:
 00C8                   .dbline 105
 00C8           ;         return 1;                                 //ACK       
 00C8 01E0              ldi R16,1
 00CA 06C0              rjmp L13
 00CC           L32:
 00CC                   .dbline 107
 00CC           ;         
 00CC           ;    Stop();                                            //I2C停止
 00CC 84E9              ldi R24,148
 00CE 86BF              out 0x36,R24
 00D0                   .dbline 108
 00D0           ;    delay_ms(100);                             //延时
 00D0 04E6              ldi R16,100
 00D2 10E0              ldi R17,0
 00D4 A5DF              rcall _delay_ms
 00D6                   .dbline 109
 00D6           ;    return 0;
 00D6 0027              clr R16
 00D8                   .dbline -2
 00D8           L13:
 00D8                   .dbline 0 ; func end
 00D8 C990              ld R12,y+
 00DA A990              ld R10,y+
 00DC 0895              ret
 00DE                   .dbsym r RegAddress 12 c
 00DE                   .dbsym r Wdata 10 c
 00DE                   .dbend
 00DE                   .dbfunc e iic_read _iic_read fc
 00DE           ;           temp -> R10
 00DE           ;     RegAddress -> R16,R17
                        .even
 00DE           _iic_read::
 00DE AA92              st -y,R10
 00E0                   .dbline -1
 00E0                   .dbline 118
 00E0           ; }  
 00E0           ; 
 00E0           ; /*********************************************
 00E0           ; I2C总线读一个字节
 00E0           ; 返回非0:读成功
 00E0           ; 返回0:读失败
 00E0           ; **********************************************/
 00E0           ; unsigned char iic_read(unsigned RegAddress)
 00E0           ; {
 00E0                   .dbline 120
 00E0           ;    unsigned char temp;
 00E0           ;    Start();//I2C启动
 00E0 84EA              ldi R24,164
 00E2 86BF              out 0x36,R24
 00E4                   .dbline 121
 00E4           ;    Wait();
 00E4           L35:
 00E4                   .dbline 121
 00E4           L36:
 00E4                   .dbline 121
 00E4 26B6              in R2,0x36
 00E6 27FE              sbrs R2,7
 00E8 FDCF              rjmp L35
 00EA           X10:
 00EA                   .dbline 121
 00EA                   .dbline 121
 00EA                   .dbline 122
 00EA           ;    if (TestAck()!=START) 
 00EA 81B1              in R24,0x1
 00EC 887F              andi R24,248
 00EE 8830              cpi R24,8
 00F0 11F0              breq L38
 00F2           X11:
 00F2                   .dbline 123
 00F2           ;          return 1;                                    //ACK      
 00F2 01E0              ldi R16,1
 00F4 40C0              rjmp L34
 00F6           L38:
 00F6                   .dbline 125
 00F6           ;          
 00F6           ;    Write8Bit(WD_DEVICE_ADDR); //写I2C从器件地址和写方式
 00F6                   .dbline 125
 00F6 80EA              ldi R24,160
 00F8 83B9              out 0x3,R24
 00FA                   .dbline 125
 00FA 84E8              ldi R24,132
 00FC 86BF              out 0x36,R24
 00FE                   .dbline 125
 00FE                   .dbline 125
 00FE                   .dbline 126
 00FE           ;    Wait(); 
 00FE           L40:
 00FE                   .dbline 126
 00FE           L41:
 00FE                   .dbline 126
 00FE 26B6              in R2,0x36
 0100 27FE              sbrs R2,7
 0102 FDCF              rjmp L40
 0104           X12:
 0104                   .dbline 126
 0104                   .dbline 126
 0104                   .dbline 127
 0104           ;    if (TestAck()!=MT_SLA_ACK) 
 0104 81B1              in R24,0x1
 0106 887F              andi R24,248
 0108 8831              cpi R24,24
 010A 11F0              breq L43
 010C           X13:
 010C                   .dbline 128
 010C           ;          return 1;                                //ACK
 010C 01E0              ldi R16,1
 010E 33C0              rjmp L34
 0110           L43:
 0110                   .dbline 130
 0110           ;          
 0110           ;    Write8Bit(RegAddress);             //写器件相应寄存器地址
 0110                   .dbline 130
 0110 03B9              out 0x3,R16
 0112                   .dbline 130
 0112 84E8              ldi R24,132
 0114 86BF              out 0x36,R24
 0116                   .dbline 130
 0116                   .dbline 130
 0116                   .dbline 131
 0116           ;    Wait();
 0116           L45:
 0116                   .dbline 131
 0116           L46:
 0116                   .dbline 131
 0116 26B6              in R2,0x36
 0118 27FE              sbrs R2,7
 011A FDCF              rjmp L45
 011C           X14:
 011C                   .dbline 131
 011C                   .dbline 131
 011C                   .dbline 132
 011C           ;    if (TestAck()!=MT_DATA_ACK) 
 011C 81B1              in R24,0x1
 011E 887F              andi R24,248
 0120 8832              cpi R24,40
 0122 11F0              breq L48
 0124           X15:
 0124                   .dbline 133
 0124           ;          return 1;
 0124 01E0              ldi R16,1
 0126 27C0              rjmp L34
 0128           L48:
 0128                   .dbline 135
 0128           ;          
 0128           ;    Start();                                           //I2C重新启动
 0128 84EA              ldi R24,164
 012A 86BF              out 0x36,R24
 012C                   .dbline 136
 012C           ;    Wait();
 012C           L50:
 012C                   .dbline 136
 012C           L51:
 012C                   .dbline 136
 012C 26B6              in R2,0x36
 012E 27FE              sbrs R2,7
 0130 FDCF              rjmp L50
 0132           X16:
 0132                   .dbline 136
 0132                   .dbline 136
 0132                   .dbline 137
 0132           ;    if (TestAck()!=RE_START)  
 0132 81B1              in R24,0x1
 0134 887F              andi R24,248
 0136 8031              cpi R24,16
 0138 11F0              breq L53
 013A           X17:
 013A                   .dbline 138
 013A           ;          return 1;
 013A 01E0              ldi R16,1
 013C 1CC0              rjmp L34
 013E           L53:
 013E                   .dbline 140
 013E           ;          
 013E           ;    Write8Bit(RD_DEVICE_ADDR); //写I2C从器件地址和读方式
 013E                   .dbline 140
 013E 81EA              ldi R24,161
 0140 83B9              out 0x3,R24
 0142                   .dbline 140
 0142 84E8              ldi R24,132
 0144 86BF              out 0x36,R24
 0146                   .dbline 140
 0146                   .dbline 140
 0146                   .dbline 141
 0146           ;    Wait();
 0146           L55:
 0146                   .dbline 141
 0146           L56:
 0146                   .dbline 141
 0146 26B6              in R2,0x36
 0148 27FE              sbrs R2,7
 014A FDCF              rjmp L55
 014C           X18:
 014C                   .dbline 141
 014C                   .dbline 141
 014C                   .dbline 142
 014C           ;    if(TestAck()!=MR_SLA_ACK)  
 014C 81B1              in R24,0x1
 014E 887F              andi R24,248
 0150 8034              cpi R24,64
 0152 11F0              breq L58
 0154           X19:
 0154                   .dbline 143
 0154           ;          return 1;                               //ACK
 0154 01E0              ldi R16,1
 0156 0FC0              rjmp L34
 0158           L58:
 0158                   .dbline 145
 0158           ;          
 0158           ;    Twi();                                        //启动主I2C读方式
 0158 84E8              ldi R24,132
 015A 86BF              out 0x36,R24
 015C                   .dbline 146
 015C           ;    Wait();
 015C           L60:
 015C                   .dbline 146
 015C           L61:
 015C                   .dbline 146
 015C 26B6              in R2,0x36
 015E 27FE              sbrs R2,7
 0160 FDCF              rjmp L60
 0162           X20:
 0162                   .dbline 146
 0162                   .dbline 146
 0162                   .dbline 147
 0162           ;    if(TestAck()!=MR_DATA_NOACK) 
 0162 81B1              in R24,0x1
 0164 887F              andi R24,248
 0166 8835              cpi R24,88
 0168 11F0              breq L63
 016A           X21:
 016A                   .dbline 148
 016A           ;          return 1;                                    //ACK   
 016A 01E0              ldi R16,1
 016C 04C0              rjmp L34
 016E           L63:
 016E                   .dbline 150
 016E           ;          
 016E           ;    temp=TWDR;        //读取I2C接收数据
 016E A3B0              in R10,0x3
 0170                   .dbline 151
 0170           ;    Stop();          //I2C停止
 0170 84E9              ldi R24,148
 0172 86BF              out 0x36,R24
 0174                   .dbline 152
 0174           ;    return temp;
 0174 0A2D              mov R16,R10
 0176                   .dbline -2
 0176           L34:
 0176                   .dbline 0 ; func end
 0176 A990              ld R10,y+
 0178 0895              ret
 017A                   .dbsym r temp 10 c
 017A                   .dbsym r RegAddress 16 i
 017A                   .dbend
 017A                   .dbfunc e main _main fV
 017A           ;              i -> R20
 017A           ;              j -> R20
                        .even
 017A           _main::
 017A                   .dbline -1
 017A                   .dbline 156
 017A           ; }
 017A           ; //****************************************************************************
 017A           ; void main()
 017A           ; {
 017A                   .dbline 158
 017A           ;  unsigned char i,j;
 017A           ;  port_init();
 017A 42DF              rcall _port_init
 017C                   .dbline 159
 017C           ;  init_devices();
 017C 49DF              rcall _init_devices
 017E                   .dbline 161
 017E           ;  
 017E           ;  iic_init();
 017E 65DF              rcall _iic_init
 0180                   .dbline 163
 0180           ;  
 0180           ;  i=iic_write(0xaa,0X10);//在0X10地址写入数据0XAA
 0180 20E1              ldi R18,16
 0182 0AEA              ldi R16,170
 0184 6FDF              rcall _iic_write
 0186 402F              mov R20,R16
 0188                   .dbline 164
 0188           ;  if (i==1)
 0188 0130              cpi R16,1
 018A 19F4              brne L66
 018C           X22:
 018C                   .dbline 165
 018C           ;       PORTB=0x1;//若写入失败(i=1),B口0x01;若写入成功,B口输出0X02
 018C 81E0              ldi R24,1
 018E 88BB              out 0x18,R24
 0190 02C0              rjmp L67
 0192           L66:
 0192                   .dbline 167
 0192           ;  else
 0192           ;       PORTB=0x2;
 0192 82E0              ldi R24,2
 0194 88BB              out 0x18,R24
 0196           L67:
 0196                   .dbline 168
 0196           ;  j=iic_read(0X10);//读出0x10地址的数据
 0196 00E1              ldi R16,16
 0198 10E0              ldi R17,0
 019A A1DF              rcall _iic_read
 019C 402F              mov R20,R16
 019E                   .dbline 169
 019E           ;  if(j==1)
 019E 0130              cpi R16,1
 01A0 19F4              brne L68
 01A2           X23:
 01A2                   .dbline 170
 01A2           ;       PORTD=0xff;     //若读出失败(j=1),D口全灭;若读出成功,D口输出0XAA
 01A2 8FEF              ldi R24,255
 01A4 82BB              out 0x12,R24
 01A6 01C0              rjmp L71
 01A8           L68:
 01A8                   .dbline 172
 01A8           ;  else
 01A8           ;       PORTD=j;
 01A8 42BB              out 0x12,R20
 01AA           L70:
 01AA                   .dbline 174
 01AA           ;  while(1)
 01AA           ;  {
 01AA                   .dbline 175
 01AA           ;   ;
 01AA                   .dbline 176
 01AA           ;  }
 01AA           L71:
 01AA                   .dbline 173
 01AA FFCF              rjmp L70
 01AC           X24:
 01AC                   .dbline -2
 01AC           L65:
 01AC                   .dbline 0 ; func end
 01AC 0895              ret
 01AE                   .dbsym r i 20 c
 01AE                   .dbsym r j 20 c
 01AE                   .dbend
 01AE           ; }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -