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

📄 24c02.lst

📁 meg16 的所有功能实例
💻 LST
📖 第 1 页 / 共 2 页
字号:
    0109 98A8      CBI	0x15,0
    010A E604      LDI	R16,0x64
    010B E010      LDI	R17,0
    010C DF47      RCALL	_Delay_us
(0209) 	SDA_0;
    010D 98A9      CBI	0x15,1
    010E E604      LDI	R16,0x64
    010F E010      LDI	R17,0
    0110 DF43      RCALL	_Delay_us
(0210) 	SCL_1;
    0111 9AA8      SBI	0x15,0
    0112 E604      LDI	R16,0x64
    0113 E010      LDI	R17,0
    0114 DF3F      RCALL	_Delay_us
(0211) 	
(0212) 	i2c_ddr&=~(1<<SDA);			//设置SDA为输入
    0115 98A1      CBI	0x14,1
(0213) 	i2c_port|=1<<SDA;			    //上拉
    0116 9AA9      SBI	0x15,1
(0214) 	ack=(i2c_pin & (1<<SDA));		//读SDA应答位
    0117 B343      IN	R20,0x13
    0118 7042      ANDI	R20,2
(0215) 	i2c_ddr|=(1<<SDA);			    //恢复为输出
    0119 9AA1      SBI	0x14,1
(0216) 	
(0217) 	SCL_0;
    011A 98A8      CBI	0x15,0
    011B E604      LDI	R16,0x64
    011C E010      LDI	R17,0
    011D DF36      RCALL	_Delay_us
(0218) 	return(ack);
    011E 2F04      MOV	R16,R20
    011F 940E01DE  CALL	pop_gset1
    0121 9508      RET
_IICReceiveByte:
  i                    --> R20
  receivebyte          --> R22
    0122 940E01D9  CALL	push_gset2
(0219) }
(0220) //=======================================================================
(0221) //从IIC总线上读数据。
(0222) unsigned char IICReceiveByte(void)
(0223) {
(0224) 	uint8 receivebyte=0,i=8;
    0124 2766      CLR	R22
    0125 E048      LDI	R20,0x8
(0225) 
(0226) 	i2c_ddr&=~(1<<SDA);			    //设置SDA为输入
    0126 98A1      CBI	0x14,1
(0227) 	i2c_port|=1<<SDA;		            //上拉
    0127 9AA9      SBI	0x15,1
(0228) 	i2c_port&=~(1<<SCL);
    0128 98A8      CBI	0x15,0
    0129 C00C      RJMP	0x0136
(0229) 	
(0230) 	while(i--)
(0231) 	{
(0232) 		SCL_1;
    012A 9AA8      SBI	0x15,0
    012B E604      LDI	R16,0x64
    012C E010      LDI	R17,0
    012D DF26      RCALL	_Delay_us
(0233) 		receivebyte <<= 1;
    012E 0F66      LSL	R22
(0234) 		if(i2c_pin & (1<<SDA)) receivebyte |= 1;
    012F 9B99      SBIS	0x13,1
    0130 C001      RJMP	0x0132
    0131 6061      ORI	R22,1
(0235) 		SCL_0;
    0132 98A8      CBI	0x15,0
    0133 E604      LDI	R16,0x64
    0134 E010      LDI	R17,0
    0135 DF1E      RCALL	_Delay_us
    0136 2E24      MOV	R2,R20
    0137 2433      CLR	R3
    0138 5041      SUBI	R20,1
    0139 2022      TST	R2
    013A F779      BNE	0x012A
(0236) 	}
(0237) 	
(0238) 	i2c_ddr|=(1<<SDA);			       //恢复SDA为输出
    013B 9AA1      SBI	0x14,1
(0239) 	return(receivebyte);
    013C 2F06      MOV	R16,R22
    013D 940E01CD  CALL	pop_gset2
    013F 9508      RET
(0240) }
(0241) 
(0242) 
(0243) //=======================================================================
(0244) //对IIC总线产生应答。读I2C设备时,如果下一步还要读则产生0应答。
(0245) void IICACK(void)
(0246) {
(0247) 	SDA_0;
_IICACK:
    0140 98A9      CBI	0x15,1
    0141 E604      LDI	R16,0x64
    0142 E010      LDI	R17,0
    0143 DF10      RCALL	_Delay_us
(0248) 	SCL_1;
    0144 9AA8      SBI	0x15,0
    0145 E604      LDI	R16,0x64
    0146 E010      LDI	R17,0
    0147 DF0C      RCALL	_Delay_us
(0249) 	SCL_0;
    0148 98A8      CBI	0x15,0
    0149 E604      LDI	R16,0x64
    014A E010      LDI	R17,0
    014B DF08      RCALL	_Delay_us
(0250) 	
(0251) 	SDA_1;
    014C 9AA9      SBI	0x15,1
    014D E604      LDI	R16,0x64
    014E E010      LDI	R17,0
    014F DF04      RCALL	_Delay_us
    0150 9508      RET
(0252) }
(0253) //=======================================================================
(0254) //不对IIC总线产生应答。读I2C设备时,如果下一步不需要读则产生1应答(即不应答)。
(0255) void IICNoAck(void)
(0256) {
(0257) 	SDA_1;
_IICNoAck:
    0151 9AA9      SBI	0x15,1
    0152 E604      LDI	R16,0x64
    0153 E010      LDI	R17,0
    0154 DEFF      RCALL	_Delay_us
(0258) 	SCL_1;
    0155 9AA8      SBI	0x15,0
    0156 E604      LDI	R16,0x64
    0157 E010      LDI	R17,0
    0158 DEFB      RCALL	_Delay_us
(0259) 	SCL_0;
    0159 98A8      CBI	0x15,0
    015A E604      LDI	R16,0x64
    015B E010      LDI	R17,0
    015C DEF7      RCALL	_Delay_us
    015D 9508      RET
_IICSendByte:
  j                    --> R20
  sendbyte             --> R22
    015E 940E01D9  CALL	push_gset2
    0160 2F60      MOV	R22,R16
(0260) }
(0261) //=======================================================================
(0262) //向IIC总线写数据。SCL=0时SDA的数据可改变,SCL=1时需保持SDA数据稳定。
(0263) void IICSendByte(unsigned char sendbyte)
(0264) {
(0265) 	uint8 j=8;
    0161 E048      LDI	R20,0x8
(0266) 	for(;j>0;j--)
    0162 C015      RJMP	0x0178
(0267) 	{
(0268) 		SCL_0;
    0163 98A8      CBI	0x15,0
    0164 E604      LDI	R16,0x64
    0165 E010      LDI	R17,0
    0166 DEED      RCALL	_Delay_us
(0269) 		
(0270) 		if(sendbyte&0x80)	SDA_1		//SCL=0时写数据到SDA 
    0167 FF67      SBRS	R22,7
    0168 C005      RJMP	0x016E
    0169 9AA9      SBI	0x15,1
    016A E604      LDI	R16,0x64
    016B E010      LDI	R17,0
    016C DEE7      RCALL	_Delay_us
    016D C004      RJMP	0x0172
(0271) 		else	            SDA_0
    016E 98A9      CBI	0x15,1
    016F E604      LDI	R16,0x64
    0170 E010      LDI	R17,0
    0171 DEE2      RCALL	_Delay_us
(0272) 		  
(0273) 		sendbyte<<=1;
    0172 0F66      LSL	R22
(0274) 		
(0275) 		SCL_1;
    0173 9AA8      SBI	0x15,0
    0174 E604      LDI	R16,0x64
    0175 E010      LDI	R17,0
    0176 DEDD      RCALL	_Delay_us
    0177 954A      DEC	R20
    0178 2422      CLR	R2
    0179 1624      CP	R2,R20
    017A F340      BCS	0x0163
(0276) 	}
(0277) 	SCL_0;
    017B 98A8      CBI	0x15,0
    017C E604      LDI	R16,0x64
    017D E010      LDI	R17,0
    017E DED5      RCALL	_Delay_us
    017F 940E01CD  CALL	pop_gset2
    0181 9508      RET
_i2c_Read:
  ErrorCount           --> R22
  data                 --> R20
  device               --> R10
  subAddr              --> R12
    0182 940E01D5  CALL	push_gset4
    0184 2EA2      MOV	R10,R18
    0185 2EC0      MOV	R12,R16
(0278) }
(0279) 
(0280) //=======================================================================
(0281) //通过I2C读STA013
(0282) unsigned char i2c_Read(unsigned char subAddr,uint8 device)
(0283) {   
(0284) 	uint8 data=0;
    0186 2744      CLR	R20
(0285) 	uint8 ErrorCount=10;
    0187 E06A      LDI	R22,0xA
    0188 C019      RJMP	0x01A2
(0286) 	//Delay_us(1200);
(0287) 	
(0288) 	while(ErrorCount--)
(0289) 	{
(0290) 		IICStart();
    0189 DF57      RCALL	_IICStart
(0291) 		IICSendByte(device);
    018A 2D0A      MOV	R16,R10
    018B DFD2      RCALL	_IICSendByte
(0292) 		
(0293) 		if(IICRecAck()) continue;			//如果为非0应答,重复写
    018C DF7A      RCALL	_IICRecAck
    018D 2300      TST	R16
    018E F009      BEQ	0x0190
    018F C012      RJMP	0x01A2
(0294) 		
(0295)  		IICSendByte(subAddr);	
    0190 2D0C      MOV	R16,R12
    0191 DFCC      RCALL	_IICSendByte
(0296)  		if(IICRecAck()) continue;	//如果为非0应答,重复写
    0192 DF74      RCALL	_IICRecAck
    0193 2300      TST	R16
    0194 F009      BEQ	0x0196
    0195 C00C      RJMP	0x01A2
(0297)       	IICStart();
    0196 DF4A      RCALL	_IICStart
(0298) 		IICSendByte(device | 0x01);	
    0197 2D0A      MOV	R16,R10
    0198 6001      ORI	R16,1
    0199 DFC4      RCALL	_IICSendByte
(0299) 		if(IICRecAck()) continue;
    019A DF6C      RCALL	_IICRecAck
    019B 2300      TST	R16
    019C F009      BEQ	0x019E
    019D C004      RJMP	0x01A2
(0300) 		
(0301) 		
(0302) 		data=IICReceiveByte();        //读数据,并发出1应答,表示不再读。
    019E DF83      RCALL	_IICReceiveByte
    019F 2F40      MOV	R20,R16
(0303) 		IICNoAck();
    01A0 DFB0      RCALL	_IICNoAck
(0304) 		break;
    01A1 C005      RJMP	0x01A7
    01A2 2E26      MOV	R2,R22
    01A3 2433      CLR	R3
    01A4 5061      SUBI	R22,1
    01A5 2022      TST	R2
    01A6 F711      BNE	0x0189
(0305) 	}
(0306) 	IICStop();	
    01A7 DF4E      RCALL	_IICStop
(0307) 	return data;
    01A8 2F04      MOV	R16,R20
    01A9 940E01D0  CALL	pop_gset4
    01AB 9508      RET
_i2c_Write:
  ErrorCount           --> R20
  data                 --> R22
  device               --> R10
  subAddr              --> R12
    01AC 940E01D5  CALL	push_gset4
    01AE 2EA2      MOV	R10,R18
    01AF 2EC0      MOV	R12,R16
    01B0 8568      LDD	R22,Y+8
(0308) }
(0309) 
(0310) //=======================================================================
(0311) void i2c_Write(unsigned char subAddr,unsigned char device,unsigned char data)
(0312) {
(0313) 	uint8 ErrorCount=10;
    01B1 E04A      LDI	R20,0xA
    01B2 C011      RJMP	0x01C4
(0314) 	
(0315) 	while(ErrorCount--)
(0316) 	{
(0317) 		IICStart();
    01B3 DF2D      RCALL	_IICStart
(0318) 		IICSendByte(device);	
    01B4 2D0A      MOV	R16,R10
    01B5 DFA8      RCALL	_IICSendByte
(0319) 		if(IICRecAck()) continue;			//如果为非0应答,重复写
    01B6 DF50      RCALL	_IICRecAck
    01B7 2300      TST	R16
    01B8 F009      BEQ	0x01BA
    01B9 C00A      RJMP	0x01C4
(0320)  		IICSendByte(subAddr);	
    01BA 2D0C      MOV	R16,R12
    01BB DFA2      RCALL	_IICSendByte
(0321)  		if(IICRecAck()) continue;	//如果为非0应答,重复写
    01BC DF4A      RCALL	_IICRecAck
    01BD 2300      TST	R16
    01BE F009      BEQ	0x01C0
    01BF C004      RJMP	0x01C4
(0322) 		
(0323) 		IICSendByte(data);
    01C0 2F06      MOV	R16,R22
    01C1 DF9C      RCALL	_IICSendByte
(0324)    		IICACK();
    01C2 DF7D      RCALL	_IICACK
(0325)    		
(0326)    		break;
    01C3 C005      RJMP	0x01C9
    01C4 2E24      MOV	R2,R20
    01C5 2433      CLR	R3
    01C6 5041      SUBI	R20,1
    01C7 2022      TST	R2
    01C8 F751      BNE	0x01B3
(0327)     }
(0328) 	
(0329)     IICStop();
FILE: <library>
    01C9 DF2C      RCALL	_IICStop
    01CA 940E01D0  CALL	pop_gset4
    01CC 9508      RET
pop_gset2:
    01CD E0E2      LDI	R30,2
    01CE 940C01DF  JMP	pop
pop_gset4:
    01D0 E0E8      LDI	R30,0x8
    01D1 940C01DF  JMP	pop
push_gset5:
    01D3 92FA      ST	R15,-Y
    01D4 92EA      ST	R14,-Y
push_gset4:
    01D5 92DA      ST	R13,-Y
    01D6 92CA      ST	R12,-Y
push_gset3:
    01D7 92BA      ST	R11,-Y
    01D8 92AA      ST	R10,-Y
push_gset2:
    01D9 937A      ST	R23,-Y
    01DA 936A      ST	R22,-Y
push_gset1:
    01DB 935A      ST	R21,-Y
    01DC 934A      ST	R20,-Y
    01DD 9508      RET
pop_gset1:
    01DE E0E1      LDI	R30,1
pop:
    01DF 9149      LD	R20,Y+
    01E0 9159      LD	R21,Y+
    01E1 FDE0      SBRC	R30,0
    01E2 9508      RET
    01E3 9169      LD	R22,Y+
    01E4 9179      LD	R23,Y+
    01E5 FDE1      SBRC	R30,1
    01E6 9508      RET
    01E7 90A9      LD	R10,Y+
    01E8 90B9      LD	R11,Y+
    01E9 FDE2      SBRC	R30,2
    01EA 9508      RET
    01EB 90C9      LD	R12,Y+
    01EC 90D9      LD	R13,Y+
    01ED FDE3      SBRC	R30,3
    01EE 9508      RET
    01EF 90E9      LD	R14,Y+
    01F0 90F9      LD	R15,Y+
    01F1 9508      RET
push_lset:
    01F2 93FA      ST	R31,-Y
    01F3 93EA      ST	R30,-Y
    01F4 93BA      ST	R27,-Y
    01F5 93AA      ST	R26,-Y
    01F6 939A      ST	R25,-Y
    01F7 938A      ST	R24,-Y
    01F8 933A      ST	R19,-Y
    01F9 932A      ST	R18,-Y
    01FA 931A      ST	R17,-Y
    01FB 930A      ST	R16,-Y
    01FC 929A      ST	R9,-Y
    01FD 928A      ST	R8,-Y
    01FE 927A      ST	R7,-Y
    01FF 926A      ST	R6,-Y
    0200 925A      ST	R5,-Y
    0201 924A      ST	R4,-Y
    0202 923A      ST	R3,-Y
    0203 922A      ST	R2,-Y
    0204 921A      ST	R1,-Y
    0205 920A      ST	R0,-Y
    0206 B60F      IN	R0,0x3F
    0207 920A      ST	R0,-Y
    0208 9508      RET
pop_lset:
    0209 9009      LD	R0,Y+
    020A BE0F      OUT	0x3F,R0
    020B 9009      LD	R0,Y+
    020C 9019      LD	R1,Y+
    020D 9029      LD	R2,Y+
    020E 9039      LD	R3,Y+
    020F 9049      LD	R4,Y+
    0210 9059      LD	R5,Y+
    0211 9069      LD	R6,Y+
    0212 9079      LD	R7,Y+
    0213 9089      LD	R8,Y+
    0214 9099      LD	R9,Y+
    0215 9109      LD	R16,Y+
    0216 9119      LD	R17,Y+
    0217 9129      LD	R18,Y+
    0218 9139      LD	R19,Y+
    0219 9189      LD	R24,Y+
    021A 9199      LD	R25,Y+
    021B 91A9      LD	R26,Y+
    021C 91B9      LD	R27,Y+
    021D 91E9      LD	R30,Y+
    021E 91F9      LD	R31,Y+
    021F 9508      RET

⌨️ 快捷键说明

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