📄 twi.lis
字号:
.module twi.c
.area text(rom, con, rel)
0000 .dbfile E:\ICCAVR\project\AVRMEG~2\icc\013-IIC-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 "iom16v.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 D1F0 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 15C0 xjmp L2
0028 L10:
0028 4833 cpi R20,56
002A E0E0 ldi R30,0
002C 5E07 cpc R21,R30
002E 89F0 breq L3
0030 4833 cpi R20,56
0032 E0E0 ldi R30,0
0034 5E07 cpc R21,R30
0036 6CF0 brlt L2
0038 L11:
0038 4834 cpi R20,72
003A E0E0 ldi R30,0
003C 5E07 cpc R21,R30
003E 39F0 breq L8
0040 08C0 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 86BF out 0x36,R24
0046 .dbline 24
0046 ; break;
0046 05C0 xjmp L3
0048 L6:
0048 .dbline 27
0048 ; case 0x30: /*数据写失败*/
0048 ; /*stop 停止*/
0048 ; TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
0048 84E9 ldi R24,148
004A 86BF out 0x36,R24
004C .dbline 28
004C ; break;
004C 02C0 xjmp L3
004E X1:
004E .dbline 30
004E ; case 0x38: /*仲裁失败*/
004E ; break;
004E L8:
004E .dbline 33
004E ; case 0x48: /*址址读失败*/
004E ; /*stop 停止*/
004E ; TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
004E 84E9 ldi R24,148
0050 86BF out 0x36,R24
0052 .dbline 34
0052 ; break;
0052 L2:
0052 L3:
0052 .dbline -2
0052 L1:
0052 0E940000 xcall pop_gset1
0056 .dbline 0 ; func end
0056 0895 ret
0058 .dbsym r type 16 c
0058 .dbend
0058 .dbfunc e twi_write _twi_write fc
0058 ; dd -> R20
0058 ; addr -> R22
.even
0058 _twi_write::
0058 0E940000 xcall push_gset2
005C 422F mov R20,R18
005E 602F mov R22,R16
0060 .dbline -1
0060 .dbline 39
0060 ; }
0060 ; }
0060 ;
0060 ; /*I2C总线单字节写入*/
0060 ; unsigned char twi_write(unsigned char addr, unsigned char dd) {
0060 .dbline 41
0060 ;
0060 ; TWBR = 2;
0060 82E0 ldi R24,2
0062 80B9 out 0x0,R24
0064 .dbline 44
0064 ;
0064 ; /*start 启动*/
0064 ; TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);
0064 84EA ldi R24,164
0066 86BF out 0x36,R24
0068 L13:
0068 .dbline 45
0068 L14:
0068 .dbline 45
0068 ; while (!(TWCR & (1 << TWINT)));
0068 26B6 in R2,0x36
006A 27FE sbrs R2,7
006C FDCF rjmp L13
006E .dbline 46
006E ; if ((TWSR & 0xF8) != 0x08) {
006E 81B1 in R24,0x1
0070 887F andi R24,248
0072 8830 cpi R24,8
0074 21F0 breq L16
0076 .dbline 46
0076 .dbline 47
0076 ; error(TWSR);
0076 01B1 in R16,0x1
0078 C3DF xcall _error
007A .dbline 48
007A ; return 0;
007A 0027 clr R16
007C 2EC0 xjmp L12
007E L16:
007E .dbline 52
007E ; }
007E ;
007E ; /*SLA_W 芯片地址*/
007E ; TWDR = 0xA0;
007E 80EA ldi R24,160
0080 83B9 out 0x3,R24
0082 .dbline 53
0082 ; TWCR = (1 << TWINT) | (1 << TWEN);
0082 84E8 ldi R24,132
0084 86BF out 0x36,R24
0086 L18:
0086 .dbline 54
0086 L19:
0086 .dbline 54
0086 ; while (!(TWCR & (1 << TWINT)));
0086 26B6 in R2,0x36
0088 27FE sbrs R2,7
008A FDCF rjmp L18
008C .dbline 55
008C ; if ((TWSR & 0xF8) != 0x18) {
008C 81B1 in R24,0x1
008E 887F andi R24,248
0090 8831 cpi R24,24
0092 21F0 breq L21
0094 .dbline 55
0094 .dbline 56
0094 ; error(TWSR);
0094 01B1 in R16,0x1
0096 B4DF xcall _error
0098 .dbline 57
0098 ; return 0;
0098 0027 clr R16
009A 1FC0 xjmp L12
009C L21:
009C .dbline 61
009C ; }
009C ;
009C ; /*addr 操作地址*/
009C ; TWDR = addr;
009C 63B9 out 0x3,R22
009E .dbline 62
009E ; TWCR = (1 << TWINT) | (1 << TWEN);
009E 84E8 ldi R24,132
00A0 86BF out 0x36,R24
00A2 L23:
00A2 .dbline 63
00A2 L24:
00A2 .dbline 63
00A2 ; while (!(TWCR & (1 << TWINT)));
00A2 26B6 in R2,0x36
00A4 27FE sbrs R2,7
00A6 FDCF rjmp L23
00A8 .dbline 64
00A8 ; if ((TWSR & 0xF8) != 0x28) {
00A8 81B1 in R24,0x1
00AA 887F andi R24,248
00AC 8832 cpi R24,40
00AE 21F0 breq L26
00B0 .dbline 64
00B0 .dbline 65
00B0 ; error(TWSR);
00B0 01B1 in R16,0x1
00B2 A6DF xcall _error
00B4 .dbline 66
00B4 ; return 0;
00B4 0027 clr R16
00B6 11C0 xjmp L12
00B8 L26:
00B8 .dbline 70
00B8 ; }
00B8 ;
00B8 ; /*dd 写入数据*/
00B8 ; TWDR = dd;
00B8 43B9 out 0x3,R20
00BA .dbline 71
00BA ; TWCR = (1 << TWINT) | (1 << TWEN);
00BA 84E8 ldi R24,132
00BC 86BF out 0x36,R24
00BE L28:
00BE .dbline 72
00BE L29:
00BE .dbline 72
00BE ; while (!(TWCR & (1 << TWINT)));
00BE 26B6 in R2,0x36
00C0 27FE sbrs R2,7
00C2 FDCF rjmp L28
00C4 .dbline 73
00C4 ; if ((TWSR & 0xF8) != 0x28) {
00C4 81B1 in R24,0x1
00C6 887F andi R24,248
00C8 8832 cpi R24,40
00CA 21F0 breq L31
00CC .dbline 73
00CC .dbline 74
00CC ; error(TWSR);
00CC 01B1 in R16,0x1
00CE 98DF xcall _error
00D0 .dbline 75
00D0 ; return 0;
00D0 0027 clr R16
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -