📄 hard_i2c.lis
字号:
0166 .dbline 220
0166 .dbline 221
0166 ; if(TestAck()!=MT_DATA_ACK) continue;//ACK
0166 81B1 in R24,0x1
0168 887F andi R24,248
016A 8832 cpi R24,40
016C 09F0 breq L45
016E .dbline 221
016E 0AC0 xjmp L30
0170 L45:
0170 .dbline 222
0170 ; Write8Bit(Wdata);//写数据到24C02的ROM
0170 .dbline 222
0170 63B9 out 0x3,R22
0172 .dbline 222
0172 84E8 ldi R24,132
0174 86BF out 0x36,R24
0176 .dbline 222
0176 .dbline 222
0176 .dbline 223
0176 L47:
0176 .dbline 223
0176 L48:
0176 .dbline 223
0176 26B6 in R2,0x36
0178 27FE sbrs R2,7
017A FDCF rjmp L47
017C .dbline 223
017C .dbline 223
017C .dbline 224
017C 81B1 in R24,0x1
017E 887F andi R24,248
0180 8832 cpi R24,40
0182 29F0 breq L31
0184 .dbline 224
0184 .dbline 225
0184 L30:
0184 .dbline 207
0184 242E mov R2,R20
0186 3324 clr R3
0188 4150 subi R20,1
018A 2220 tst R2
018C 61F6 brne L29
018E L31:
018E .dbline 227
018E ; Wait();
018E ; if(TestAck()!=MT_DATA_ACK) continue;//ACK
018E ; break;
018E ; }
018E ; Stop();//I2C停止
018E 84E9 ldi R24,148
0190 86BF out 0x36,R24
0192 .dbline 228
0192 ; Delay_ms(10);//延时10ms等EEPROM写完
0192 0AE0 ldi R16,10
0194 10E0 ldi R17,0
0196 3CDF xcall _Delay_ms
0198 .dbline 229
0198 ; return 1;
0198 01E0 ldi R16,1
019A .dbline -2
019A L28:
019A 0E940000 xcall pop_gset3
019E .dbline 0 ; func end
019E 0895 ret
01A0 .dbsym r number 20 c
01A0 .dbsym r Wdata 22 c
01A0 .dbsym r RomAddress 10 c
01A0 .dbend
01A0 .dbfunc e i2c_Read _i2c_Read fc
01A0 ; number -> R22
01A0 ; temp -> R20
01A0 ; a -> R10
01A0 ; RomAddress -> R16
.even
01A0 _i2c_Read::
01A0 0E940000 xcall push_gset3
01A4 .dbline -1
01A4 .dbline 236
01A4 ; }
01A4 ; /******************************************
01A4 ; I2C总线读一个字节
01A4 ;
01A4 ; *******************************************/
01A4 ; unsigned char i2c_Read(unsigned char RomAddress)
01A4 ; {char a=0x00;
01A4 .dbline 236
01A4 AA24 clr R10
01A6 .dbline 237
01A6 ; unsigned char temp=0;
01A6 4427 clr R20
01A8 .dbline 238
01A8 ; unsigned char number=10;
01A8 6AE0 ldi R22,10
01AA 44C0 xjmp L54
01AC L53:
01AC .dbline 241
01AC ;
01AC ; while(number--)
01AC ; {
01AC .dbline 242
01AC ; Start();//I2C启动
01AC 84EA ldi R24,164
01AE 86BF out 0x36,R24
01B0 .dbline 243
01B0 L56:
01B0 .dbline 243
01B0 L57:
01B0 .dbline 243
01B0 ; Wait();
01B0 26B6 in R2,0x36
01B2 27FE sbrs R2,7
01B4 FDCF rjmp L56
01B6 .dbline 243
01B6 .dbline 243
01B6 .dbline 244
01B6 ; a=TestAck();
01B6 81B1 in R24,0x1
01B8 887F andi R24,248
01BA A82E mov R10,R24
01BC .dbline 246
01BC ;
01BC ; if (a!=START) continue;//ACK
01BC 8830 cpi R24,8
01BE 09F0 breq L59
01C0 .dbline 246
01C0 39C0 xjmp L54
01C2 L59:
01C2 .dbline 248
01C2 ;
01C2 ; Write8Bit(wr_device_add);//写I2C从器件地址和写方式
01C2 .dbline 248
01C2 80EA ldi R24,160
01C4 83B9 out 0x3,R24
01C6 .dbline 248
01C6 84E8 ldi R24,132
01C8 86BF out 0x36,R24
01CA .dbline 248
01CA .dbline 248
01CA .dbline 249
01CA L61:
01CA .dbline 249
01CA L62:
01CA .dbline 249
01CA ; Wait();
01CA 26B6 in R2,0x36
01CC 27FE sbrs R2,7
01CE FDCF rjmp L61
01D0 .dbline 249
01D0 .dbline 249
01D0 .dbline 251
01D0 ;
01D0 ; if (TestAck()!=MT_SLA_ACK) continue;//ACK
01D0 81B1 in R24,0x1
01D2 887F andi R24,248
01D4 8831 cpi R24,24
01D6 09F0 breq L64
01D8 .dbline 251
01D8 2DC0 xjmp L54
01DA L64:
01DA .dbline 254
01DA ;
01DA ;
01DA ; Write8Bit(RomAddress);//写STA013的ROM地址
01DA .dbline 254
01DA 03B9 out 0x3,R16
01DC .dbline 254
01DC 84E8 ldi R24,132
01DE 86BF out 0x36,R24
01E0 .dbline 254
01E0 .dbline 254
01E0 .dbline 255
01E0 L66:
01E0 .dbline 255
01E0 L67:
01E0 .dbline 255
01E0 ; Wait();
01E0 26B6 in R2,0x36
01E2 27FE sbrs R2,7
01E4 FDCF rjmp L66
01E6 .dbline 255
01E6 .dbline 255
01E6 .dbline 257
01E6 ;
01E6 ; if (TestAck()!=MT_DATA_ACK) continue;
01E6 81B1 in R24,0x1
01E8 887F andi R24,248
01EA 8832 cpi R24,40
01EC 09F0 breq L69
01EE .dbline 257
01EE 22C0 xjmp L54
01F0 L69:
01F0 .dbline 258
01F0 ; Start();//I2C重新启动
01F0 84EA ldi R24,164
01F2 86BF out 0x36,R24
01F4 .dbline 259
01F4 L71:
01F4 .dbline 259
01F4 L72:
01F4 .dbline 259
01F4 ; Wait();
01F4 26B6 in R2,0x36
01F6 27FE sbrs R2,7
01F8 FDCF rjmp L71
01FA .dbline 259
01FA .dbline 259
01FA .dbline 260
01FA ; if (TestAck()!=RE_START) continue;
01FA 81B1 in R24,0x1
01FC 887F andi R24,248
01FE 8031 cpi R24,16
0200 09F0 breq L74
0202 .dbline 260
0202 18C0 xjmp L54
0204 L74:
0204 .dbline 262
0204 ;
0204 ; Write8Bit(rd_device_add);//写I2C从器件地址和读方式
0204 .dbline 262
0204 81EA ldi R24,161
0206 83B9 out 0x3,R24
0208 .dbline 262
0208 84E8 ldi R24,132
020A 86BF out 0x36,R24
020C .dbline 262
020C .dbline 262
020C .dbline 263
020C L76:
020C .dbline 263
020C L77:
020C .dbline 263
020C ; Wait();
020C 26B6 in R2,0x36
020E 27FE sbrs R2,7
0210 FDCF rjmp L76
0212 .dbline 263
0212 .dbline 263
0212 .dbline 265
0212 ;
0212 ; if(TestAck()!=MR_SLA_ACK) continue;//ACK
0212 81B1 in R24,0x1
0214 887F andi R24,248
0216 8034 cpi R24,64
0218 09F0 breq L79
021A .dbline 265
021A 0CC0 xjmp L54
021C L79:
021C .dbline 266
021C ; Twi();//启动主I2C读方式
021C 84E8 ldi R24,132
021E 86BF out 0x36,R24
0220 .dbline 268
0220 L81:
0220 .dbline 268
0220 L82:
0220 .dbline 268
0220 ;
0220 ; Wait();
0220 26B6 in R2,0x36
0222 27FE sbrs R2,7
0224 FDCF rjmp L81
0226 .dbline 268
0226 .dbline 268
0226 .dbline 270
0226 ;
0226 ; if(TestAck()!=MR_DATA_NOACK) continue;//ACK
0226 81B1 in R24,0x1
0228 887F andi R24,248
022A 8835 cpi R24,88
022C 09F0 breq L84
022E .dbline 270
022E 02C0 xjmp L54
0230 L84:
0230 .dbline 271
0230 43B1 in R20,0x3
0232 .dbline 273
0232 06C0 xjmp L55
0234 L54:
0234 .dbline 240
0234 262E mov R2,R22
0236 3324 clr R3
0238 6150 subi R22,1
023A 2220 tst R2
023C 09F0 breq X3
023E B6CF xjmp L53
0240 X3:
0240 L55:
0240 .dbline 275
0240 ; temp=TWDR;//读取I2C接收数据
0240 ;
0240 ; break;
0240 ; }
0240 ; Stop();//I2C停止
0240 84E9 ldi R24,148
0242 86BF out 0x36,R24
0244 .dbline 277
0244 ;
0244 ; return temp;
0244 042F mov R16,R20
0246 .dbline -2
0246 L52:
0246 0E940000 xcall pop_gset3
024A .dbline 0 ; func end
024A 0895 ret
024C .dbsym r number 22 c
024C .dbsym r temp 20 c
024C .dbsym r a 10 c
024C .dbsym r RomAddress 16 c
024C .dbend
.area bss(ram, con, rel)
0000 .dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16例程\HARD_I~1\Hard_I2C.c
0000 _DISP_NUM::
0000 .blkb 1
0001 .dbsym e DISP_NUM _DISP_NUM c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -