📄 twi.lis
字号:
00D6 ; unsigned char TWCR_state;
00D6 ; char i=0;
00D6 CC24 clr R12
00D8 .dbline 105
00D8 ; error_state=0;
00D8 2224 clr R2
00DA 20920000 sts _error_state,R2
00DE .dbline 108
00DE ;
00DE ; //初始化 twi
00DE ; twi_init();
00DE A5DF rcall _twi_init
00E0 .dbline 111
00E0 ;
00E0 ; //发送START信号
00E0 ; start();
00E0 99DF rcall _start
00E2 .dbline 112
00E2 ; TWCR_state = TWCR & 0x80;
00E2 46B7 in R20,0x36
00E4 4078 andi R20,128
00E6 0AC0 rjmp L26
00E8 L25:
00E8 .dbline 114
00E8 ; while((TWCR_state == 0x00))
00E8 ; {
00E8 .dbline 115
00E8 ; i++;
00E8 C394 inc R12
00EA .dbline 116
00EA ; if(i>=10){error_state=6;break;}
00EA 8C2D mov R24,R12
00EC 8A30 cpi R24,10
00EE 20F0 brlo L28
00F0 .dbline 116
00F0 .dbline 116
00F0 86E0 ldi R24,6
00F2 80930000 sts _error_state,R24
00F6 .dbline 116
00F6 04C0 rjmp L27
00F8 L28:
00F8 .dbline 117
00F8 46B7 in R20,0x36
00FA 4078 andi R20,128
00FC .dbline 118
00FC L26:
00FC .dbline 113
00FC 4423 tst R20
00FE A1F3 breq L25
0100 L27:
0100 .dbline 121
0100 ; TWCR_state = TWCR & 0x80; //轮循等待START信号发送完成
0100 ; }
0100 ;
0100 ; //若START发送成功,发送从机地址
0100 ; if(error_state==0)
0100 20900000 lds R2,_error_state
0104 2220 tst R2
0106 69F4 brne L30
0108 .dbline 122
0108 ; {
0108 .dbline 123
0108 ; TWDR = WriteAddress; //发地址
0108 A3B8 out 0x3,R10
010A .dbline 124
010A ; _NOP();
010A 0000 nop
010C .dbline 125
010C ; _NOP();
010C 0000 nop
010E .dbline 127
010E ;
010E ; TWCR = (1 << TWINT) | (1 << TWEN);
010E 84E8 ldi R24,132
0110 86BF out 0x36,R24
0112 .dbline 128
0112 ; TWCR_state = TWCR & 0x80;
0112 46B7 in R20,0x36
0114 4078 andi R20,128
0116 02C0 rjmp L33
0118 L32:
0118 .dbline 130
0118 .dbline 130
0118 46B7 in R20,0x36
011A 4078 andi R20,128
011C .dbline 130
011C L33:
011C .dbline 129
011C ; while(TWCR_state == 0x00)
011C 4423 tst R20
011E E1F3 breq L32
0120 .dbline 131
0120 ; {TWCR_state = TWCR & 0x80;} //轮循查询地址是否发送
0120 ; checkstate();
0120 91DF rcall _checkstate
0122 .dbline 132
0122 ; }
0122 L30:
0122 .dbline 135
0122 ;
0122 ; //若从机地址发送成功,向从机发送数据
0122 ; if(error_state==0)
0122 20900000 lds R2,_error_state
0126 2220 tst R2
0128 69F4 brne L35
012A .dbline 136
012A ; {
012A .dbline 137
012A ; TWDR = data; //发数据
012A 63B9 out 0x3,R22
012C .dbline 138
012C ; _NOP();
012C 0000 nop
012E .dbline 139
012E ; _NOP();
012E 0000 nop
0130 .dbline 140
0130 ; TWCR = (1 << TWINT) | (1 << TWEN);
0130 84E8 ldi R24,132
0132 86BF out 0x36,R24
0134 .dbline 141
0134 ; TWCR_state = TWCR & 0x80;
0134 46B7 in R20,0x36
0136 4078 andi R20,128
0138 02C0 rjmp L38
013A L37:
013A .dbline 142
013A 46B7 in R20,0x36
013C 4078 andi R20,128
013E L38:
013E .dbline 142
013E ; while(TWCR_state == 0x00) TWCR_state = TWCR & 0x80; //轮循查询数据是否发送
013E 4423 tst R20
0140 E1F3 breq L37
0142 .dbline 143
0142 ; checkstate();
0142 80DF rcall _checkstate
0144 .dbline 144
0144 ; }
0144 L35:
0144 .dbline 147
0144 ;
0144 ; //发送STOP,退出总线控制
0144 ; stop();
0144 6CDF rcall _stop
0146 .dbline -2
0146 .dbline 148
0146 ; }
0146 L24:
0146 00D0 rcall pop_gset4
0148 .dbline 0 ; func end
0148 0895 ret
014A .dbsym r i 12 c
014A .dbsym r TWCR_state 20 c
014A .dbsym r data 22 c
014A .dbsym r WriteAddress 10 c
014A .dbend
014A .dbfunc e twiReadByte _twiReadByte fV
014A ; TWCR_state -> R10
014A ; i -> R20
014A ; ReadAaddress -> R22
.even
014A _twiReadByte::
014A 00D0 rcall push_gset3
014C 602F mov R22,R16
014E .dbline -1
014E .dbline 154
014E ; //************** twi主机接收,从地址为ReadAaddress的从机接收1个字节*************
014E ; // 入口参数1:ReadAaddress:从机地址
014E ; // TWDR中存放的高七位为地址,最低位表示读写控制,0为写,1为读
014E ; //******************************************************************************
014E ; void twiReadByte(unsigned char ReadAaddress)
014E ; {
014E .dbline 156
014E ; unsigned char TWCR_state;
014E ; char i=0;
014E 4427 clr R20
0150 .dbline 157
0150 ; error_state=0;
0150 2224 clr R2
0152 20920000 sts _error_state,R2
0156 .dbline 160
0156 ;
0156 ; //初始化 twi
0156 ; twi_init();
0156 69DF rcall _twi_init
0158 .dbline 163
0158 ;
0158 ; //发送START信号
0158 ; start();
0158 5DDF rcall _start
015A .dbline 164
015A ; TWCR_state = TWCR & 0x80;
015A 86B7 in R24,0x36
015C 8078 andi R24,128
015E A82E mov R10,R24
0160 0AC0 rjmp L42
0162 L41:
0162 .dbline 166
0162 ; while((TWCR_state == 0x00))
0162 ; {
0162 .dbline 167
0162 ; i++;
0162 4395 inc R20
0164 .dbline 168
0164 ; if(i>=10){error_state=7;break;}
0164 4A30 cpi R20,10
0166 20F0 brlo L44
0168 .dbline 168
0168 .dbline 168
0168 87E0 ldi R24,7
016A 80930000 sts _error_state,R24
016E .dbline 168
016E 05C0 rjmp L43
0170 L44:
0170 .dbline 169
0170 86B7 in R24,0x36
0172 8078 andi R24,128
0174 A82E mov R10,R24
0176 .dbline 170
0176 L42:
0176 .dbline 165
0176 AA20 tst R10
0178 A1F3 breq L41
017A L43:
017A .dbline 173
017A ; TWCR_state = TWCR & 0x80; //轮循等待START信号发送完成
017A ; }
017A ;
017A ; //若START信号发送完成,发送读地址,并读取数据
017A ; if(error_state==0)
017A 20900000 lds R2,_error_state
017E 2220 tst R2
0180 91F4 brne L46
0182 .dbline 174
0182 ; {
0182 .dbline 175
0182 ; TWDR = ReadAaddress; //发地址
0182 63B9 out 0x3,R22
0184 .dbline 176
0184 ; _NOP();
0184 0000 nop
0186 .dbline 177
0186 ; _NOP();
0186 0000 nop
0188 .dbline 178
0188 ; TWCR = (1 << TWINT) | (1 << TWEN)|( 1<<TWIE )|(1 << TWEA);
0188 85EC ldi R24,197
018A 86BF out 0x36,R24
018C 08C0 rjmp L49
018E L48:
018E .dbline 180
018E .dbline 180
018E 4395 inc R20
0190 .dbline 180
0190 86E9 ldi R24,150
0192 8417 cp R24,R20
0194 20F4 brsh L51
0196 .dbline 180
0196 .dbline 180
0196 89E0 ldi R24,9
0198 80930000 sts _error_state,R24
019C .dbline 180
019C 04C0 rjmp L50
019E L51:
019E .dbline 180
019E L49:
019E .dbline 179
019E ; while(error_state==0)
019E 20900000 lds R2,_error_state
01A2 2220 tst R2
01A4 A1F3 breq L48
01A6 L50:
01A6 .dbline 180
01A6 ; {i++;if(i>150){error_state=9;break;}};
01A6 .dbline 181
01A6 ; }
01A6 L46:
01A6 .dbline 184
01A6 ;
01A6 ; //发送STOP,退出总线控制
01A6 ; stop();
01A6 3BDF rcall _stop
01A8 .dbline -2
01A8 .dbline 185
01A8 ; }
01A8 L40:
01A8 00D0 rcall pop_gset3
01AA .dbline 0 ; func end
01AA 0895 ret
01AC .dbsym r TWCR_state 10 c
01AC .dbsym r i 20 c
01AC .dbsym r ReadAaddress 22 c
01AC .dbend
01AC .dbfunc e twi_isr _twi_isr fc
01AC ; TWSR_state -> R16
.even
01AC _twi_isr::
01AC 2A92 st -y,R2
01AE 0A93 st -y,R16
01B0 1A93 st -y,R17
01B2 8A93 st -y,R24
01B4 9A93 st -y,R25
01B6 EA93 st -y,R30
01B8 2FB6 in R2,0x3f
01BA 2A92 st -y,R2
01BC .dbline -1
01BC .dbline 190
01BC ; //************** twi 中断例程,接收数据 ****************************************
01BC ; //******************************************************************************
01BC ; //twi中断服务程序
01BC ; char twi_isr(void)
01BC ; {
01BC .dbline 192
01BC ; unsigned char TWSR_state;
01BC ; TWSR_state = TWSR & 0xf8;
01BC 01B1 in R16,0x1
01BE 087F andi R16,248
01C0 .dbline 193
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -