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

📄 twi_slaver.lst

📁 atmega16 iic(twi)主从机通信 测试通过
💻 LST
📖 第 1 页 / 共 2 页
字号:
__start:
__text_start:
    002E E5CF      LDI	R28,0x5F
    002F E0D4      LDI	R29,4
    0030 BFCD      OUT	0x3D,R28
    0031 BFDE      OUT	0x3E,R29
    0032 51C0      SUBI	R28,0x10
    0033 40D0      SBCI	R29,0
    0034 EA0A      LDI	R16,0xAA
    0035 8308      STD	Y+0,R16
    0036 2400      CLR	R0
    0037 E6E0      LDI	R30,0x60
    0038 E0F0      LDI	R31,0
    0039 E010      LDI	R17,0
    003A 36E0      CPI	R30,0x60
    003B 07F1      CPC	R31,R17
    003C F011      BEQ	0x003F
    003D 9201      ST	R0,Z+
    003E CFFB      RJMP	0x003A
    003F 8300      STD	Z+0,R16
    0040 E5EC      LDI	R30,0x5C
    0041 E0F0      LDI	R31,0
    0042 E6A0      LDI	R26,0x60
    0043 E0B0      LDI	R27,0
    0044 E010      LDI	R17,0
    0045 35EC      CPI	R30,0x5C
    0046 07F1      CPC	R31,R17
    0047 F021      BEQ	0x004C
    0048 95C8      LPM
    0049 9631      ADIW	R30,1
    004A 920D      ST	R0,X+
    004B CFF9      RJMP	0x0045
    004C 940E0116  CALL	_main
_exit:
    004E CFFF      RJMP	_exit
FILE: E:\atmega16子函数\TWI_slaver0\delay.c
(0001) #include <iom16v.h>
(0002) 
(0003) 
(0004) void Delay_nus(unsigned int i) 
(0005) {
(0006)    for(;i>1;i--){;}
_Delay_nus:
  i                    --> R16
    004F C002      RJMP	0x0052
    0050 5001      SUBI	R16,1
    0051 4010      SBCI	R17,0
    0052 E081      LDI	R24,1
    0053 E090      LDI	R25,0
    0054 1780      CP	R24,R16
    0055 0791      CPC	R25,R17
    0056 F3C8      BCS	0x0050
(0007) }
    0057 9508      RET
_Delay_1ms:
  i                    --> R20
    0058 940E01DA  CALL	push_gset1
(0008) void Delay_1ms(void) 
(0009) {unsigned i;
(0010)    for(i=1000;i>1;i--)
    005A EE48      LDI	R20,0xE8
    005B E053      LDI	R21,3
    005C C005      RJMP	0x0062
(0011)    {Delay_nus(1);
    005D E001      LDI	R16,1
    005E E010      LDI	R17,0
    005F DFEF      RCALL	_Delay_nus
    0060 5041      SUBI	R20,1
    0061 4050      SBCI	R21,0
    0062 E081      LDI	R24,1
    0063 E090      LDI	R25,0
    0064 1784      CP	R24,R20
    0065 0795      CPC	R25,R21
    0066 F3B0      BCS	0x005D
(0012)      }
(0013) }
    0067 940E01DD  CALL	pop_gset1
    0069 9508      RET
_Delay_nms:
  i                    --> R20
    006A 940E01DA  CALL	push_gset1
    006C 01A8      MOVW	R20,R16
(0014) void Delay_nms(unsigned int  i) 
(0015) {
(0016)    for(;i>1;i--)
    006D C003      RJMP	0x0071
(0017)    {Delay_1ms();}
    006E DFE9      RCALL	_Delay_1ms
    006F 5041      SUBI	R20,1
    0070 4050      SBCI	R21,0
    0071 E081      LDI	R24,1
    0072 E090      LDI	R25,0
    0073 1784      CP	R24,R20
    0074 0795      CPC	R25,R21
    0075 F3C0      BCS	0x006E
(0018) }
    0076 940E01DD  CALL	pop_gset1
    0078 9508      RET
FILE: E:\atmega16子函数\TWI_slaver0\main.c
(0001) /* 
(0002)    TWI 从机的查询和中断接收  
(0003)    ICCAVR6.31A  
(0004) */
(0005) #include"iom16v.h"
(0006) #include"UART.h"
(0007) #include"delay.h"
(0008) #define  uchar  unsigned char
(0009) #define  STATUS  (TWSR&0xf8)
(0010) #define  SLA_W    0x32
(0011) #define  SLA_R    0x33
(0012) #define  TWI_ADDRESS        0x32
(0013) #define  START              0x08
(0014) #define  RE_START           0x10
(0015) #define  MT_SLA_WRITE_ACK   0x18
(0016) #define  MT_SLA_READ_ACK    0x40 
(0017) #define  MT_DATA_ACK        0x28
(0018) #define  MT_READ_ACK        0x58  
(0019) #define TW_SR_DATA_ACK		0x80   
(0020) 
(0021) void Start(void)
(0022) {
(0023)  TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
_Start:
    0079 EA84      LDI	R24,0xA4
    007A BF86      OUT	0x36,R24
(0024)  while(!(TWCR&(1<<TWINT)));
    007B B626      IN	R2,0x36
    007C FE27      SBRS	R2,7
    007D CFFD      RJMP	0x007B
(0025) }
    007E 9508      RET
(0026) void Stop(void)
(0027) {
(0028)  TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
_Stop:
    007F E984      LDI	R24,0x94
    0080 BF86      OUT	0x36,R24
(0029) }
    0081 9508      RET
(0030) void Load(uchar i)
(0031) {
(0032)  TWDR=i;
_Load:
  i                    --> R16
    0082 B903      OUT	0x03,R16
(0033)  TWCR=(1<<TWINT)|(1<<TWEN);
    0083 E884      LDI	R24,0x84
    0084 BF86      OUT	0x36,R24
(0034)  while(!(TWCR&(1<<TWINT))); 
    0085 B626      IN	R2,0x36
    0086 FE27      SBRS	R2,7
    0087 CFFD      RJMP	0x0085
(0035) 
(0036) }
    0088 9508      RET
(0037) 
(0038) void Get(unsigned char *d)
(0039) {
(0040)  TWCR=(1<<TWINT)|(1<<TWEN);
_Get:
  d                    --> R16
    0089 E884      LDI	R24,0x84
    008A BF86      OUT	0x36,R24
(0041)  while(!(TWCR&(1<<TWINT)));
    008B B626      IN	R2,0x36
    008C FE27      SBRS	R2,7
    008D CFFD      RJMP	0x008B
(0042)  *d= TWDR;
    008E B023      IN	R2,0x03
    008F 01F8      MOVW	R30,R16
    0090 8220      STD	Z+0,R2
(0043) }/**/
    0091 9508      RET
_ERROR:
  state                --> R20
    0092 940E01DA  CALL	push_gset1
    0094 2F40      MOV	R20,R16
(0044) void ERROR(uchar state)
(0045) {Stop();
    0095 DFE9      RCALL	_Stop
(0046) }
    0096 940E01DD  CALL	pop_gset1
    0098 9508      RET
_WriteByte:
  data                 --> R20
    0099 940E01DA  CALL	push_gset1
    009B 2F40      MOV	R20,R16
(0047) 
(0048) /*写一个字节data,成功则返回1,否则
(0049)   返回0*/
(0050) uchar WriteByte(uchar data)
(0051) {
(0052)    //启动I2C
(0053)    Start();
    009C DFDC      RCALL	_Start
(0054)    if(STATUS!=START) {ERROR(STATUS);return 0;}
    009D B181      IN	R24,0x01
    009E 7F88      ANDI	R24,0xF8
    009F 3088      CPI	R24,0x8
    00A0 F029      BEQ	0x00A6
    00A1 B101      IN	R16,0x01
    00A2 7F08      ANDI	R16,0xF8
    00A3 DFEE      RCALL	_ERROR
    00A4 2700      CLR	R16
    00A5 C018      RJMP	0x00BE
(0055)    
(0056)    //发送从机地址(写),等待回应, 错误检测
(0057)    Load(SLA_W);
    00A6 E302      LDI	R16,0x32
    00A7 DFDA      RCALL	_Load
(0058)    if(STATUS!=MT_SLA_WRITE_ACK) {ERROR(STATUS);return 0;}
    00A8 B181      IN	R24,0x01
    00A9 7F88      ANDI	R24,0xF8
    00AA 3188      CPI	R24,0x18
    00AB F029      BEQ	0x00B1
    00AC B101      IN	R16,0x01
    00AD 7F08      ANDI	R16,0xF8
    00AE DFE3      RCALL	_ERROR
    00AF 2700      CLR	R16
    00B0 C00D      RJMP	0x00BE
(0059)    /*
(0060)    //发送EEPROM地址,等待回应,错误检测
(0061)    Load(addr);
(0062)    if(STATUS!=MT_DATA_ACK) {ERROR(STATUS);return 0;}
(0063)    */
(0064)    //发送数据,等待回应,错误检测
(0065)    Load(data);
    00B1 2F04      MOV	R16,R20
    00B2 DFCF      RCALL	_Load
(0066)     if(STATUS!=MT_DATA_ACK) {ERROR(STATUS);return 0;}
    00B3 B181      IN	R24,0x01
    00B4 7F88      ANDI	R24,0xF8
    00B5 3288      CPI	R24,0x28
    00B6 F029      BEQ	0x00BC
    00B7 B101      IN	R16,0x01
    00B8 7F08      ANDI	R16,0xF8
    00B9 DFD8      RCALL	_ERROR
    00BA 2700      CLR	R16
    00BB C002      RJMP	0x00BE
(0067)    
(0068)    Stop();
    00BC DFC2      RCALL	_Stop
(0069)    return 1;//发送成功,返回1;
    00BD E001      LDI	R16,1
    00BE 940E01DD  CALL	pop_gset1
    00C0 9508      RET
_ReadByte:
  p_data               --> R20
  addr                 --> R22
    00C1 940E01F1  CALL	push_gset2
    00C3 01A9      MOVW	R20,R18
    00C4 2F60      MOV	R22,R16
(0070)    
(0071)    
(0072)   
(0073) }
(0074) 
(0075) unsigned char ReadByte(unsigned char addr,
(0076)                        unsigned char *p_data)
(0077) {
(0078)  //启动I2C
(0079)    Start();
    00C5 DFB3      RCALL	_Start
(0080)    if(STATUS!=START) {ERROR(STATUS);return 0;}
    00C6 B181      IN	R24,0x01
    00C7 7F88      ANDI	R24,0xF8
    00C8 3088      CPI	R24,0x8
    00C9 F029      BEQ	0x00CF
    00CA B101      IN	R16,0x01
    00CB 7F08      ANDI	R16,0xF8
    00CC DFC5      RCALL	_ERROR
    00CD 2700      CLR	R16
    00CE C038      RJMP	0x0107
(0081)    
(0082)  //发送从机地址(写),等待回应, 错误检测
(0083)    Load(SLA_W);
    00CF E302      LDI	R16,0x32
    00D0 DFB1      RCALL	_Load
(0084)    if(STATUS!=MT_SLA_WRITE_ACK) {ERROR(STATUS);return 0;}
    00D1 B181      IN	R24,0x01
    00D2 7F88      ANDI	R24,0xF8
    00D3 3188      CPI	R24,0x18
    00D4 F029      BEQ	0x00DA
    00D5 B101      IN	R16,0x01
    00D6 7F08      ANDI	R16,0xF8
    00D7 DFBA      RCALL	_ERROR
    00D8 2700      CLR	R16
    00D9 C02D      RJMP	0x0107
(0085)  
(0086)  //发送EEPROM地址,等待回应,错误检测
(0087)    Load(addr);
    00DA 2F06      MOV	R16,R22
    00DB DFA6      RCALL	_Load
(0088)    if(STATUS!=MT_DATA_ACK) {ERROR(STATUS);return 0;}
    00DC B181      IN	R24,0x01
    00DD 7F88      ANDI	R24,0xF8
    00DE 3288      CPI	R24,0x28
    00DF F029      BEQ	0x00E5
    00E0 B101      IN	R16,0x01
    00E1 7F08      ANDI	R16,0xF8
    00E2 DFAF      RCALL	_ERROR
    00E3 2700      CLR	R16
    00E4 C022      RJMP	0x0107
(0089)  
(0090)  //再次启动I2C
(0091)    Start();
    00E5 DF93      RCALL	_Start
(0092)    if(STATUS!=RE_START) {ERROR(STATUS);return 0;}
    00E6 B181      IN	R24,0x01
    00E7 7F88      ANDI	R24,0xF8
    00E8 3180      CPI	R24,0x10
    00E9 F029      BEQ	0x00EF
    00EA B101      IN	R16,0x01
    00EB 7F08      ANDI	R16,0xF8
    00EC DFA5      RCALL	_ERROR
    00ED 2700      CLR	R16
    00EE C018      RJMP	0x0107
(0093)  
(0094)  //发送从机地址(读),等待回应, 错误检测
(0095)    Load(SLA_R);
    00EF E303      LDI	R16,0x33
    00F0 DF91      RCALL	_Load
(0096)    if(STATUS!=MT_SLA_READ_ACK) {ERROR(STATUS);return 0;}
    00F1 B181      IN	R24,0x01
    00F2 7F88      ANDI	R24,0xF8
    00F3 3480      CPI	R24,0x40
    00F4 F029      BEQ	0x00FA
    00F5 B101      IN	R16,0x01
    00F6 7F08      ANDI	R16,0xF8
    00F7 DF9A      RCALL	_ERROR
    00F8 2700      CLR	R16
    00F9 C00D      RJMP	0x0107
(0097)  
(0098)  //读取I2C数据
(0099)     Get(p_data);
    00FA 018A      MOVW	R16,R20
    00FB DF8D      RCALL	_Get
(0100)  if(STATUS!=MT_READ_ACK)  {ERROR(STATUS);return 0;}
    00FC B181      IN	R24,0x01
    00FD 7F88      ANDI	R24,0xF8
    00FE 3588      CPI	R24,0x58
    00FF F029      BEQ	0x0105
    0100 B101      IN	R16,0x01
    0101 7F08      ANDI	R16,0xF8
    0102 DF8F      RCALL	_ERROR
    0103 2700      CLR	R16
    0104 C002      RJMP	0x0107
(0101) 	
(0102)  //发送Stop,结束读I2C操作。
(0103)   Stop();
    0105 DF79      RCALL	_Stop
(0104)   return 1;
    0106 E001      LDI	R16,1
    0107 940E01D7  CALL	pop_gset2
    0109 9508      RET
(0105)  
(0106)    
(0107)    
(0108) }/**/
(0109) void Init_Io(void)
(0110) {
(0111)  DDRC&=~((1<<PC0)&(1<<PC0)&(1<<PC2));  
_Init_Io:
    010A B384      IN	R24,0x14
    010B 7F8F      ANDI	R24,0xFF
    010C BB84      OUT	0x14,R24
(0112)  PORTC|= (1<<PC0)|(1<<PC0)|(1<<PC2);
    010D B385      IN	R24,0x15
    010E 6085      ORI	R24,5
    010F BB85      OUT	0x15,R24

⌨️ 快捷键说明

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