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

📄 24cxx.lis

📁 一个关于AVR单片机的例程
💻 LIS
📖 第 1 页 / 共 2 页
字号:
 013C           L19:
 013C                   .dbline 134
 013C           ;               
 013C           ;       i2cstop();
 013C 41D0              xcall _i2cstop
 013E                   .dbline -2
 013E           L17:
 013E 0E940000          xcall pop_gset4
 0142                   .dbline 0 ; func end
 0142 0895              ret
 0144                   .dbsym r t 10 c
 0144                   .dbsym r num 22 i
 0144                   .dbsym r ad_rsc 12 i
 0144                   .dbsym r p_dst 20 pc
 0144                   .dbend
 0144                   .dbfunc e wt24c_fc _wt24c_fc fpc
 0144           ;              t -> R12
 0144           ;              n -> R22
 0144           ;             ad -> R10,R11
 0144           ;              p -> R20,R21
                        .even
 0144           _wt24c_fc::
 0144 0E940000          xcall push_gset4
 0148 5901              movw R10,R18
 014A A801              movw R20,R16
 014C 6885              ldd R22,y+8
 014E                   .dbline -1
 014E                   .dbline 143
 014E           ; 
 014E           ; }
 014E           ; 
 014E           ; 
 014E           ; 
 014E           ; //向24Cxx写入数据wt24c_h()所要调用的函数
 014E           ; //返回写入n个字节后的主机内存指针
 014E           ; uchar * wt24c_fc(uchar *p, uint ad, uchar n)
 014E           ; {     uchar t=0;
 014E                   .dbline 143
 014E CC24              clr R12
 0150                   .dbline 146
 0150           ; 
 0150           ;       #if e2prom<32
 0150           ;       t=ad>>8;
 0150 6501              movw R12,R10
 0152 CD2C              mov R12,R13
 0154 DD24              clr R13
 0156                   .dbline 147
 0156           ;       t<<=1;
 0156 CC0C              lsl R12
 0158                   .dbline 150
 0158           ;       #endif
 0158           ;       
 0158           ;       i2cstart();                                     //发送起始信号
 0158 1CD0              xcall _i2cstart
 015A                   .dbline 152
 015A           ;               
 015A           ;       if(i2cwt(W_ADD_COM+t)==SLAW)//发送SLA_W, 写字节命令及器件地址
 015A 0C2D              mov R16,R12
 015C 0056              subi R16,96    ; addi 160
 015E 1FD0              xcall _i2cwt
 0160 0831              cpi R16,24
 0162 69F4              brne L25
 0164                   .dbline 153
 0164           ;       {       
 0164                   .dbline 157
 0164           ;               #if e2prom>16
 0164           ;               i2cwt(ad>>8);                   //ad_dst的高位到器件
 0164           ;               #endif
 0164           ;               i2cwt(ad);                              //ad_dst的低位到器件
 0164 0A2D              mov R16,R10
 0166 1BD0              xcall _i2cwt
 0168                   .dbline 159
 0168           ;                       
 0168           ;               for(;n>0;n--)                   //发送要写入的数据
 0168 06C0              xjmp L30
 016A           L27:
 016A                   .dbline 160
 016A                   .dbline 160
 016A FA01              movw R30,R20
 016C 0081              ldd R16,z+0
 016E 17D0              xcall _i2cwt
 0170                   .dbline 161
 0170 4F5F              subi R20,255  ; offset = 1
 0172 5F4F              sbci R21,255
 0174                   .dbline 162
 0174           L28:
 0174                   .dbline 159
 0174 6A95              dec R22
 0176           L30:
 0176                   .dbline 159
 0176 2224              clr R2
 0178 2616              cp R2,R22
 017A B8F3              brlo L27
 017C                   .dbline 163
 017C           ;               {   i2cwt(*p);
 017C           ;                       p++;
 017C           ;               }
 017C           ;       }
 017C 03C0              xjmp L26
 017E           L25:
 017E                   .dbline 164
 017E           ;       else syserr=ERR_SLAW;           //写字节命令及器件地址错
 017E 8AE0              ldi R24,10
 0180 80930000          sts _syserr,R24
 0184           L26:
 0184                   .dbline 166
 0184           ;       
 0184           ;       i2cstop();
 0184 1DD0              xcall _i2cstop
 0186                   .dbline 167
 0186           ;     tms(6);                                           //延时6ms
 0186 06E0              ldi R16,6
 0188 2DD0              xcall _tms
 018A                   .dbline 169
 018A           ;       
 018A           ;       return(p);
 018A 8A01              movw R16,R20
 018C                   .dbline -2
 018C           L24:
 018C 0E940000          xcall pop_gset4
 0190                   .dbline 0 ; func end
 0190 0895              ret
 0192                   .dbsym r t 12 c
 0192                   .dbsym r n 22 c
 0192                   .dbsym r ad 10 i
 0192                   .dbsym r p 20 pc
 0192                   .dbend
 0192                   .dbfunc e i2cstart _i2cstart fV
                        .even
 0192           _i2cstart::
 0192                   .dbline -1
 0192                   .dbline 178
 0192           ; }
 0192           ; 
 0192           ; 
 0192           ; 
 0192           ; //-------------------------------以下为其它I2总线器件可调用的函数--------------------------
 0192           ; 
 0192           ; //总线上起动开始条件
 0192           ; void i2cstart(void)
 0192           ; { 
 0192                   .dbline 179
 0192           ;       TWCR= BIT(TWINT) | BIT(TWSTA) | BIT(TWEN); 
 0192 84EA              ldi R24,164
 0194 86BF              out 0x36,R24
 0196           L32:
 0196                   .dbline 180
 0196           L33:
 0196                   .dbline 180
 0196           ;       while (!(TWCR & BIT(TWINT)));
 0196 26B6              in R2,0x36
 0198 27FE              sbrs R2,7
 019A FDCF              rjmp L32
 019C                   .dbline -2
 019C           L31:
 019C                   .dbline 0 ; func end
 019C 0895              ret
 019E                   .dbend
 019E                   .dbfunc e i2cwt _i2cwt fc
 019E           ;              a -> R16
                        .even
 019E           _i2cwt::
 019E                   .dbline -1
 019E                   .dbline 185
 019E           ; } 
 019E           ; 
 019E           ; //把一个字节数据输入器件, 返回TWI状态
 019E           ; uchar i2cwt(uchar a)
 019E           ; { 
 019E                   .dbline 186
 019E           ;       TWDR = a; 
 019E 03B9              out 0x3,R16
 01A0                   .dbline 187
 01A0           ;       TWCR = BIT(TWINT) | BIT(TWEN); 
 01A0 84E8              ldi R24,132
 01A2 86BF              out 0x36,R24
 01A4           L36:
 01A4                   .dbline 188
 01A4           L37:
 01A4                   .dbline 188
 01A4           ;       while (!(TWCR & BIT(TWINT)));
 01A4 26B6              in R2,0x36
 01A6 27FE              sbrs R2,7
 01A8 FDCF              rjmp L36
 01AA                   .dbline 189
 01AA           ;       _NOP();
 01AA 0000              nop
 01AC                   .dbline 190
 01AC           ;       return(TWSR&0b11111000);
 01AC 01B1              in R16,0x1
 01AE 087F              andi R16,248
 01B0                   .dbline -2
 01B0           L35:
 01B0                   .dbline 0 ; func end
 01B0 0895              ret
 01B2                   .dbsym r a 16 c
 01B2                   .dbend
 01B2                   .dbfunc e i2crd _i2crd fc
                        .even
 01B2           _i2crd::
 01B2                   .dbline -1
 01B2                   .dbline 196
 01B2           ; } 
 01B2           ; 
 01B2           ; //i2c读要调用的函数
 01B2           ; //从器件读出一个字节
 01B2           ; uchar i2crd(void)
 01B2           ; {
 01B2                   .dbline 197
 01B2           ;       TWCR= BIT(TWINT) | BIT(TWEA) | BIT(TWEN); 
 01B2 84EC              ldi R24,196
 01B4 86BF              out 0x36,R24
 01B6           L40:
 01B6                   .dbline 198
 01B6           L41:
 01B6                   .dbline 198
 01B6           ;       while (!(TWCR & BIT(TWINT)));
 01B6 26B6              in R2,0x36
 01B8 27FE              sbrs R2,7
 01BA FDCF              rjmp L40
 01BC                   .dbline 199
 01BC           ;       return(TWDR);
 01BC 03B1              in R16,0x3
 01BE                   .dbline -2
 01BE           L39:
 01BE                   .dbline 0 ; func end
 01BE 0895              ret
 01C0                   .dbend
 01C0                   .dbfunc e i2cstop _i2cstop fV
                        .even
 01C0           _i2cstop::
 01C0                   .dbline -1
 01C0                   .dbline 205
 01C0           ; } 
 01C0           ; 
 01C0           ; 
 01C0           ; //总线上起动停止条件 
 01C0           ; void i2cstop(void) 
 01C0           ; { 
 01C0                   .dbline 206
 01C0           ;    TWCR = BIT(TWINT) | BIT(TWSTO) | BIT(TWEN); 
 01C0 84E9              ldi R24,148
 01C2 86BF              out 0x36,R24
 01C4                   .dbline -2
 01C4           L43:
 01C4                   .dbline 0 ; func end
 01C4 0895              ret
 01C6                   .dbend
 01C6                   .dbfunc e Delay100us _Delay100us fV
 01C6           ;              i -> R20
 01C6           ;              x -> R16
                        .even
 01C6           _Delay100us::
 01C6 0E940000          xcall push_gset1
 01CA                   .dbline -1
 01CA                   .dbline 211
 01CA           ; } 
 01CA           ; //************************************************************************/
 01CA           ; //延时函数 古欣添加
 01CA           ; void Delay100us(uchar x)
 01CA           ; {
 01CA                   .dbline 213
 01CA           ;       uchar i;          //4clock                   
 01CA           ;       for(i=147;x!=0;x--)     
 01CA 43E9              ldi R20,147
 01CC 06C0              xjmp L48
 01CE           L49:
 01CE                   .dbline 214
 01CE           L50:
 01CE                   .dbline 214
 01CE 842F              mov R24,R20
 01D0 8150              subi R24,1
 01D2 482F              mov R20,R24
 01D4 8823              tst R24
 01D6 D9F7              brne L49
 01D8           L46:
 01D8                   .dbline 213
 01D8 0A95              dec R16
 01DA           L48:
 01DA                   .dbline 213
 01DA 0023              tst R16
 01DC C1F7              brne L50
 01DE                   .dbline -2
 01DE           L44:
 01DE 0E940000          xcall pop_gset1
 01E2                   .dbline 0 ; func end
 01E2 0895              ret
 01E4                   .dbsym r i 20 c
 01E4                   .dbsym r x 16 c
 01E4                   .dbend
 01E4                   .dbfunc e tms _tms fV
 01E4           ;              n -> R20
                        .even
 01E4           _tms::
 01E4 0E940000          xcall push_gset1
 01E8 402F              mov R20,R16
 01EA                   .dbline -1
 01EA                   .dbline 217
 01EA           ;       while(--i);      //5 * i clock
 01EA           ; }
 01EA           ; void tms(uchar n)
 01EA           ; {        
 01EA                   .dbline 218
 01EA 03C0              xjmp L56
 01EC           L53:
 01EC                   .dbline 218
 01EC                   .dbline 219
 01EC 0AE0              ldi R16,10
 01EE EBDF              xcall _Delay100us
 01F0                   .dbline 220
 01F0           L54:
 01F0                   .dbline 218
 01F0 4A95              dec R20
 01F2           L56:
 01F2                   .dbline 218
 01F2           ;       for (;n!=0;n--){
 01F2 4423              tst R20
 01F4 D9F7              brne L53
 01F6                   .dbline -2
 01F6           L52:
 01F6 0E940000          xcall pop_gset1
 01FA                   .dbline 0 ; func end
 01FA 0895              ret
 01FC                   .dbsym r n 20 c
 01FC                   .dbend
 01FC                   .dbfunc e Delay1s _Delay1s fV
 01FC           ;              m -> R20,R21
                        .even
 01FC           _Delay1s::
 01FC 0E940000          xcall push_gset1
 0200 A801              movw R20,R16
 0202                   .dbline -1
 0202                   .dbline 223
 0202           ;               Delay100us(10);
 0202           ;       }
 0202           ; }
 0202           ; void Delay1s(uint m)         //  m <= 6 ,when m==7, it is 1. 
 0202           ; {
 0202                   .dbline 224
 0202           ;       m=m*40;                
 0202 08E2              ldi R16,40
 0204 10E0              ldi R17,0
 0206 9A01              movw R18,R20
 0208 0E940000          xcall empy16s
 020C A801              movw R20,R16
 020E                   .dbline 225
 020E 04C0              xjmp L61
 0210           L58:
 0210                   .dbline 225
 0210                   .dbline 226
 0210 0AEF              ldi R16,250
 0212 D9DF              xcall _Delay100us
 0214                   .dbline 227
 0214           L59:
 0214                   .dbline 225
 0214 4150              subi R20,1
 0216 5040              sbci R21,0
 0218           L61:
 0218                   .dbline 225
 0218           ;       for (;m!=0;m--){
 0218 4030              cpi R20,0
 021A 4507              cpc R20,R21
 021C C9F7              brne L58
 021E           X5:
 021E                   .dbline -2
 021E           L57:
 021E 0E940000          xcall pop_gset1
 0222                   .dbline 0 ; func end
 0222 0895              ret
 0224                   .dbsym r m 20 i
 0224                   .dbend

⌨️ 快捷键说明

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