📄 hard_i2c.s
字号:
sbi 0x12,6
.dbline 180
.dbline 181
; DISP_DATA[3]=i2c_Read(0x02);
ldi R16,2
xcall _i2c_Read
sts _DISP_DATA+3,R16
.dbline 183
;
; for(;;)
L23:
.dbline 184
.dbline 186
.dbline 183
.dbline 183
xjmp L23
X2:
.dbline -2
L21:
.dbline 0 ; func end
ret
.dbend
.dbfunc e I2C_Ini _I2C_Ini fV
.even
_I2C_Ini::
.dbline -1
.dbline 193
; {
;
; }
; }
;
;
; //=======================================================================
; //初始化端口
; void I2C_Ini(void)
; {
.dbline 194
; i2c_ddr|=(1<<SCL); //SCK为输出
sbi 0x14,0
.dbline 195
; i2c_ddr|=(1<<SDA); //SDA为双向的,先设置为输出
sbi 0x14,1
.dbline -2
L27:
.dbline 0 ; func end
ret
.dbend
.dbfunc e i2c_Write _i2c_Write fc
; number -> R20
; Wdata -> R22
; RomAddress -> R10
.even
_i2c_Write::
xcall push_gset3
mov R22,R18
mov R10,R16
.dbline -1
.dbline 206
;
;
; }
;
; /******************************************
; I2C总线写一个字节
; 返回1:写成功
; 返回非1:写失败
; *******************************************/
; unsigned char i2c_Write(unsigned char RomAddress,unsigned char Wdata)
; {unsigned char number=10;
.dbline 206
ldi R20,10
xjmp L30
L29:
.dbline 208
; while(number--)
; {
.dbline 209
; Start();//I2C启动
ldi R24,164
out 0x36,R24
.dbline 210
L32:
.dbline 210
L33:
.dbline 210
; Wait();
in R2,0x36
sbrs R2,7
rjmp L32
.dbline 210
.dbline 210
.dbline 211
; if(TestAck()!=START) continue;//ACK
in R24,0x1
andi R24,248
cpi R24,8
breq L35
.dbline 211
xjmp L30
L35:
.dbline 212
; Write8Bit(wr_device_add);//写I2C从器件地址和写方式
.dbline 212
ldi R24,160
out 0x3,R24
.dbline 212
ldi R24,132
out 0x36,R24
.dbline 212
.dbline 212
.dbline 213
L37:
.dbline 213
L38:
.dbline 213
; Wait();
in R2,0x36
sbrs R2,7
rjmp L37
.dbline 213
.dbline 213
.dbline 215
;
; if(TestAck()!=MT_SLA_ACK)
in R24,0x1
andi R24,248
cpi R24,24
breq L40
.dbline 216
; {putchar(0);
.dbline 216
clr R16
clr R17
xcall _putchar
.dbline 217
; continue;//ACK
xjmp L30
L40:
.dbline 219
; }
; Write8Bit(RomAddress);//写24C02的ROM地址
.dbline 219
out 0x3,R10
.dbline 219
ldi R24,132
out 0x36,R24
.dbline 219
.dbline 219
.dbline 220
L42:
.dbline 220
L43:
.dbline 220
; Wait();
in R2,0x36
sbrs R2,7
rjmp L42
.dbline 220
.dbline 220
.dbline 221
; if(TestAck()!=MT_DATA_ACK) continue;//ACK
in R24,0x1
andi R24,248
cpi R24,40
breq L45
.dbline 221
xjmp L30
L45:
.dbline 222
; Write8Bit(Wdata);//写数据到24C02的ROM
.dbline 222
out 0x3,R22
.dbline 222
ldi R24,132
out 0x36,R24
.dbline 222
.dbline 222
.dbline 223
L47:
.dbline 223
L48:
.dbline 223
in R2,0x36
sbrs R2,7
rjmp L47
.dbline 223
.dbline 223
.dbline 224
in R24,0x1
andi R24,248
cpi R24,40
breq L31
.dbline 224
.dbline 225
L30:
.dbline 207
mov R2,R20
clr R3
subi R20,1
tst R2
brne L29
L31:
.dbline 227
; Wait();
; if(TestAck()!=MT_DATA_ACK) continue;//ACK
; break;
; }
; Stop();//I2C停止
ldi R24,148
out 0x36,R24
.dbline 228
; Delay_ms(10);//延时10ms等EEPROM写完
ldi R16,10
ldi R17,0
xcall _Delay_ms
.dbline 229
; return 1;
ldi R16,1
.dbline -2
L28:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r number 20 c
.dbsym r Wdata 22 c
.dbsym r RomAddress 10 c
.dbend
.dbfunc e i2c_Read _i2c_Read fc
; number -> R22
; temp -> R20
; a -> R10
; RomAddress -> R16
.even
_i2c_Read::
xcall push_gset3
.dbline -1
.dbline 236
; }
; /******************************************
; I2C总线读一个字节
;
; *******************************************/
; unsigned char i2c_Read(unsigned char RomAddress)
; {char a=0x00;
.dbline 236
clr R10
.dbline 237
; unsigned char temp=0;
clr R20
.dbline 238
; unsigned char number=10;
ldi R22,10
xjmp L54
L53:
.dbline 241
;
; while(number--)
; {
.dbline 242
; Start();//I2C启动
ldi R24,164
out 0x36,R24
.dbline 243
L56:
.dbline 243
L57:
.dbline 243
; Wait();
in R2,0x36
sbrs R2,7
rjmp L56
.dbline 243
.dbline 243
.dbline 244
; a=TestAck();
in R24,0x1
andi R24,248
mov R10,R24
.dbline 246
;
; if (a!=START) continue;//ACK
cpi R24,8
breq L59
.dbline 246
xjmp L54
L59:
.dbline 248
;
; Write8Bit(wr_device_add);//写I2C从器件地址和写方式
.dbline 248
ldi R24,160
out 0x3,R24
.dbline 248
ldi R24,132
out 0x36,R24
.dbline 248
.dbline 248
.dbline 249
L61:
.dbline 249
L62:
.dbline 249
; Wait();
in R2,0x36
sbrs R2,7
rjmp L61
.dbline 249
.dbline 249
.dbline 251
;
; if (TestAck()!=MT_SLA_ACK) continue;//ACK
in R24,0x1
andi R24,248
cpi R24,24
breq L64
.dbline 251
xjmp L54
L64:
.dbline 254
;
;
; Write8Bit(RomAddress);//写STA013的ROM地址
.dbline 254
out 0x3,R16
.dbline 254
ldi R24,132
out 0x36,R24
.dbline 254
.dbline 254
.dbline 255
L66:
.dbline 255
L67:
.dbline 255
; Wait();
in R2,0x36
sbrs R2,7
rjmp L66
.dbline 255
.dbline 255
.dbline 257
;
; if (TestAck()!=MT_DATA_ACK) continue;
in R24,0x1
andi R24,248
cpi R24,40
breq L69
.dbline 257
xjmp L54
L69:
.dbline 258
; Start();//I2C重新启动
ldi R24,164
out 0x36,R24
.dbline 259
L71:
.dbline 259
L72:
.dbline 259
; Wait();
in R2,0x36
sbrs R2,7
rjmp L71
.dbline 259
.dbline 259
.dbline 260
; if (TestAck()!=RE_START) continue;
in R24,0x1
andi R24,248
cpi R24,16
breq L74
.dbline 260
xjmp L54
L74:
.dbline 262
;
; Write8Bit(rd_device_add);//写I2C从器件地址和读方式
.dbline 262
ldi R24,161
out 0x3,R24
.dbline 262
ldi R24,132
out 0x36,R24
.dbline 262
.dbline 262
.dbline 263
L76:
.dbline 263
L77:
.dbline 263
; Wait();
in R2,0x36
sbrs R2,7
rjmp L76
.dbline 263
.dbline 263
.dbline 265
;
; if(TestAck()!=MR_SLA_ACK) continue;//ACK
in R24,0x1
andi R24,248
cpi R24,64
breq L79
.dbline 265
xjmp L54
L79:
.dbline 266
; Twi();//启动主I2C读方式
ldi R24,132
out 0x36,R24
.dbline 268
L81:
.dbline 268
L82:
.dbline 268
;
; Wait();
in R2,0x36
sbrs R2,7
rjmp L81
.dbline 268
.dbline 268
.dbline 270
;
; if(TestAck()!=MR_DATA_NOACK) continue;//ACK
in R24,0x1
andi R24,248
cpi R24,88
breq L84
.dbline 270
xjmp L54
L84:
.dbline 271
in R20,0x3
.dbline 273
xjmp L55
L54:
.dbline 240
mov R2,R22
clr R3
subi R22,1
tst R2
breq X3
xjmp L53
X3:
L55:
.dbline 275
; temp=TWDR;//读取I2C接收数据
;
; break;
; }
; Stop();//I2C停止
ldi R24,148
out 0x36,R24
.dbline 277
;
; return temp;
mov R16,R20
.dbline -2
L52:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r number 22 c
.dbsym r temp 20 c
.dbsym r a 10 c
.dbsym r RomAddress 16 c
.dbend
.area bss(ram, con, rel)
.dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16例程\HARD_I~1\Hard_I2C.c
_DISP_NUM::
.blkb 1
.dbsym e DISP_NUM _DISP_NUM c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -