📄 twi.lis
字号:
.module twi.c
.area text(rom, con, rel)
0000 .dbfile E:\ICCAVR\project\AVRMEG~3\icc\014-24C02-LED\twi.c
0000 .dbfunc e error _error fV
0000 ; type -> R16
.even
0000 _error::
0000 0E940000 xcall push_gset1
0004 .dbline -1
0004 .dbline 18
0004 ; /*
0004 ; I2C总线/TWI操作模块
0004 ; 1、读取和写入函数
0004 ; 2、地址有效范围255
0004 ; 3、数据长度为单字节
0004 ; 4、函数采用查询方式
0004 ; 5、可直接嵌入到项目中使用
0004 ; 6、晶振频率:1M
0004 ; 7、总线速度:50K
0004 ;
0004 ; AVR_AFA
0004 ; www.iccavr.com
0004 ; */
0004 ;
0004 ; #include "iom128v.h"
0004 ;
0004 ; /*I2C总线主机模式错误处理*/
0004 ; void error(unsigned char type) {
0004 .dbline 20
0004 ;
0004 ; switch (type & 0xF8) {
0004 402F mov R20,R16
0006 5527 clr R21
0008 487F andi R20,248
000A 5070 andi R21,0
000C 4033 cpi R20,48
000E E0E0 ldi R30,0
0010 5E07 cpc R21,R30
0012 D9F0 breq L6
0014 80E3 ldi R24,48
0016 90E0 ldi R25,0
0018 8417 cp R24,R20
001A 9507 cpc R25,R21
001C 2CF0 brlt L10
001E L9:
001E 4032 cpi R20,32
0020 E0E0 ldi R30,0
0022 5E07 cpc R21,R30
0024 71F0 breq L5
0026 18C0 xjmp L2
0028 L10:
0028 4833 cpi R20,56
002A E0E0 ldi R30,0
002C 5E07 cpc R21,R30
002E A1F0 breq L3
0030 4833 cpi R20,56
0032 E0E0 ldi R30,0
0034 5E07 cpc R21,R30
0036 84F0 brlt L2
0038 L11:
0038 4834 cpi R20,72
003A E0E0 ldi R30,0
003C 5E07 cpc R21,R30
003E 49F0 breq L8
0040 0BC0 xjmp L2
0042 X0:
0042 .dbline 20
0042 L5:
0042 .dbline 23
0042 ; case 0x20: /*址址写失败*/
0042 ; /*stop 停止*/
0042 ; TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
0042 84E9 ldi R24,148
0044 80937400 sts 116,R24
0048 .dbline 24
0048 ; break;
0048 07C0 xjmp L3
004A L6:
004A .dbline 27
004A ; case 0x30: /*数据写失败*/
004A ; /*stop 停止*/
004A ; TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
004A 84E9 ldi R24,148
004C 80937400 sts 116,R24
0050 .dbline 28
0050 ; break;
0050 03C0 xjmp L3
0052 X1:
0052 .dbline 30
0052 ; case 0x38: /*仲裁失败*/
0052 ; break;
0052 L8:
0052 .dbline 33
0052 ; case 0x48: /*址址读失败*/
0052 ; /*stop 停止*/
0052 ; TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
0052 84E9 ldi R24,148
0054 80937400 sts 116,R24
0058 .dbline 34
0058 ; break;
0058 L2:
0058 L3:
0058 .dbline -2
0058 L1:
0058 0E940000 xcall pop_gset1
005C .dbline 0 ; func end
005C 0895 ret
005E .dbsym r type 16 c
005E .dbend
005E .dbfunc e twi_write _twi_write fc
005E ; dd -> R20
005E ; addr -> R22
.even
005E _twi_write::
005E 0E940000 xcall push_gset2
0062 422F mov R20,R18
0064 602F mov R22,R16
0066 .dbline -1
0066 .dbline 39
0066 ; }
0066 ; }
0066 ;
0066 ; /*I2C总线单字节写入*/
0066 ; unsigned char twi_write(unsigned char addr, unsigned char dd) {
0066 .dbline 41
0066 ;
0066 ; TWBR = 2;
0066 82E0 ldi R24,2
0068 80937000 sts 112,R24
006C .dbline 44
006C ;
006C ; /*start 启动*/
006C ; TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);
006C 84EA ldi R24,164
006E 80937400 sts 116,R24
0072 L13:
0072 .dbline 45
0072 L14:
0072 .dbline 45
0072 ; while (!(TWCR & (1 << TWINT)));
0072 20907400 lds R2,116
0076 27FE sbrs R2,7
0078 FCCF rjmp L13
007A .dbline 46
007A ; if ((TWSR & 0xF8) != 0x08) {
007A 80917100 lds R24,113
007E 887F andi R24,248
0080 8830 cpi R24,8
0082 29F0 breq L16
0084 .dbline 46
0084 .dbline 47
0084 ; error(TWSR);
0084 00917100 lds R16,113
0088 BBDF xcall _error
008A .dbline 48
008A ; return 0;
008A 0027 clr R16
008C 3EC0 xjmp L12
008E L16:
008E .dbline 52
008E ; }
008E ;
008E ; /*SLA_W 芯片地址*/
008E ; TWDR = 0xA0;
008E 80EA ldi R24,160
0090 80937300 sts 115,R24
0094 .dbline 53
0094 ; TWCR = (1 << TWINT) | (1 << TWEN);
0094 84E8 ldi R24,132
0096 80937400 sts 116,R24
009A L18:
009A .dbline 54
009A L19:
009A .dbline 54
009A ; while (!(TWCR & (1 << TWINT)));
009A 20907400 lds R2,116
009E 27FE sbrs R2,7
00A0 FCCF rjmp L18
00A2 .dbline 55
00A2 ; if ((TWSR & 0xF8) != 0x18) {
00A2 80917100 lds R24,113
00A6 887F andi R24,248
00A8 8831 cpi R24,24
00AA 29F0 breq L21
00AC .dbline 55
00AC .dbline 56
00AC ; error(TWSR);
00AC 00917100 lds R16,113
00B0 A7DF xcall _error
00B2 .dbline 57
00B2 ; return 0;
00B2 0027 clr R16
00B4 2AC0 xjmp L12
00B6 L21:
00B6 .dbline 61
00B6 ; }
00B6 ;
00B6 ; /*addr 操作地址*/
00B6 ; TWDR = addr;
00B6 60937300 sts 115,R22
00BA .dbline 62
00BA ; TWCR = (1 << TWINT) | (1 << TWEN);
00BA 84E8 ldi R24,132
00BC 80937400 sts 116,R24
00C0 L23:
00C0 .dbline 63
00C0 L24:
00C0 .dbline 63
00C0 ; while (!(TWCR & (1 << TWINT)));
00C0 20907400 lds R2,116
00C4 27FE sbrs R2,7
00C6 FCCF rjmp L23
00C8 .dbline 64
00C8 ; if ((TWSR & 0xF8) != 0x28) {
00C8 80917100 lds R24,113
00CC 887F andi R24,248
00CE 8832 cpi R24,40
00D0 29F0 breq L26
00D2 .dbline 64
00D2 .dbline 65
00D2 ; error(TWSR);
00D2 00917100 lds R16,113
00D6 94DF xcall _error
00D8 .dbline 66
00D8 ; return 0;
00D8 0027 clr R16
00DA 17C0 xjmp L12
00DC L26:
00DC .dbline 70
00DC ; }
00DC ;
00DC ; /*dd 写入数据*/
00DC ; TWDR = dd;
00DC 40937300 sts 115,R20
00E0 .dbline 71
00E0 ; TWCR = (1 << TWINT) | (1 << TWEN);
00E0 84E8 ldi R24,132
00E2 80937400 sts 116,R24
00E6 L28:
00E6 .dbline 72
00E6 L29:
00E6 .dbline 72
00E6 ; while (!(TWCR & (1 << TWINT)));
00E6 20907400 lds R2,116
00EA 27FE sbrs R2,7
00EC FCCF rjmp L28
00EE .dbline 73
00EE ; if ((TWSR & 0xF8) != 0x28) {
00EE 80917100 lds R24,113
00F2 887F andi R24,248
00F4 8832 cpi R24,40
00F6 29F0 breq L31
00F8 .dbline 73
00F8 .dbline 74
00F8 ; error(TWSR);
00F8 00917100 lds R16,113
00FC 81DF xcall _error
00FE .dbline 75
00FE ; return 0;
00FE 0027 clr R16
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -