📄 iic接口读写.lis
字号:
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 + -