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

📄 twi.lis

📁 PTR8000无线通信模块的单片机控制程序
💻 LIS
📖 第 1 页 / 共 3 页
字号:
 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 + -