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

📄 slaver_1.lis

📁 ICCavr编写的TWI总线协议读写函数
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .module slaver_1.c
                        .area data(ram, con, rel)
 0000           _Date::
 0000                   .blkb 2
                        .area idata
 0000 0000              .byte 0,0
                        .area data(ram, con, rel)
 0002                   .blkb 2
                        .area idata
 0002 0000              .byte 0,0
                        .area data(ram, con, rel)
 0004                   .dbfile D:\AVR\代码\ICCdaima\TWI/UART.h
 0004                   .dbsym e Date _Date A[4:4]c
                        .area text(rom, con, rel)
 0000                   .dbfile D:\AVR\代码\ICCdaima\TWI/UART.h
 0000                   .dbfile D:\AVR\代码\ICCdaima\TWI\slaver_1.c
 0000                   .dbfunc e Start _Start fV
                        .even
 0000           _Start::
 0000                   .dbline -1
 0000                   .dbline 22
 0000           ; /* 段传辉 2008 1.21
 0000           ;    TWI 从机的查询和中断接收  依靠广播0X00地址
 0000           ;    ICCAVR6.31A  chuanhuibh@sina.com
 0000           ; */
 0000           ; #include"iom8v.h"
 0000           ; #include"UART.h"
 0000           ; #include"delay.h"
 0000           ; #define  uchar  unsigned char
 0000           ; #define  STATUS  (TWSR&0xf8)
 0000           ; #define  SLA_W    0x32
 0000           ; #define  SLA_R    0x33
 0000           ; #define  TWI_ADDRESS        0x32
 0000           ; #define  START              0x08
 0000           ; #define  RE_START           0x10
 0000           ; #define  MT_SLA_WRITE_ACK   0x18
 0000           ; #define  MT_SLA_READ_ACK    0x40 
 0000           ; #define  MT_DATA_ACK        0x28
 0000           ; #define  MT_READ_ACK        0x58  
 0000           ; #define TW_SR_DATA_ACK                0x80   
 0000           ; 
 0000           ; void Start(void)
 0000           ; {
 0000                   .dbline 23
 0000           ;  TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
 0000 84EA              ldi R24,164
 0002 86BF              out 0x36,R24
 0004           L2:
 0004                   .dbline 24
 0004           L3:
 0004                   .dbline 24
 0004           ;  while(!(TWCR&(1<<TWINT)));
 0004 26B6              in R2,0x36
 0006 27FE              sbrs R2,7
 0008 FDCF              rjmp L2
 000A                   .dbline -2
 000A                   .dbline 25
 000A           ; }
 000A           L1:
 000A                   .dbline 0 ; func end
 000A 0895              ret
 000C                   .dbend
 000C                   .dbfunc e Stop _Stop fV
                        .even
 000C           _Stop::
 000C                   .dbline -1
 000C                   .dbline 27
 000C           ; void Stop(void)
 000C           ; {
 000C                   .dbline 28
 000C           ;  TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
 000C 84E9              ldi R24,148
 000E 86BF              out 0x36,R24
 0010                   .dbline -2
 0010                   .dbline 29
 0010           ; }
 0010           L5:
 0010                   .dbline 0 ; func end
 0010 0895              ret
 0012                   .dbend
 0012                   .dbfunc e Load _Load fV
 0012           ;              i -> R16
                        .even
 0012           _Load::
 0012                   .dbline -1
 0012                   .dbline 31
 0012           ; void Load(uchar i)
 0012           ; {
 0012                   .dbline 32
 0012           ;  TWDR=i;
 0012 03B9              out 0x3,R16
 0014                   .dbline 33
 0014           ;  TWCR=(1<<TWINT)|(1<<TWEN);
 0014 84E8              ldi R24,132
 0016 86BF              out 0x36,R24
 0018           L7:
 0018                   .dbline 34
 0018           L8:
 0018                   .dbline 34
 0018           ;  while(!(TWCR&(1<<TWINT))); 
 0018 26B6              in R2,0x36
 001A 27FE              sbrs R2,7
 001C FDCF              rjmp L7
 001E                   .dbline -2
 001E                   .dbline 36
 001E           ; 
 001E           ; }
 001E           L6:
 001E                   .dbline 0 ; func end
 001E 0895              ret
 0020                   .dbsym r i 16 c
 0020                   .dbend
 0020                   .dbfunc e Get _Get fV
 0020           ;              d -> R16,R17
                        .even
 0020           _Get::
 0020                   .dbline -1
 0020                   .dbline 39
 0020           ; 
 0020           ; void Get(unsigned char *d)
 0020           ; {
 0020                   .dbline 40
 0020           ;  TWCR=(1<<TWINT)|(1<<TWEN);
 0020 84E8              ldi R24,132
 0022 86BF              out 0x36,R24
 0024           L11:
 0024                   .dbline 41
 0024           L12:
 0024                   .dbline 41
 0024           ;  while(!(TWCR&(1<<TWINT)));
 0024 26B6              in R2,0x36
 0026 27FE              sbrs R2,7
 0028 FDCF              rjmp L11
 002A                   .dbline 42
 002A           ;  *d= TWDR;
 002A 23B0              in R2,0x3
 002C F801              movw R30,R16
 002E 2082              std z+0,R2
 0030                   .dbline -2
 0030                   .dbline 43
 0030           ; }/**/
 0030           L10:
 0030                   .dbline 0 ; func end
 0030 0895              ret
 0032                   .dbsym r d 16 pc
 0032                   .dbend
 0032                   .dbfunc e ERROR _ERROR fV
 0032           ;          state -> R20
                        .even
 0032           _ERROR::
 0032 00D0              rcall push_gset1
 0034 402F              mov R20,R16
 0036                   .dbline -1
 0036                   .dbline 45
 0036           ; void ERROR(uchar state)
 0036           ; {Stop();
 0036                   .dbline 45
 0036 EADF              rcall _Stop
 0038                   .dbline -2
 0038                   .dbline 46
 0038           ; }
 0038           L14:
 0038 00D0              rcall pop_gset1
 003A                   .dbline 0 ; func end
 003A 0895              ret
 003C                   .dbsym r state 20 c
 003C                   .dbend
 003C                   .dbfunc e WriteByte _WriteByte fc
 003C           ;           data -> R20
                        .even
 003C           _WriteByte::
 003C 00D0              rcall push_gset1
 003E 402F              mov R20,R16
 0040                   .dbline -1
 0040                   .dbline 51
 0040           ; 
 0040           ; /*写一个字节data,成功则返回1,否则
 0040           ;   返回0*/
 0040           ; uchar WriteByte(uchar data)
 0040           ; {
 0040                   .dbline 53
 0040           ;    //启动I2C
 0040           ;    Start();
 0040 DFDF              rcall _Start
 0042                   .dbline 54
 0042           ;    if(STATUS!=START) {ERROR(STATUS);return 0;}
 0042 81B1              in R24,0x1
 0044 887F              andi R24,248
 0046 8830              cpi R24,8
 0048 29F0              breq L16
 004A                   .dbline 54
 004A                   .dbline 54
 004A 01B1              in R16,0x1
 004C 087F              andi R16,248
 004E F1DF              rcall _ERROR
 0050                   .dbline 54
 0050 0027              clr R16
 0052 18C0              rjmp L15
 0054           L16:
 0054                   .dbline 57
 0054           ;    
 0054           ;    //发送从机地址(写),等待回应, 错误检测
 0054           ;    Load(SLA_W);
 0054 02E3              ldi R16,50
 0056 DDDF              rcall _Load
 0058                   .dbline 58
 0058           ;    if(STATUS!=MT_SLA_WRITE_ACK) {ERROR(STATUS);return 0;}
 0058 81B1              in R24,0x1
 005A 887F              andi R24,248
 005C 8831              cpi R24,24
 005E 29F0              breq L18
 0060                   .dbline 58
 0060                   .dbline 58
 0060 01B1              in R16,0x1
 0062 087F              andi R16,248
 0064 E6DF              rcall _ERROR
 0066                   .dbline 58
 0066 0027              clr R16
 0068 0DC0              rjmp L15
 006A           L18:
 006A                   .dbline 65
 006A           ;    /*
 006A           ;    //发送EEPROM地址,等待回应,错误检测
 006A           ;    Load(addr);
 006A           ;    if(STATUS!=MT_DATA_ACK) {ERROR(STATUS);return 0;}
 006A           ;    */
 006A           ;    //发送数据,等待回应,错误检测
 006A           ;    Load(data);
 006A 042F              mov R16,R20
 006C D2DF              rcall _Load
 006E                   .dbline 66
 006E           ;     if(STATUS!=MT_DATA_ACK) {ERROR(STATUS);return 0;}
 006E 81B1              in R24,0x1
 0070 887F              andi R24,248
 0072 8832              cpi R24,40
 0074 29F0              breq L20
 0076                   .dbline 66
 0076                   .dbline 66
 0076 01B1              in R16,0x1
 0078 087F              andi R16,248
 007A DBDF              rcall _ERROR
 007C                   .dbline 66
 007C 0027              clr R16
 007E 02C0              rjmp L15
 0080           L20:
 0080                   .dbline 68
 0080           ;    
 0080           ;    Stop();
 0080 C5DF              rcall _Stop
 0082                   .dbline 69
 0082           ;    return 1;//发送成功,返回1;
 0082 01E0              ldi R16,1
 0084                   .dbline -2
 0084           L15:
 0084 00D0              rcall pop_gset1
 0086                   .dbline 0 ; func end
 0086 0895              ret
 0088                   .dbsym r data 20 c
 0088                   .dbend
 0088                   .dbfunc e ReadByte _ReadByte fc
 0088           ;         p_data -> R20,R21
 0088           ;           addr -> R22
                        .even
 0088           _ReadByte::
 0088 00D0              rcall push_gset2
 008A A901              movw R20,R18
 008C 602F              mov R22,R16
 008E                   .dbline -1
 008E                   .dbline 77
 008E           ;    
 008E           ;    
 008E           ;   
 008E           ; }
 008E           ; 
 008E           ; unsigned char ReadByte(unsigned char addr,
 008E           ;                        unsigned char *p_data)
 008E           ; {
 008E                   .dbline 79
 008E           ;  //启动I2C
 008E           ;    Start();
 008E B8DF              rcall _Start
 0090                   .dbline 80
 0090           ;    if(STATUS!=START) {ERROR(STATUS);return 0;}
 0090 81B1              in R24,0x1
 0092 887F              andi R24,248
 0094 8830              cpi R24,8
 0096 29F0              breq L23
 0098                   .dbline 80
 0098                   .dbline 80
 0098 01B1              in R16,0x1
 009A 087F              andi R16,248

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -