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

📄 main.lis

📁 atmega16 iic(twi)主从机通信 测试通过
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .module main.c
                        .area text(rom, con, rel)
 0000                   .dbfile E:\atmega16子函数\TWI_slaver0\main.c
 0000                   .dbfunc e Start _Start fV
                        .even
 0000           _Start::
 0000                   .dbline -1
 0000                   .dbline 22
 0000           ; /* 
 0000           ;    TWI 从机的查询和中断接收  
 0000           ;    ICCAVR6.31A  
 0000           ; */
 0000           ; #include"iom16v.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 0E940000          xcall push_gset1
 0036 402F              mov R20,R16
 0038                   .dbline -1
 0038                   .dbline 45
 0038           ; void ERROR(uchar state)
 0038           ; {Stop();
 0038                   .dbline 45
 0038 E9DF              xcall _Stop
 003A                   .dbline -2
 003A                   .dbline 46
 003A           ; }
 003A           L14:
 003A 0E940000          xcall pop_gset1
 003E                   .dbline 0 ; func end
 003E 0895              ret
 0040                   .dbsym r state 20 c
 0040                   .dbend
 0040                   .dbfunc e WriteByte _WriteByte fc
 0040           ;           data -> R20
                        .even
 0040           _WriteByte::
 0040 0E940000          xcall push_gset1
 0044 402F              mov R20,R16
 0046                   .dbline -1
 0046                   .dbline 51
 0046           ; 
 0046           ; /*写一个字节data,成功则返回1,否则
 0046           ;   返回0*/
 0046           ; uchar WriteByte(uchar data)
 0046           ; {
 0046                   .dbline 53
 0046           ;    //启动I2C
 0046           ;    Start();
 0046 DCDF              xcall _Start
 0048                   .dbline 54
 0048           ;    if(STATUS!=START) {ERROR(STATUS);return 0;}
 0048 81B1              in R24,0x1
 004A 887F              andi R24,248
 004C 8830              cpi R24,8
 004E 29F0              breq L16
 0050                   .dbline 54
 0050                   .dbline 54
 0050 01B1              in R16,0x1
 0052 087F              andi R16,248
 0054 EEDF              xcall _ERROR
 0056                   .dbline 54
 0056 0027              clr R16
 0058 18C0              xjmp L15
 005A           L16:
 005A                   .dbline 57
 005A           ;    
 005A           ;    //发送从机地址(写),等待回应, 错误检测
 005A           ;    Load(SLA_W);
 005A 02E3              ldi R16,50
 005C DADF              xcall _Load
 005E                   .dbline 58
 005E           ;    if(STATUS!=MT_SLA_WRITE_ACK) {ERROR(STATUS);return 0;}
 005E 81B1              in R24,0x1
 0060 887F              andi R24,248
 0062 8831              cpi R24,24
 0064 29F0              breq L18
 0066                   .dbline 58
 0066                   .dbline 58
 0066 01B1              in R16,0x1
 0068 087F              andi R16,248
 006A E3DF              xcall _ERROR
 006C                   .dbline 58
 006C 0027              clr R16
 006E 0DC0              xjmp L15
 0070           L18:
 0070                   .dbline 65
 0070           ;    /*
 0070           ;    //发送EEPROM地址,等待回应,错误检测
 0070           ;    Load(addr);
 0070           ;    if(STATUS!=MT_DATA_ACK) {ERROR(STATUS);return 0;}
 0070           ;    */
 0070           ;    //发送数据,等待回应,错误检测
 0070           ;    Load(data);
 0070 042F              mov R16,R20
 0072 CFDF              xcall _Load
 0074                   .dbline 66
 0074           ;     if(STATUS!=MT_DATA_ACK) {ERROR(STATUS);return 0;}
 0074 81B1              in R24,0x1
 0076 887F              andi R24,248
 0078 8832              cpi R24,40
 007A 29F0              breq L20
 007C                   .dbline 66
 007C                   .dbline 66
 007C 01B1              in R16,0x1
 007E 087F              andi R16,248
 0080 D8DF              xcall _ERROR
 0082                   .dbline 66
 0082 0027              clr R16
 0084 02C0              xjmp L15
 0086           L20:
 0086                   .dbline 68
 0086           ;    
 0086           ;    Stop();
 0086 C2DF              xcall _Stop
 0088                   .dbline 69
 0088           ;    return 1;//发送成功,返回1;
 0088 01E0              ldi R16,1
 008A                   .dbline -2
 008A           L15:
 008A 0E940000          xcall pop_gset1
 008E                   .dbline 0 ; func end
 008E 0895              ret
 0090                   .dbsym r data 20 c
 0090                   .dbend
 0090                   .dbfunc e ReadByte _ReadByte fc
 0090           ;         p_data -> R20,R21
 0090           ;           addr -> R22
                        .even
 0090           _ReadByte::
 0090 0E940000          xcall push_gset2
 0094 A901              movw R20,R18
 0096 602F              mov R22,R16
 0098                   .dbline -1
 0098                   .dbline 77
 0098           ;    
 0098           ;    
 0098           ;   
 0098           ; }
 0098           ; 
 0098           ; unsigned char ReadByte(unsigned char addr,
 0098           ;                        unsigned char *p_data)
 0098           ; {
 0098                   .dbline 79
 0098           ;  //启动I2C
 0098           ;    Start();
 0098 B3DF              xcall _Start
 009A                   .dbline 80
 009A           ;    if(STATUS!=START) {ERROR(STATUS);return 0;}
 009A 81B1              in R24,0x1
 009C 887F              andi R24,248
 009E 8830              cpi R24,8
 00A0 29F0              breq L23
 00A2                   .dbline 80
 00A2                   .dbline 80
 00A2 01B1              in R16,0x1
 00A4 087F              andi R16,248
 00A6 C5DF              xcall _ERROR
 00A8                   .dbline 80
 00A8 0027              clr R16
 00AA 38C0              xjmp L22
 00AC           L23:
 00AC                   .dbline 83
 00AC           ;    
 00AC           ;  //发送从机地址(写),等待回应, 错误检测

⌨️ 快捷键说明

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