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

📄 twi.lis

📁 用AVR单片机做的一些程序,包括跑马灯显示,PWM产生,ADC转换等
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .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 + -