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

📄 mt.lst

📁 PTR8000无线通信模块的单片机控制程序
💻 LST
📖 第 1 页 / 共 4 页
字号:
    00D7 7840      ANDI	R20,0x80
    00D8 2344      TST	R20
    00D9 F3E1      BEQ	0x00D6
(0143) 		checkstate();
    00DA DF80      RCALL	_checkstate
(0144) 	}
(0145) 	
(0146) 	//发送STOP,退出总线控制
(0147) 	stop();
    00DB DF6C      RCALL	_stop
(0148) }
    00DC D1A1      RCALL	pop_gset4
    00DD 9508      RET
_twiReadByte:
  TWCR_state           --> R10
  i                    --> R20
  ReadAaddress         --> R22
    00DE D1BB      RCALL	push_gset3
    00DF 2F60      MOV	R22,R16
(0149) //************** twi主机接收,从地址为ReadAaddress的从机接收1个字节*************
(0150) // 入口参数1:ReadAaddress:从机地址
(0151) // TWDR中存放的高七位为地址,最低位表示读写控制,0为写,1为读
(0152) //******************************************************************************
(0153) void twiReadByte(unsigned char ReadAaddress)
(0154) {
(0155) 	unsigned char TWCR_state;
(0156) 	char i=0;
    00E0 2744      CLR	R20
(0157) 	error_state=0;
    00E1 2422      CLR	R2
    00E2 92200061  STS	0x61,R2
(0158) 	
(0159) 	//初始化 twi 
(0160) 	twi_init();
    00E4 DF69      RCALL	_twi_init
(0161) 	
(0162) 	//发送START信号
(0163) 	start();
    00E5 DF5D      RCALL	_start
(0164) 	TWCR_state = TWCR & 0x80;
    00E6 B786      IN	R24,0x36
    00E7 7880      ANDI	R24,0x80
    00E8 2EA8      MOV	R10,R24
    00E9 C00A      RJMP	0x00F4
(0165) 	while((TWCR_state == 0x00))
(0166) 	{ 
(0167) 		i++; 
    00EA 9543      INC	R20
(0168) 		if(i>=10){error_state=7;break;}
    00EB 304A      CPI	R20,0xA
    00EC F020      BCS	0x00F1
    00ED E087      LDI	R24,7
    00EE 93800061  STS	0x61,R24
    00F0 C005      RJMP	0x00F6
(0169) 		TWCR_state = TWCR & 0x80;    //轮循等待START信号发送完成
    00F1 B786      IN	R24,0x36
    00F2 7880      ANDI	R24,0x80
    00F3 2EA8      MOV	R10,R24
    00F4 20AA      TST	R10
    00F5 F3A1      BEQ	0x00EA
(0170) 	}	
(0171) 	
(0172) 	//若START信号发送完成,发送读地址,并读取数据
(0173) 	if(error_state==0)
    00F6 90200061  LDS	R2,0x61
    00F8 2022      TST	R2
    00F9 F491      BNE	0x010C
(0174) 	{
(0175) 		TWDR = ReadAaddress;         //发地址
    00FA B963      OUT	0x03,R22
(0176) 		_NOP();
    00FB 0000      NOP
(0177) 		_NOP();
    00FC 0000      NOP
(0178) 		TWCR = (1 << TWINT) | (1 << TWEN)|( 1<<TWIE )|(1 << TWEA);
    00FD EC85      LDI	R24,0xC5
    00FE BF86      OUT	0x36,R24
    00FF C008      RJMP	0x0108
(0179) 		while(error_state==0) 
(0180) 		{i++;if(i>150){error_state=9;break;}};
    0100 9543      INC	R20
    0101 E986      LDI	R24,0x96
    0102 1784      CP	R24,R20
    0103 F420      BCC	0x0108
    0104 E089      LDI	R24,0x9
    0105 93800061  STS	0x61,R24
    0107 C004      RJMP	0x010C
    0108 90200061  LDS	R2,0x61
    010A 2022      TST	R2
    010B F3A1      BEQ	0x0100
(0181) 	}
(0182) 	
(0183) 	//发送STOP,退出总线控制
(0184) 	stop();
    010C DF3B      RCALL	_stop
(0185) }
    010D D16E      RCALL	pop_gset3
    010E 9508      RET
_twi_isr:
  TWSR_state           --> R16
    010F 922A      ST	R2,-Y
    0110 930A      ST	R16,-Y
    0111 931A      ST	R17,-Y
    0112 938A      ST	R24,-Y
    0113 939A      ST	R25,-Y
    0114 93EA      ST	R30,-Y
    0115 B62F      IN	R2,0x3F
    0116 922A      ST	R2,-Y
(0186) //************** twi 中断例程,接收数据 ****************************************
(0187) //******************************************************************************
(0188) //twi中断服务程序
(0189) char twi_isr(void)
(0190) {
(0191) 	unsigned char TWSR_state;
(0192) 	TWSR_state = TWSR & 0xf8;
    0117 B101      IN	R16,0x01
    0118 7F08      ANDI	R16,0xF8
(0193) 	switch(TWSR_state)
    0119 2711      CLR	R17
    011A 3800      CPI	R16,0x80
    011B E0E0      LDI	R30,0
    011C 071E      CPC	R17,R30
    011D F409      BNE	0x011F
    011E C073      RJMP	0x0192
    011F E880      LDI	R24,0x80
    0120 E090      LDI	R25,0
    0121 1780      CP	R24,R16
    0122 0791      CPC	R25,R17
    0123 F40C      BGE	0x0125
    0124 C035      RJMP	0x015A
    0125 3408      CPI	R16,0x48
    0126 E0E0      LDI	R30,0
    0127 071E      CPC	R17,R30
    0128 F409      BNE	0x012A
    0129 C07D      RJMP	0x01A7
    012A E488      LDI	R24,0x48
    012B E090      LDI	R25,0
    012C 1780      CP	R24,R16
    012D 0791      CPC	R25,R17
    012E F0AC      BLT	0x0144
    012F 3308      CPI	R16,0x38
    0130 E0E0      LDI	R30,0
    0131 071E      CPC	R17,R30
    0132 F409      BNE	0x0134
    0133 C06A      RJMP	0x019E
    0134 E388      LDI	R24,0x38
    0135 E090      LDI	R25,0
    0136 1780      CP	R24,R16
    0137 0791      CPC	R25,R17
    0138 F02C      BLT	0x013E
    0139 3000      CPI	R16,0
    013A 0701      CPC	R16,R17
    013B F409      BNE	0x013D
    013C C097      RJMP	0x01D4
    013D C098      RJMP	0x01D6
    013E 3400      CPI	R16,0x40
    013F E0E0      LDI	R30,0
    0140 071E      CPC	R17,R30
    0141 F409      BNE	0x0143
    0142 C061      RJMP	0x01A4
    0143 C092      RJMP	0x01D6
    0144 3508      CPI	R16,0x58
    0145 E0E0      LDI	R30,0
    0146 071E      CPC	R17,R30
    0147 F409      BNE	0x0149
    0148 C06F      RJMP	0x01B8
    0149 E588      LDI	R24,0x58
    014A E090      LDI	R25,0
    014B 1780      CP	R24,R16
    014C 0791      CPC	R25,R17
    014D F034      BLT	0x0154
    014E 3500      CPI	R16,0x50
    014F E0E0      LDI	R30,0
    0150 071E      CPC	R17,R30
    0151 F409      BNE	0x0153
    0152 C05A      RJMP	0x01AD
    0153 C082      RJMP	0x01D6
    0154 3600      CPI	R16,0x60
    0155 E0E0      LDI	R30,0
    0156 071E      CPC	R17,R30
    0157 F409      BNE	0x0159
    0158 C036      RJMP	0x018F
    0159 C07C      RJMP	0x01D6
    015A 3B08      CPI	R16,0xB8
    015B E0E0      LDI	R30,0
    015C 071E      CPC	R17,R30
    015D F409      BNE	0x015F
    015E C06C      RJMP	0x01CB
    015F EB88      LDI	R24,0xB8
    0160 E090      LDI	R25,0
    0161 1780      CP	R24,R16
    0162 0791      CPC	R25,R17
    0163 F0AC      BLT	0x0179
    0164 3A00      CPI	R16,0xA0
    0165 E0E0      LDI	R30,0
    0166 071E      CPC	R17,R30
    0167 F409      BNE	0x0169
    0168 C032      RJMP	0x019B
    0169 EA80      LDI	R24,0xA0
    016A E090      LDI	R25,0
    016B 1780      CP	R24,R16
    016C 0791      CPC	R25,R17
    016D F02C      BLT	0x0173
    016E 3808      CPI	R16,0x88
    016F E0E0      LDI	R30,0
    0170 071E      CPC	R17,R30
    0171 F131      BEQ	0x0198
    0172 C063      RJMP	0x01D6
    0173 3A08      CPI	R16,0xA8
    0174 E0E0      LDI	R30,0
    0175 071E      CPC	R17,R30
    0176 F409      BNE	0x0178
    0177 C04B      RJMP	0x01C3
    0178 C05D      RJMP	0x01D6
    0179 3C08      CPI	R16,0xC8
    017A E0E0      LDI	R30,0
    017B 071E      CPC	R17,R30
    017C F409      BNE	0x017E
    017D C053      RJMP	0x01D1
    017E EC88      LDI	R24,0xC8
    017F E090      LDI	R25,0
    0180 1780      CP	R24,R16
    0181 0791      CPC	R25,R17
    0182 F034      BLT	0x0189
    0183 3C00      CPI	R16,0xC0
    0184 E0E0      LDI	R30,0
    0185 071E      CPC	R17,R30
    0186 F409      BNE	0x0188
    0187 C046      RJMP	0x01CE
    0188 C04D      RJMP	0x01D6
    0189 3F08      CPI	R16,0xF8
    018A E0E0      LDI	R30,0
    018B 071E      CPC	R17,R30
    018C F409      BNE	0x018E
    018D C048      RJMP	0x01D6
    018E C047      RJMP	0x01D6
(0194) 	{
(0195) 		//从机接收模式下的中断程序
(0196)     case 0x60: TWCR=0xc5;break;      	       // SLA+W已经接收,ACK已返回(从机被寻址,等待主机发送数据)
    018F EC85      LDI	R24,0xC5
    0190 BF86      OUT	0x36,R24
    0191 C044      RJMP	0x01D6
(0197)     case 0x80: receive_data = TWDR;TWCR=0xc5;break;  // 数据已接收,ACK已返回(接收数据)
    0192 B023      IN	R2,0x03
    0193 92200060  STS	0x60,R2
    0195 EC85      LDI	R24,0xC5
    0196 BF86      OUT	0x36,R24
    0197 C03E      RJMP	0x01D6
(0198)     case 0x88: TWCR=0xc5;break;			       // 数据已接收,NOT ACK已返回(下一步:退出总线)
    0198 EC85      LDI	R24,0xC5
    0199 BF86      OUT	0x36,R24
    019A C03B      RJMP	0x01D6
(0199) 	case 0xA0: TWCR=0xc5;break;			       // 接收到STOP或重复的START信号(停止接收数据)
    019B EC85      LDI	R24,0xC5
    019C BF86      OUT	0x36,R24
    019D C038      RJMP	0x01D6
(0200) 		
(0201) 		//主机接收模式下的中断程序
(0202)     case 0x38: error_state=4;TWCR=0xc5;break;  // SLA+R或NOT ACK仲裁失败(下一步:退出总线)
    019E E084      LDI	R24,4
    019F 93800061  STS	0x61,R24
    01A1 EC85      LDI	R24,0xC5
    01A2 BF86      OUT	0x36,R24
    01A3 C032      RJMP	0x01D6
(0203) 	case 0x40: TWCR=0xc5; break;               // SLA+R已发送,接收到ACK(从机被寻址,主机等待接收数据)
    01A4 EC85      LDI	R24,0xC5
    01A5 BF86      OUT	0x36,R24
    01A6 C02F      RJMP	0x01D6
(0204) 	case 0x48: error_state=5;TWCR=0xc5;break;  // SLA+R已发送,接收到NOT ACK(下一步:退出总线)
    01A7 E085      LDI	R24,5
    01A8 93800061  STS	0x61,R24
    01AA EC85      LDI	R24,0xC5
    01AB BF86      OUT	0x36,R24
    01AC C029      RJMP	0x01D6
(0205)     case 0x50: receive_data = TWDR;_NOP();_NOP();error_state=8;TWCR = 0xc4;break;	// 接收到数据,ACK已返回(接收数据)
    01AD B023      IN	R2,0x03
    01AE 92200060  STS	0x60,R2
    01B0 0000      NOP
    01B1 0000      NOP
    01B2 E088      LDI	R24,0x8
    01B3 93800061  STS	0x61,R24
    01B5 EC84      LDI	R24,0xC4
    01B6 BF86      OUT	0x36,R24
    01B7 C01E      RJMP	0x01D6
(0206) 	case 0x58: receive_data = TWDR;_NOP();_NOP();error_state=8;TWCR = 0xc4;break;   // 接收到数据,NOT ACK已返回(下一步:退出总线)
    01B8 B023      IN	R2,0x03
    01B9 92200060  STS	0x60,R2
    01BB 0000      NOP
    01BC 0000      NOP
    01BD E088      LDI	R24,0x8
    01BE 93800061  STS	0x61,R24
    01C0 EC84      LDI	R24,0xC4
    01C1 BF86      OUT	0x36,R24
    01C2 C013      RJMP	0x01D6
(0207) 		
(0208) 		//从机发送模式
(0209) 	case 0xA8: TWDR= send_data;_NOP();_NOP();TWCR= 0x85; break; // SLA+R已接收,ACK已返回(从机被寻址,开送发送数据)
    01C3 90200064  LDS	R2,0x64
    01C5 B823      OUT	0x03,R2
    01C6 0000      NOP
    01C7 0000      NOP
    01C8 E885      LDI	R24,0x85
    01C9 BF86      OUT	0x36,R24
    01CA C00B      RJMP	0x01D6
(0210) 	case 0xB8: TWCR= 0xc5;break;              // TWDR里的数据已发送,接受到ACK(主机接收到数据,继续发送数据)
    01CB EC85      LDI	R24,0xC5
    01CC BF86      OUT	0x36,R24
    01CD C008      RJMP	0x01D6
(0211) 	case 0xC0: TWCR= 0xc5;break;			  // TWDR里的数据已发送,接受到NOT ACK(下一步:退出总线)
    01CE EC85      LDI	R24,0xC5
    01CF BF86      OUT	0x36,R24
    01D0 C005      RJMP	0x01D6
(0212) 	case 0xC8: TWCR= 0xc5;break;              // TWEA=0,接收到ACK(停止发送数据,退出发送)
    01D1 EC85      LDI	R24,0xC5
    01D2 BF86      OUT	0x36,R24
    01D3 C002      RJMP	0x01D6
(0213) 		
(0214) 		//其他状态码
(0215) 	case 0xf8: break;						  // 等待或进行当前传输
(0216) 	case 0x00: TWCR= 0x95;break;              // 非法的START或STOP引起的总线错误(释放总线)
    01D4 E985      LDI	R24,0x95
    01D5 BF86      OUT	0x36,R24
(0217)     default:   break;
(0218) 	}
(0219) 	return receive_data;					  // 返回接收到的数据
    01D6 91000060  LDS	R16,0x60
    01D8 9029      LD	R2,Y+
    01D9 BE2F      OUT	0x3F,R2
    01DA 91E9      LD	R30,Y+
    01DB 9199      LD	R25,Y+
    01DC 9189      LD	R24,Y+
    01DD 9119      LD	R17,Y+
    01DE 9109      LD	R16,Y+
    01DF 9029      LD	R2,Y+
    01E0 9518      RETI
FILE: E:\iccavr\无线+I2C\test1--mt\twimain.c

⌨️ 快捷键说明

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