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

📄 hard_i2c.lst

📁 meg16 的所有功能实例
💻 LST
📖 第 1 页 / 共 2 页
字号:
(0193) {
(0194) 	i2c_ddr|=(1<<SCL);			//SCK为输出
_I2C_Ini:
    00DE 9AA0      SBI	0x14,0
(0195) 	i2c_ddr|=(1<<SDA);		    //SDA为双向的,先设置为输出
    00DF 9AA1      SBI	0x14,1
    00E0 9508      RET
_i2c_Write:
  number               --> R20
  Wdata                --> R22
  RomAddress           --> R10
    00E1 940E0181  CALL	push_gset3
    00E3 2F62      MOV	R22,R18
    00E4 2EA0      MOV	R10,R16
(0196) 
(0197) 
(0198) }
(0199) 
(0200) /******************************************
(0201)                 I2C总线写一个字节
(0202) 			    返回1:写成功
(0203) 				返回非1:写失败
(0204) *******************************************/
(0205) unsigned char i2c_Write(unsigned char RomAddress,unsigned char Wdata) 
(0206) {unsigned char number=10;
    00E5 E04A      LDI	R20,0xA
    00E6 C02F      RJMP	0x0116
(0207)  while(number--)
(0208) 	  {
(0209) 	  Start();//I2C启动
    00E7 EA84      LDI	R24,0xA4
    00E8 BF86      OUT	0x36,R24
(0210) 	  Wait();
    00E9 B626      IN	R2,0x36
    00EA FE27      SBRS	R2,7
    00EB CFFD      RJMP	0x00E9
(0211) 	  if(TestAck()!=START) continue;//ACK
    00EC B181      IN	R24,0x01
    00ED 7F88      ANDI	R24,0xF8
    00EE 3088      CPI	R24,0x8
    00EF F009      BEQ	0x00F1
    00F0 C025      RJMP	0x0116
(0212) 	  Write8Bit(wr_device_add);//写I2C从器件地址和写方式
    00F1 EA80      LDI	R24,0xA0
    00F2 B983      OUT	0x03,R24
    00F3 E884      LDI	R24,0x84
    00F4 BF86      OUT	0x36,R24
(0213) 	  Wait();
    00F5 B626      IN	R2,0x36
    00F6 FE27      SBRS	R2,7
    00F7 CFFD      RJMP	0x00F5
(0214) 	  
(0215) 	  if(TestAck()!=MT_SLA_ACK)
    00F8 B181      IN	R24,0x01
    00F9 7F88      ANDI	R24,0xF8
    00FA 3188      CPI	R24,0x18
    00FB F029      BEQ	0x0101
(0216) 	  {putchar(0);
    00FC 2700      CLR	R16
    00FD 2711      CLR	R17
    00FE 940E01CA  CALL	_putchar
(0217) 	   continue;//ACK
    0100 C015      RJMP	0x0116
(0218) 	  }
(0219) 	  Write8Bit(RomAddress);//写24C02的ROM地址
    0101 B8A3      OUT	0x03,R10
    0102 E884      LDI	R24,0x84
    0103 BF86      OUT	0x36,R24
(0220) 	  Wait();
    0104 B626      IN	R2,0x36
    0105 FE27      SBRS	R2,7
    0106 CFFD      RJMP	0x0104
(0221) 	  if(TestAck()!=MT_DATA_ACK) continue;//ACK
    0107 B181      IN	R24,0x01
    0108 7F88      ANDI	R24,0xF8
    0109 3288      CPI	R24,0x28
    010A F009      BEQ	0x010C
    010B C00A      RJMP	0x0116
(0222) 	  Write8Bit(Wdata);//写数据到24C02的ROM
    010C B963      OUT	0x03,R22
    010D E884      LDI	R24,0x84
    010E BF86      OUT	0x36,R24
(0223) 	  Wait();
    010F B626      IN	R2,0x36
    0110 FE27      SBRS	R2,7
    0111 CFFD      RJMP	0x010F
(0224) 	  if(TestAck()!=MT_DATA_ACK) continue;//ACK
    0112 B181      IN	R24,0x01
    0113 7F88      ANDI	R24,0xF8
    0114 3288      CPI	R24,0x28
    0115 F029      BEQ	0x011B
    0116 2E24      MOV	R2,R20
    0117 2433      CLR	R3
    0118 5041      SUBI	R20,1
    0119 2022      TST	R2
    011A F661      BNE	0x00E7
(0225) 	  break;
(0226) 	  }
(0227) 	  Stop();//I2C停止
    011B E984      LDI	R24,0x94
    011C BF86      OUT	0x36,R24
(0228)  	  Delay_ms(10);//延时10ms等EEPROM写完
    011D E00A      LDI	R16,0xA
    011E E010      LDI	R17,0
    011F DF3C      RCALL	_Delay_ms
(0229) 	  return 1;
    0120 E001      LDI	R16,1
    0121 940E017A  CALL	pop_gset3
    0123 9508      RET
_i2c_Read:
  number               --> R22
  temp                 --> R20
  a                    --> R10
  RomAddress           --> R16
    0124 940E0181  CALL	push_gset3
(0230) }
(0231) /******************************************
(0232)                I2C总线读一个字节
(0233) 			   
(0234) *******************************************/
(0235) unsigned char i2c_Read(unsigned char RomAddress) 
(0236)  {char a=0x00;
    0126 24AA      CLR	R10
(0237)   unsigned char temp=0;
    0127 2744      CLR	R20
(0238)   unsigned char number=10;
    0128 E06A      LDI	R22,0xA
    0129 C044      RJMP	0x016E
(0239)   
(0240)   while(number--)
(0241) 	   {
(0242) 	   Start();//I2C启动
    012A EA84      LDI	R24,0xA4
    012B BF86      OUT	0x36,R24
(0243) 	   Wait();
    012C B626      IN	R2,0x36
    012D FE27      SBRS	R2,7
    012E CFFD      RJMP	0x012C
(0244) 	   a=TestAck();
    012F B181      IN	R24,0x01
    0130 7F88      ANDI	R24,0xF8
    0131 2EA8      MOV	R10,R24
(0245) 	  
(0246) 	   if (a!=START) continue;//ACK	 
    0132 3088      CPI	R24,0x8
    0133 F009      BEQ	0x0135
    0134 C039      RJMP	0x016E
(0247) 	   
(0248) 	   Write8Bit(wr_device_add);//写I2C从器件地址和写方式
    0135 EA80      LDI	R24,0xA0
    0136 B983      OUT	0x03,R24
    0137 E884      LDI	R24,0x84
    0138 BF86      OUT	0x36,R24
(0249) 	   Wait(); 
    0139 B626      IN	R2,0x36
    013A FE27      SBRS	R2,7
    013B CFFD      RJMP	0x0139
(0250)    	   
(0251) 	   if (TestAck()!=MT_SLA_ACK) continue;//ACK
    013C B181      IN	R24,0x01
    013D 7F88      ANDI	R24,0xF8
    013E 3188      CPI	R24,0x18
    013F F009      BEQ	0x0141
    0140 C02D      RJMP	0x016E
(0252) 	  
(0253) 
(0254) 	   Write8Bit(RomAddress);//写STA013的ROM地址
    0141 B903      OUT	0x03,R16
    0142 E884      LDI	R24,0x84
    0143 BF86      OUT	0x36,R24
(0255) 	   Wait();
    0144 B626      IN	R2,0x36
    0145 FE27      SBRS	R2,7
    0146 CFFD      RJMP	0x0144
(0256) 	   
(0257) 	   if (TestAck()!=MT_DATA_ACK) continue;
    0147 B181      IN	R24,0x01
    0148 7F88      ANDI	R24,0xF8
    0149 3288      CPI	R24,0x28
    014A F009      BEQ	0x014C
    014B C022      RJMP	0x016E
(0258) 	   Start();//I2C重新启动
    014C EA84      LDI	R24,0xA4
    014D BF86      OUT	0x36,R24
(0259) 	   Wait();
    014E B626      IN	R2,0x36
    014F FE27      SBRS	R2,7
    0150 CFFD      RJMP	0x014E
(0260) 	   if (TestAck()!=RE_START)  continue;
    0151 B181      IN	R24,0x01
    0152 7F88      ANDI	R24,0xF8
    0153 3180      CPI	R24,0x10
    0154 F009      BEQ	0x0156
    0155 C018      RJMP	0x016E
(0261) 	   
(0262) 	   Write8Bit(rd_device_add);//写I2C从器件地址和读方式
    0156 EA81      LDI	R24,0xA1
    0157 B983      OUT	0x03,R24
    0158 E884      LDI	R24,0x84
    0159 BF86      OUT	0x36,R24
(0263) 	   Wait();
    015A B626      IN	R2,0x36
    015B FE27      SBRS	R2,7
    015C CFFD      RJMP	0x015A
(0264) 	   
(0265) 	   if(TestAck()!=MR_SLA_ACK)  continue;//ACK
    015D B181      IN	R24,0x01
    015E 7F88      ANDI	R24,0xF8
    015F 3480      CPI	R24,0x40
    0160 F009      BEQ	0x0162
    0161 C00C      RJMP	0x016E
(0266) 	   Twi();//启动主I2C读方式
    0162 E884      LDI	R24,0x84
    0163 BF86      OUT	0x36,R24
(0267) 	   
(0268) 	   Wait();
    0164 B626      IN	R2,0x36
    0165 FE27      SBRS	R2,7
    0166 CFFD      RJMP	0x0164
(0269) 	   
(0270) 	   if(TestAck()!=MR_DATA_NOACK) continue;//ACK	
    0167 B181      IN	R24,0x01
    0168 7F88      ANDI	R24,0xF8
    0169 3588      CPI	R24,0x58
    016A F009      BEQ	0x016C
    016B C002      RJMP	0x016E
(0271) 	   temp=TWDR;//读取I2C接收数据
    016C B143      IN	R20,0x03
(0272) 	   
(0273) 	   break;
    016D C006      RJMP	0x0174
    016E 2E26      MOV	R2,R22
    016F 2433      CLR	R3
    0170 5061      SUBI	R22,1
    0171 2022      TST	R2
    0172 F009      BEQ	0x0174
    0173 CFB6      RJMP	0x012A
(0274) 	   }
(0275)        Stop();//I2C停止
    0174 E984      LDI	R24,0x94
    0175 BF86      OUT	0x36,R24
(0276) 	   
(0277) 	   return temp;
FILE: <library>
    0176 2F04      MOV	R16,R20
    0177 940E017A  CALL	pop_gset3
    0179 9508      RET
pop_gset3:
    017A E0E4      LDI	R30,4
    017B 940C0189  JMP	pop
push_gset5:
    017D 92FA      ST	R15,-Y
    017E 92EA      ST	R14,-Y
push_gset4:
    017F 92DA      ST	R13,-Y
    0180 92CA      ST	R12,-Y
push_gset3:
    0181 92BA      ST	R11,-Y
    0182 92AA      ST	R10,-Y
push_gset2:
    0183 937A      ST	R23,-Y
    0184 936A      ST	R22,-Y
push_gset1:
    0185 935A      ST	R21,-Y
    0186 934A      ST	R20,-Y
    0187 9508      RET
pop_gset1:
    0188 E0E1      LDI	R30,1
pop:
    0189 9149      LD	R20,Y+
    018A 9159      LD	R21,Y+
    018B FDE0      SBRC	R30,0
    018C 9508      RET
    018D 9169      LD	R22,Y+
    018E 9179      LD	R23,Y+
    018F FDE1      SBRC	R30,1
    0190 9508      RET
    0191 90A9      LD	R10,Y+
    0192 90B9      LD	R11,Y+
    0193 FDE2      SBRC	R30,2
    0194 9508      RET
    0195 90C9      LD	R12,Y+
    0196 90D9      LD	R13,Y+
    0197 FDE3      SBRC	R30,3
    0198 9508      RET
    0199 90E9      LD	R14,Y+
    019A 90F9      LD	R15,Y+
    019B 9508      RET
push_lset:
    019C 93FA      ST	R31,-Y
    019D 93EA      ST	R30,-Y
    019E 93BA      ST	R27,-Y
    019F 93AA      ST	R26,-Y
    01A0 939A      ST	R25,-Y
    01A1 938A      ST	R24,-Y
    01A2 933A      ST	R19,-Y
    01A3 932A      ST	R18,-Y
    01A4 931A      ST	R17,-Y
    01A5 930A      ST	R16,-Y
    01A6 929A      ST	R9,-Y
    01A7 928A      ST	R8,-Y
    01A8 927A      ST	R7,-Y
    01A9 926A      ST	R6,-Y
    01AA 925A      ST	R5,-Y
    01AB 924A      ST	R4,-Y
    01AC 923A      ST	R3,-Y
    01AD 922A      ST	R2,-Y
    01AE 921A      ST	R1,-Y
    01AF 920A      ST	R0,-Y
    01B0 B60F      IN	R0,0x3F
    01B1 920A      ST	R0,-Y
    01B2 9508      RET
pop_lset:
    01B3 9009      LD	R0,Y+
    01B4 BE0F      OUT	0x3F,R0
    01B5 9009      LD	R0,Y+
    01B6 9019      LD	R1,Y+
    01B7 9029      LD	R2,Y+
    01B8 9039      LD	R3,Y+
    01B9 9049      LD	R4,Y+
    01BA 9059      LD	R5,Y+
    01BB 9069      LD	R6,Y+
    01BC 9079      LD	R7,Y+
    01BD 9089      LD	R8,Y+
    01BE 9099      LD	R9,Y+
    01BF 9109      LD	R16,Y+
    01C0 9119      LD	R17,Y+
    01C1 9129      LD	R18,Y+
    01C2 9139      LD	R19,Y+
    01C3 9189      LD	R24,Y+
    01C4 9199      LD	R25,Y+
    01C5 91A9      LD	R26,Y+
    01C6 91B9      LD	R27,Y+
    01C7 91E9      LD	R30,Y+
    01C8 91F9      LD	R31,Y+
    01C9 9508      RET
_putchar:
    01CA 940E0185  CALL	push_gset1
    01CC 2F40      MOV	R20,R16
    01CD 90200073  LDS	R2,_textmode
    01CF 90300074  LDS	R3,_textmode+1
    01D1 2022      TST	R2
    01D2 F411      BNE	0x01D5
    01D3 2033      TST	R3
    01D4 F021      BEQ	0x01D9
    01D5 304A      CPI	R20,0xA
    01D6 F411      BNE	0x01D9
    01D7 E00D      LDI	R16,0xD
    01D8 DFF1      RCALL	_putchar
    01D9 9B5D      SBIS	0x0B,5
    01DA CFFE      RJMP	0x01D9
    01DB B94C      OUT	0x0C,R20
    01DC 2F04      MOV	R16,R20
    01DD 2711      CLR	R17
    01DE 940E0188  CALL	pop_gset1
    01E0 9508      RET

⌨️ 快捷键说明

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