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

📄 twi_slaver.lst

📁 ICCavr编写的TWI总线协议读写函数
💻 LST
📖 第 1 页 / 共 2 页
字号:
    00FD 3188      CPI	R24,0x18
    00FE F029      BEQ	0x0104
    00FF B101      IN	R16,0x01
    0100 7F08      ANDI	R16,0xF8
    0101 DFE6      RCALL	_ERROR
    0102 2700      CLR	R16
    0103 C00D      RJMP	0x0111
(0059)    /*
(0060)    //发送EEPROM地址,等待回应,错误检测
(0061)    Load(addr);
(0062)    if(STATUS!=MT_DATA_ACK) {ERROR(STATUS);return 0;}
(0063)    */
(0064)    //发送数据,等待回应,错误检测
(0065)    Load(data);
    0104 2F04      MOV	R16,R20
    0105 DFD8      RCALL	_Load
(0066)     if(STATUS!=MT_DATA_ACK) {ERROR(STATUS);return 0;}
    0106 B181      IN	R24,0x01
    0107 7F88      ANDI	R24,0xF8
    0108 3288      CPI	R24,0x28
    0109 F029      BEQ	0x010F
    010A B101      IN	R16,0x01
    010B 7F08      ANDI	R16,0xF8
    010C DFDB      RCALL	_ERROR
    010D 2700      CLR	R16
    010E C002      RJMP	0x0111
(0067)    
(0068)    Stop();
    010F DFCB      RCALL	_Stop
(0069)    return 1;//发送成功,返回1;
    0110 E001      LDI	R16,1
    0111 D08D      RCALL	pop_gset1
    0112 9508      RET
_ReadByte:
  p_data               --> R20
  addr                 --> R22
    0113 D09F      RCALL	push_gset2
    0114 01A9      MOVW	R20,R18
    0115 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();
    0116 DFC1      RCALL	_Start
(0080)    if(STATUS!=START) {ERROR(STATUS);return 0;}
    0117 B181      IN	R24,0x01
    0118 7F88      ANDI	R24,0xF8
    0119 3088      CPI	R24,0x8
    011A F029      BEQ	0x0120
    011B B101      IN	R16,0x01
    011C 7F08      ANDI	R16,0xF8
    011D DFCA      RCALL	_ERROR
    011E 2700      CLR	R16
    011F C038      RJMP	0x0158
(0081)    
(0082)  //发送从机地址(写),等待回应, 错误检测
(0083)    Load(SLA_W);
    0120 E302      LDI	R16,0x32
    0121 DFBC      RCALL	_Load
(0084)    if(STATUS!=MT_SLA_WRITE_ACK) {ERROR(STATUS);return 0;}
    0122 B181      IN	R24,0x01
    0123 7F88      ANDI	R24,0xF8
    0124 3188      CPI	R24,0x18
    0125 F029      BEQ	0x012B
    0126 B101      IN	R16,0x01
    0127 7F08      ANDI	R16,0xF8
    0128 DFBF      RCALL	_ERROR
    0129 2700      CLR	R16
    012A C02D      RJMP	0x0158
(0085)  
(0086)  //发送EEPROM地址,等待回应,错误检测
(0087)    Load(addr);
    012B 2F06      MOV	R16,R22
    012C DFB1      RCALL	_Load
(0088)    if(STATUS!=MT_DATA_ACK) {ERROR(STATUS);return 0;}
    012D B181      IN	R24,0x01
    012E 7F88      ANDI	R24,0xF8
    012F 3288      CPI	R24,0x28
    0130 F029      BEQ	0x0136
    0131 B101      IN	R16,0x01
    0132 7F08      ANDI	R16,0xF8
    0133 DFB4      RCALL	_ERROR
    0134 2700      CLR	R16
    0135 C022      RJMP	0x0158
(0089)  
(0090)  //再次启动I2C
(0091)    Start();
    0136 DFA1      RCALL	_Start
(0092)    if(STATUS!=RE_START) {ERROR(STATUS);return 0;}
    0137 B181      IN	R24,0x01
    0138 7F88      ANDI	R24,0xF8
    0139 3180      CPI	R24,0x10
    013A F029      BEQ	0x0140
    013B B101      IN	R16,0x01
    013C 7F08      ANDI	R16,0xF8
    013D DFAA      RCALL	_ERROR
    013E 2700      CLR	R16
    013F C018      RJMP	0x0158
(0093)  
(0094)  //发送从机地址(读),等待回应, 错误检测
(0095)    Load(SLA_R);
    0140 E303      LDI	R16,0x33
    0141 DF9C      RCALL	_Load
(0096)    if(STATUS!=MT_SLA_READ_ACK) {ERROR(STATUS);return 0;}
    0142 B181      IN	R24,0x01
    0143 7F88      ANDI	R24,0xF8
    0144 3480      CPI	R24,0x40
    0145 F029      BEQ	0x014B
    0146 B101      IN	R16,0x01
    0147 7F08      ANDI	R16,0xF8
    0148 DF9F      RCALL	_ERROR
    0149 2700      CLR	R16
    014A C00D      RJMP	0x0158
(0097)  
(0098)  //读取I2C数据
(0099)     Get(p_data);
    014B 018A      MOVW	R16,R20
    014C DF95      RCALL	_Get
(0100)  if(STATUS!=MT_READ_ACK)  {ERROR(STATUS);return 0;}
    014D B181      IN	R24,0x01
    014E 7F88      ANDI	R24,0xF8
    014F 3588      CPI	R24,0x58
    0150 F029      BEQ	0x0156
    0151 B101      IN	R16,0x01
    0152 7F08      ANDI	R16,0xF8
    0153 DF94      RCALL	_ERROR
    0154 2700      CLR	R16
    0155 C002      RJMP	0x0158
(0101) 	
(0102)  //发送Stop,结束读I2C操作。
(0103)   Stop();
    0156 DF84      RCALL	_Stop
(0104)   return 1;
    0157 E001      LDI	R16,1
    0158 D041      RCALL	pop_gset2
    0159 9508      RET
(0105)  
(0106)    
(0107)    
(0108) }/**/
(0109) void Init_Io(void)
(0110) {
(0111)  DDRC&=~((1<<PC4)&(1<<PC5)&(1<<PC2));  
_Init_Io:
    015A B384      IN	R24,0x14
    015B 7F8F      ANDI	R24,0xFF
    015C BB84      OUT	0x14,R24
(0112)  PORTC|= (1<<PC4)|(1<<PC5)|(1<<PC2);
    015D B385      IN	R24,0x15
    015E 6384      ORI	R24,0x34
    015F BB85      OUT	0x15,R24
(0113)  
(0114) 	//TWI接口初始化,从器件模式
(0115)  TWAR=TWI_ADDRESS | (1<<TWGCE);
    0160 E383      LDI	R24,0x33
    0161 B982      OUT	0x02,R24
(0116)  TWCR=(1<<TWEA) | (1<<TWEN)|(1<<TWIE);
    0162 E485      LDI	R24,0x45
    0163 BF86      OUT	0x36,R24
(0117)  asm("SEI");
    0164 9478      BSET	7
(0118) }
    0165 9508      RET
(0119) void main()
(0120) {
(0121)  // uchar temp1,temp2;
(0122)   Init_Io();
_main:
    0166 DFF3      RCALL	_Init_Io
(0123)   uart_init();
    0167 DF67      RCALL	_uart_init
(0124)   puts("串口正常工作");
    0168 E60C      LDI	R16,0x6C
    0169 E010      LDI	R17,0
    016A DF44      RCALL	_puts
(0125)   while(1)
    016B CFFF      RJMP	0x016B
(0126)   { /*
(0127)     TWCR=(1<<TWINT)|(1<<TWEA) | (1<<TWEN); //启动一次接收
(0128)     while((TWCR&(1<<TWINT))==0); //等待有数据被接收
(0129) 	//Delay_nms(100);
(0130) 	temp1=STATUS;
(0131) 	temp2=TWDR;
(0132) 	//putchar(temp1);
(0133) 	if(temp1==0x90)
(0134) 	{ 
(0135) 	  puts("接受到:");
(0136) 	  putchar(temp2);
(0137) 	 }
(0138) 	*/
(0139) 	
(0140)    }
(0141)  
(0142) }
    016C 9508      RET
_TWI_ISR:
  temp2                --> R20
  temp1                --> R22
    016D D048      RCALL	push_lset
    016E D044      RCALL	push_gset2
(0143) #pragma interrupt_handler TWI_ISR:18
(0144) void TWI_ISR(void)
(0145) {
(0146)  uchar temp1,temp2;
(0147)  temp1=STATUS;
    016F B161      IN	R22,0x01
    0170 7F68      ANDI	R22,0xF8
(0148)  temp2=TWDR;
    0171 B143      IN	R20,0x03
(0149)  if(temp1==0x90)
    0172 3960      CPI	R22,0x90
    0173 F429      BNE	0x0179
(0150) 	{ 
(0151) 	  puts("接受到:");
    0174 E604      LDI	R16,0x64
    0175 E010      LDI	R17,0
    0176 DF38      RCALL	_puts
(0152) 	  putchar(temp2);
    0177 2F04      MOV	R16,R20
    0178 DF2E      RCALL	_putchar
(0153) 	 }
(0154) TWCR=(1<<TWINT)|(1<<TWEA) | (1<<TWEN)|(1<<TWIE); //启动一次接收
    0179 EC85      LDI	R24,0xC5
    017A BF86      OUT	0x36,R24
(0155) 
(0156) }
FILE: <library>
    017B D01E      RCALL	pop_gset2
    017C D050      RCALL	pop_lset
    017D 9518      RETI
mod16u:
    017E 9468      BSET	6
    017F C001      RJMP	xdiv16u
div16u:
    0180 94E8      BCLR	6
xdiv16u:
    0181 92EA      ST	R14,-Y
    0182 92FA      ST	R15,-Y
    0183 938A      ST	R24,-Y
    0184 24EE      CLR	R14
    0185 24FF      CLR	R15
    0186 E180      LDI	R24,0x10
    0187 0F00      LSL	R16
    0188 1F11      ROL	R17
    0189 1CEE      ROL	R14
    018A 1CFF      ROL	R15
    018B 16E2      CP	R14,R18
    018C 06F3      CPC	R15,R19
    018D F018      BCS	0x0191
    018E 1AE2      SUB	R14,R18
    018F 0AF3      SBC	R15,R19
    0190 9503      INC	R16
    0191 958A      DEC	R24
    0192 F7A1      BNE	0x0187
    0193 F416      BRTC	0x0196
    0194 2D0E      MOV	R16,R14
    0195 2D1F      MOV	R17,R15
    0196 9189      LD	R24,Y+
    0197 90F9      LD	R15,Y+
    0198 90E9      LD	R14,Y+
    0199 9508      RET
pop_gset2:
    019A E0E2      LDI	R30,2
    019B C004      RJMP	pop
push_gset1:
    019C 935A      ST	R21,-Y
    019D 934A      ST	R20,-Y
    019E 9508      RET
pop_gset1:
    019F E0E1      LDI	R30,1
pop:
    01A0 9149      LD	R20,Y+
    01A1 9159      LD	R21,Y+
    01A2 FDE0      SBRC	R30,0
    01A3 9508      RET
    01A4 9169      LD	R22,Y+
    01A5 9179      LD	R23,Y+
    01A6 FDE1      SBRC	R30,1
    01A7 9508      RET
    01A8 90A9      LD	R10,Y+
    01A9 90B9      LD	R11,Y+
    01AA FDE2      SBRC	R30,2
    01AB 9508      RET
    01AC 90C9      LD	R12,Y+
    01AD 90D9      LD	R13,Y+
    01AE FDE3      SBRC	R30,3
    01AF 9508      RET
    01B0 90E9      LD	R14,Y+
    01B1 90F9      LD	R15,Y+
    01B2 9508      RET
push_gset2:
    01B3 937A      ST	R23,-Y
    01B4 936A      ST	R22,-Y
    01B5 CFE6      RJMP	push_gset1
push_lset:
    01B6 93FA      ST	R31,-Y
    01B7 93EA      ST	R30,-Y
    01B8 93BA      ST	R27,-Y
    01B9 93AA      ST	R26,-Y
    01BA 939A      ST	R25,-Y
    01BB 938A      ST	R24,-Y
    01BC 933A      ST	R19,-Y
    01BD 932A      ST	R18,-Y
    01BE 931A      ST	R17,-Y
    01BF 930A      ST	R16,-Y
    01C0 929A      ST	R9,-Y
    01C1 928A      ST	R8,-Y
    01C2 927A      ST	R7,-Y
    01C3 926A      ST	R6,-Y
    01C4 925A      ST	R5,-Y
    01C5 924A      ST	R4,-Y
    01C6 923A      ST	R3,-Y
    01C7 922A      ST	R2,-Y
    01C8 921A      ST	R1,-Y
    01C9 920A      ST	R0,-Y
    01CA B60F      IN	R0,0x3F
    01CB 920A      ST	R0,-Y
    01CC 9508      RET
pop_lset:
    01CD 9009      LD	R0,Y+
    01CE BE0F      OUT	0x3F,R0
    01CF 9009      LD	R0,Y+
    01D0 9019      LD	R1,Y+
    01D1 9029      LD	R2,Y+
    01D2 9039      LD	R3,Y+
    01D3 9049      LD	R4,Y+
    01D4 9059      LD	R5,Y+
    01D5 9069      LD	R6,Y+
    01D6 9079      LD	R7,Y+
    01D7 9089      LD	R8,Y+
    01D8 9099      LD	R9,Y+
    01D9 9109      LD	R16,Y+
    01DA 9119      LD	R17,Y+
    01DB 9129      LD	R18,Y+
    01DC 9139      LD	R19,Y+
    01DD 9189      LD	R24,Y+
    01DE 9199      LD	R25,Y+
    01DF 91A9      LD	R26,Y+
    01E0 91B9      LD	R27,Y+
    01E1 91E9      LD	R30,Y+
    01E2 91F9      LD	R31,Y+
    01E3 9508      RET
asgncblk:
    01E4 93AA      ST	R26,-Y
    01E5 93BA      ST	R27,-Y
    01E6 93EA      ST	R30,-Y
    01E7 93FA      ST	R31,-Y
    01E8 920A      ST	R0,-Y
    01E9 81AF      LDD	R26,Y+7
    01EA 85B8      LDD	R27,Y+8
    01EB 81ED      LDD	R30,Y+5
    01EC 81FE      LDD	R31,Y+6
    01ED 3000      CPI	R16,0
    01EE 0701      CPC	R16,R17
    01EF F031      BEQ	0x01F6
    01F0 95C8      LPM
    01F1 920D      ST	R0,X+
    01F2 9631      ADIW	R30,1
    01F3 5001      SUBI	R16,1
    01F4 4010      SBCI	R17,0
    01F5 CFF7      RJMP	0x01ED
    01F6 9009      LD	R0,Y+
    01F7 91F9      LD	R31,Y+
    01F8 91E9      LD	R30,Y+
    01F9 91B9      LD	R27,Y+
    01FA 91A9      LD	R26,Y+
    01FB 9624      ADIW	R28,4
    01FC 9508      RET
<created procedures>:
    01FD BF86      OUT	0x36,R24
    01FE B626      IN	R2,0x36
    01FF FE27      SBRS	R2,7
    0200 CFFD      RJMP	0x01FE
    0201 9508      RET
    0202 E081      LDI	R24,1
    0203 E090      LDI	R25,0
    0204 1784      CP	R24,R20
    0205 0795      CPC	R25,R21
    0206 9508      RET

⌨️ 快捷键说明

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