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

📄 24cxx.lis

📁 EEPROM读写程序: 先向EEPROM写入一幅图片数据
💻 LIS
📖 第 1 页 / 共 2 页
字号:
 012C           ; //TWI initialize
 012C           ; // bit rate:100
 012C           ; void twi_init(void)
 012C           ; {
 012C                   .dbline 133
 012C           ;        TWCR= 0x00; //disable twi
 012C 2224              clr R2
 012E 26BE              out 0x36,R2
 0130                   .dbline 134
 0130           ;        TWBR= 0x20; //set bit rate
 0130 80E2              ldi R24,32
 0132 80B9              out 0x0,R24
 0134                   .dbline 135
 0134           ;        TWSR= 0x00; //set prescale
 0134 21B8              out 0x1,R2
 0136                   .dbline 136
 0136           ;        TWAR= 0x00; //set slave address
 0136 22B8              out 0x2,R2
 0138                   .dbline 137
 0138           ;        TWCR= 0x04; //enable twi
 0138 84E0              ldi R24,4
 013A 86BF              out 0x36,R24
 013C                   .dbline -2
 013C           L27:
 013C                   .dbline 0 ; func end
 013C 0895              ret
 013E                   .dbend
 013E                   .dbfunc e rd24c _rd24c fV
 013E           ;              t -> R10
 013E           ;            num -> R22,R23
 013E           ;         ad_rsc -> R12,R13
 013E           ;          p_dst -> R20,R21
                        .even
 013E           _rd24c::
 013E 0E940000          xcall push_gset4
 0142 6901              movw R12,R18
 0144 A801              movw R20,R16
 0146 6885              ldd R22,y+8
 0148 7985              ldd R23,y+9
 014A                   .dbline -1
 014A                   .dbline 140
 014A           ; }
 014A           ; void rd24c(uchar *p_dst, uint ad_rsc, uint num)
 014A           ; {   
 014A                   .dbline 141
 014A           ;       uchar t=0;
 014A AA24              clr R10
 014C                   .dbline 146
 014C           ;       #if e2prom<32
 014C           ;       t=ad_rsc>>8;
 014C           ;       t<<=1;
 014C           ;       #endif
 014C           ;       i2cstart();                                     //发送起始信号
 014C 49D0              xcall _i2cstart
 014E                   .dbline 147
 014E           ;       if(i2cwt(W_ADD_COM+t)==SLAW)//发送SLA_W, 写字节命令及器件地址
 014E 0A2D              mov R16,R10
 0150 0056              subi R16,96    ; addi 160
 0152 4CD0              xcall _i2cwt
 0154 0831              cpi R16,24
 0156 B1F4              brne L29
 0158                   .dbline 148
 0158           ;       {       
 0158                   .dbline 150
 0158           ;               #if e2prom>=32
 0158           ;               i2cwt(ad_rsc>>8);               //ad_rsc的高位,  发送要读出数据的地址
 0158 8601              movw R16,R12
 015A 012F              mov R16,R17
 015C 1127              clr R17
 015E 46D0              xcall _i2cwt
 0160                   .dbline 152
 0160           ;               #endif
 0160           ;               i2cwt(ad_rsc);                  //ad_rsc的低位
 0160 0C2D              mov R16,R12
 0162 44D0              xcall _i2cwt
 0164                   .dbline 154
 0164           ;                               
 0164           ;               i2cstart();                             //再发送起始信号
 0164 3DD0              xcall _i2cstart
 0166                   .dbline 155
 0166           ;               i2cwt(R_ADD_COM+t);             //发送SLA_R, 读命令字节及器件地址
 0166 0A2D              mov R16,R10
 0168 0F55              subi R16,95    ; addi 161
 016A 40D0              xcall _i2cwt
 016C                   .dbline 157
 016C           ;                               
 016C           ;               for(;num>0;num--)
 016C 07C0              xjmp L34
 016E           L31:
 016E                   .dbline 158
 016E                   .dbline 159
 016E 48D0              xcall _i2crd
 0170 FA01              movw R30,R20
 0172 0083              std z+0,R16
 0174                   .dbline 160
 0174 4F5F              subi R20,255  ; offset = 1
 0176 5F4F              sbci R21,255
 0178                   .dbline 161
 0178           L32:
 0178                   .dbline 157
 0178 6150              subi R22,1
 017A 7040              sbci R23,0
 017C           L34:
 017C                   .dbline 157
 017C 6030              cpi R22,0
 017E 6707              cpc R22,R23
 0180 B1F7              brne L31
 0182           X4:
 0182                   .dbline 162
 0182           ;               {  
 0182           ;                *p_dst=i2crd();                //从器件读出一个字节
 0182           ;                       p_dst++;
 0182           ;               }
 0182           ;       }
 0182 03C0              xjmp L30
 0184           L29:
 0184                   .dbline 164
 0184           ;       else 
 0184           ;       syserr=ERR_SLAW;                //写字节命令及器件地址错或对方无应答
 0184 8AE0              ldi R24,10
 0186 80930000          sts _syserr,R24
 018A           L30:
 018A                   .dbline 166
 018A           ;               
 018A           ;       i2cstop();
 018A 41D0              xcall _i2cstop
 018C                   .dbline -2
 018C           L28:
 018C 0E940000          xcall pop_gset4
 0190                   .dbline 0 ; func end
 0190 0895              ret
 0192                   .dbsym r t 10 c
 0192                   .dbsym r num 22 i
 0192                   .dbsym r ad_rsc 12 i
 0192                   .dbsym r p_dst 20 pc
 0192                   .dbend
 0192                   .dbfunc e wt24c_fc _wt24c_fc fpc
 0192           ;              t -> R12
 0192           ;              n -> R22
 0192           ;             ad -> R10,R11
 0192           ;              p -> R20,R21
                        .even
 0192           _wt24c_fc::
 0192 0E940000          xcall push_gset4
 0196 5901              movw R10,R18
 0198 A801              movw R20,R16
 019A 6885              ldd R22,y+8
 019C                   .dbline -1
 019C                   .dbline 173
 019C           ; 
 019C           ; }
 019C           ; //向24Cxx写入数据wt24c_h()所要调用的函数
 019C           ; //返回写入n个字节后的主机内存指针
 019C           ; 
 019C           ; uchar * wt24c_fc(uchar *p, uint ad, uchar n)
 019C           ; {     
 019C                   .dbline 174
 019C           ;       uchar t=0;
 019C CC24              clr R12
 019E                   .dbline 179
 019E           ;       #if e2prom<32
 019E           ;       t=ad>>8;
 019E           ;       t<<=1;
 019E           ;       #endif
 019E           ;       i2cstart();                                     //发送起始信号
 019E 20D0              xcall _i2cstart
 01A0                   .dbline 180
 01A0           ;       if(i2cwt(W_ADD_COM+t)==SLAW)//发送SLA_W, 写字节命令及器件地址
 01A0 0C2D              mov R16,R12
 01A2 0056              subi R16,96    ; addi 160
 01A4 23D0              xcall _i2cwt
 01A6 0831              cpi R16,24
 01A8 89F4              brne L36
 01AA                   .dbline 181
 01AA           ;       {       
 01AA                   .dbline 183
 01AA           ;               #if e2prom>=32
 01AA           ;               i2cwt(ad>>8);                   //ad_dst的高位到器件
 01AA 8501              movw R16,R10
 01AC 012F              mov R16,R17
 01AE 1127              clr R17
 01B0 1DD0              xcall _i2cwt
 01B2                   .dbline 185
 01B2           ;               #endif
 01B2           ;               i2cwt(ad);                              //ad_dst的低位到器件
 01B2 0A2D              mov R16,R10
 01B4 1BD0              xcall _i2cwt
 01B6                   .dbline 187
 01B6           ;                       
 01B6           ;               for(;n>0;n--)                   //发送要写入的数据
 01B6 06C0              xjmp L41
 01B8           L38:
 01B8                   .dbline 188
 01B8                   .dbline 188
 01B8 FA01              movw R30,R20
 01BA 0081              ldd R16,z+0
 01BC 17D0              xcall _i2cwt
 01BE                   .dbline 189
 01BE 4F5F              subi R20,255  ; offset = 1
 01C0 5F4F              sbci R21,255
 01C2                   .dbline 190
 01C2           L39:
 01C2                   .dbline 187
 01C2 6A95              dec R22
 01C4           L41:
 01C4                   .dbline 187
 01C4 2224              clr R2
 01C6 2616              cp R2,R22
 01C8 B8F3              brlo L38
 01CA                   .dbline 191
 01CA           ;               {   i2cwt(*p);
 01CA           ;                       p++;
 01CA           ;               }
 01CA           ;       }
 01CA 03C0              xjmp L37
 01CC           L36:
 01CC                   .dbline 192
 01CC           ;       else syserr=ERR_SLAW;           //写字节命令及器件地址错
 01CC 8AE0              ldi R24,10
 01CE 80930000          sts _syserr,R24
 01D2           L37:
 01D2                   .dbline 194
 01D2           ;       
 01D2           ;       i2cstop();
 01D2 1DD0              xcall _i2cstop
 01D4                   .dbline 195
 01D4           ;       delay_EEPROM(10);                                       //延时6ms
 01D4 0AE0              ldi R16,10
 01D6 14DF              xcall _delay_EEPROM
 01D8                   .dbline 197
 01D8           ;       
 01D8           ;       return(p);
 01D8 8A01              movw R16,R20
 01DA                   .dbline -2
 01DA           L35:
 01DA 0E940000          xcall pop_gset4
 01DE                   .dbline 0 ; func end
 01DE 0895              ret
 01E0                   .dbsym r t 12 c
 01E0                   .dbsym r n 22 c
 01E0                   .dbsym r ad 10 i
 01E0                   .dbsym r p 20 pc
 01E0                   .dbend
 01E0                   .dbfunc e i2cstart _i2cstart fV
                        .even
 01E0           _i2cstart::
 01E0                   .dbline -1
 01E0                   .dbline 206
 01E0           ; }
 01E0           ; 
 01E0           ; 
 01E0           ; 
 01E0           ; //-------------------------------以下为其它I2总线器件可调用的函数--------------------------
 01E0           ; 
 01E0           ; //总线上起动开始条件
 01E0           ; void i2cstart(void)
 01E0           ; { 
 01E0                   .dbline 207
 01E0           ;       TWCR= BIT(TWINT) | BIT(TWSTA) | BIT(TWEN); 
 01E0 84EA              ldi R24,164
 01E2 86BF              out 0x36,R24
 01E4           L43:
 01E4                   .dbline 208
 01E4           L44:
 01E4                   .dbline 208
 01E4           ;       while (!(TWCR & BIT(TWINT)));
 01E4 26B6              in R2,0x36
 01E6 27FE              sbrs R2,7
 01E8 FDCF              rjmp L43
 01EA                   .dbline -2
 01EA           L42:
 01EA                   .dbline 0 ; func end
 01EA 0895              ret
 01EC                   .dbend
 01EC                   .dbfunc e i2cwt _i2cwt fc
 01EC           ;              a -> R16
                        .even
 01EC           _i2cwt::
 01EC                   .dbline -1
 01EC                   .dbline 213
 01EC           ; } 
 01EC           ; 
 01EC           ; //把一个字节数据输入器件, 返回TWI状态
 01EC           ; uchar i2cwt(uchar a)
 01EC           ; { 
 01EC                   .dbline 214
 01EC           ;       TWDR = a; 
 01EC 03B9              out 0x3,R16
 01EE                   .dbline 215
 01EE           ;       TWCR = BIT(TWINT) | BIT(TWEN); 
 01EE 84E8              ldi R24,132
 01F0 86BF              out 0x36,R24
 01F2           L47:
 01F2                   .dbline 216
 01F2           L48:
 01F2                   .dbline 216
 01F2           ;       while (!(TWCR & BIT(TWINT)));
 01F2 26B6              in R2,0x36
 01F4 27FE              sbrs R2,7
 01F6 FDCF              rjmp L47
 01F8                   .dbline 217
 01F8           ;       _NOP();
 01F8 0000              nop
 01FA                   .dbline 218
 01FA           ;       return(TWSR&0b11111000);
 01FA 01B1              in R16,0x1
 01FC 087F              andi R16,248
 01FE                   .dbline -2
 01FE           L46:
 01FE                   .dbline 0 ; func end
 01FE 0895              ret
 0200                   .dbsym r a 16 c
 0200                   .dbend
 0200                   .dbfunc e i2crd _i2crd fc
                        .even
 0200           _i2crd::
 0200                   .dbline -1
 0200                   .dbline 224
 0200           ; } 
 0200           ; 
 0200           ; //i2c读要调用的函数
 0200           ; //从器件读出一个字节
 0200           ; uchar i2crd(void)
 0200           ; {
 0200                   .dbline 225
 0200           ;       TWCR= BIT(TWINT) | BIT(TWEA) | BIT(TWEN); 
 0200 84EC              ldi R24,196
 0202 86BF              out 0x36,R24
 0204           L51:
 0204                   .dbline 226
 0204           L52:
 0204                   .dbline 226
 0204           ;       while (!(TWCR & BIT(TWINT)));
 0204 26B6              in R2,0x36
 0206 27FE              sbrs R2,7
 0208 FDCF              rjmp L51
 020A                   .dbline 227
 020A           ;       return(TWDR);
 020A 03B1              in R16,0x3
 020C                   .dbline -2
 020C           L50:
 020C                   .dbline 0 ; func end
 020C 0895              ret
 020E                   .dbend
 020E                   .dbfunc e i2cstop _i2cstop fV
                        .even
 020E           _i2cstop::
 020E                   .dbline -1
 020E                   .dbline 234
 020E           ;       
 020E           ; } 
 020E           ; 
 020E           ; 
 020E           ; //总线上起动停止条件 
 020E           ; void i2cstop(void) 
 020E           ; { 
 020E                   .dbline 235
 020E           ;    TWCR = BIT(TWINT) | BIT(TWSTO) | BIT(TWEN); 
 020E 84E9              ldi R24,148
 0210 86BF              out 0x36,R24
 0212                   .dbline -2
 0212           L54:
 0212                   .dbline 0 ; func end
 0212 0895              ret
 0214                   .dbend
                        .area bss(ram, con, rel)
 0000                   .dbfile E:\学习专区\AVR专区\个人创作区\AVR单片机开发平台\EEPROM读写演示程序\24Cxx.C
 0000           _syserr::
 0000                   .blkb 1
 0001                   .dbsym e syserr _syserr c

⌨️ 快捷键说明

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