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

📄 twi.lis

📁 avr单片机atmage16驱动小灯的一些例程 并且包括一些收发数据的程序利用usb口
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .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 + -