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

📄 uart_to_twi.lst

📁 AVR单片机的T_TO_TWI通讯方式
💻 LST
📖 第 1 页 / 共 3 页
字号:
(0168) /***********************************************************************
(0169) 通用的hex转成ascii
(0170) ************************************************************************/
(0171) unsigned char general_hex_to_ascii(unsigned char dat)
(0172) {
(0173)     dat = dat & 0x0f;
_general_hex_to_ascii:
  dat                  --> R16
    0130 700F      ANDI	R16,0xF
(0174)     if((dat >= 0)&&(dat <= 9))
    0131 3000      CPI	R16,0
    0132 F028      BCS	0x0138
    0133 E089      LDI	R24,0x9
    0134 1780      CP	R24,R16
    0135 F010      BCS	0x0138
(0175)     {
(0176) 	  dat = dat + 0x30;
    0136 5D00      SUBI	R16,0xD0
(0177) 	}
    0137 C001      RJMP	0x0139
(0178) 	else
(0179) 	{
(0180) 	  dat += 0x37;
    0138 5C09      SUBI	R16,0xC9
(0181) 	}
(0182) 	return dat;
    0139 9508      RET
_show_data:
  dat_buff             --> R22
  dat                  --> R20
    013A D230      RCALL	push_gset2
    013B 2F40      MOV	R20,R16
(0183) }
(0184) /************************************************************************
(0185) 通用的,,用来显示一个变量的值,,送到串口来
(0186) *************************************************************************/
(0187) void show_data(unsigned char dat)
(0188) {
(0189)     unsigned char dat_buff;
(0190) 	
(0191)     dat_buff = dat;
    013C 2F64      MOV	R22,R20
(0192) 	dat >>= 4;
    013D 2F84      MOV	R24,R20
    013E 9582      SWAP	R24
    013F 708F      ANDI	R24,0xF
    0140 2F48      MOV	R20,R24
(0193) 	dat = dat & 0x0f;
    0141 704F      ANDI	R20,0xF
(0194) 	dat = general_hex_to_ascii( dat );
    0142 2F04      MOV	R16,R20
    0143 DFEC      RCALL	_general_hex_to_ascii
(0195) 	USART_TransmitByte(dat);
    0144 D121      RCALL	_USART_TransmitByte
(0196) 	dat = dat_buff;
    0145 2F46      MOV	R20,R22
(0197) 	dat = dat & 0x0f;
    0146 704F      ANDI	R20,0xF
(0198) 	dat = general_hex_to_ascii( dat );
    0147 2F04      MOV	R16,R20
    0148 DFE7      RCALL	_general_hex_to_ascii
    0149 2F40      MOV	R20,R16
(0199) 	USART_TransmitByte(dat);
    014A D11B      RCALL	_USART_TransmitByte
    014B D217      RCALL	pop_gset2
    014C 9508      RET
_twi_transmint:
  dat1_buff            --> Y+2
  dat1                 --> R20
  dat2                 --> R20
    014D D21F      RCALL	push_gset1
    014E 9721      SBIW	R28,1
(0200) }
(0201) //>>>>>>>>>>>>>>>>做包
(0202) void twi_transmint(void)
(0203)  {
(0204)     unsigned char dat1,dat2;
(0205) 	unsigned char dat1_buff;
(0206)   
(0207)     if(Twi_Hex_Data_Flag == true)
    014F 9180007E  LDS	R24,Twi_Hex_Data_Flag
    0151 3081      CPI	R24,1
    0152 F009      BEQ	0x0154
    0153 C03F      RJMP	0x0193
(0208)     {
(0209) 	    
(0210) 	    Twi_Hex_Data_Flag = false;
    0154 2422      CLR	R2
    0155 9220007E  STS	Twi_Hex_Data_Flag,R2
(0211) 		if(Twi_Write_Flag == true)
    0157 91800081  LDS	R24,Twi_Write_Flag
    0159 3081      CPI	R24,1
    015A F4D1      BNE	0x0175
(0212) 		{
(0213) 		    Twi_Write_Flag = false;
    015B 92200081  STS	Twi_Write_Flag,R2
(0214) 	        dat1 = twi_write_byte(Twi_Hex_Data[0],Twi_Hex_Data[1],Twi_Hex_Data[2]);
    015D 9020008A  LDS	R2,Twi_Hex_Data+2
    015F 8228      STD	Y+0,R2
    0160 91200089  LDS	R18,Twi_Hex_Data+1
    0162 91000088  LDS	R16,Twi_Hex_Data
    0164 D133      RCALL	_twi_write_byte
    0165 2F40      MOV	R20,R16
(0215) 		
(0216) 		    #ifdef test
(0217) 			//显示TWI状态字
(0218) 			show_data(dat1);
(0219) 			USART_Transmit("this is write!");
(0220) 			#endif
(0221) 		
(0222) 			if(Write_Succsee_Flag == true)
    0166 918000D1  LDS	R24,Write_Succsee_Flag
    0168 3081      CPI	R24,1
    0169 F439      BNE	0x0171
(0223) 			{
(0224) 				Write_Succsee_Flag = false;
    016A 2422      CLR	R2
    016B 922000D1  STS	Write_Succsee_Flag,R2
(0225) 				
(0226) 				USART_Transmit(UART_TX_buff);//写成功
    016D E80E      LDI	R16,0x8E
    016E E010      LDI	R17,0
    016F D0E6      RCALL	_USART_Transmit
(0227) 				#ifdef test
(0228) 				USART_Transmit("write successfully!");
(0229) 				#endif
(0230) 			}
    0170 C003      RJMP	0x0174
(0231) 			else
(0232) 			{
(0233) 				USART_Transmit(Write_Error);//写不成功
    0171 E609      LDI	R16,0x69
    0172 E010      LDI	R17,0
    0173 D0E2      RCALL	_USART_Transmit
(0234) 				#ifdef test
(0235) 			    USART_Transmit("write error!");
(0236) 				#endif
(0237) 			}
(0238) 			WDR();
    0174 95A8      WDR
(0239) 		}
(0240) 		if(Twi_Read_Flag == true)
    0175 91800080  LDS	R24,Twi_Read_Flag
    0177 3081      CPI	R24,1
    0178 F4D1      BNE	0x0193
(0241)         {
(0242) 			Twi_Read_Flag = false;
    0179 2422      CLR	R2
    017A 92200080  STS	Twi_Read_Flag,R2
(0243) 			dat2 = twi_read_byte(Twi_Hex_Data[0],Twi_Hex_Data[1]);
    017C 91200089  LDS	R18,Twi_Hex_Data+1
    017E 91000088  LDS	R16,Twi_Hex_Data
    0180 D16D      RCALL	_twi_read_byte
    0181 2F40      MOV	R20,R16
(0244) 			#ifdef test
(0245) 			show_data(dat2);
(0246) 			USART_Transmit("this is read!");
(0247) 			#endif
(0248) 			
(0249) 			if(Read_Succsee_Flag  != true)
    0182 918000D0  LDS	R24,Read_Succsee_Flag
    0184 3081      CPI	R24,1
    0185 F021      BEQ	0x018A
(0250) 			{
(0251) 				USART_Transmit(Read_Error);//读失败
    0186 E60F      LDI	R16,0x6F
    0187 E010      LDI	R17,0
    0188 D0CD      RCALL	_USART_Transmit
(0252) 				#ifdef test
(0253) 				USART_Transmit("read error!");
(0254) 				#endif
(0255) 			}
    0189 C008      RJMP	0x0192
(0256) 			else
(0257) 			{
(0258) 				Read_Succsee_Flag  = false;
    018A 2422      CLR	R2
    018B 922000D0  STS	Read_Succsee_Flag,R2
(0259) 				
(0260) 				hex_to_ascii(dat2);//读成功 且读的数在dat2中				
    018D 2F04      MOV	R16,R20
    018E DF82      RCALL	_hex_to_ascii
(0261) 				USART_Transmit(UART_TX_buff);
    018F E80E      LDI	R16,0x8E
    0190 E010      LDI	R17,0
    0191 D0C4      RCALL	_USART_Transmit
(0262) 				#ifdef test
(0263) 				USART_Transmit("read successfully!");
(0264) 				#endif
(0265) 			}
(0266) 			WDR();
    0192 95A8      WDR
(0267) 		}
(0268) 	}
    0193 9621      ADIW	R28,1
    0194 D1DB      RCALL	pop_gset1
    0195 9508      RET
(0269)  }
(0270) 
(0271) void init_data(void)
(0272) {
(0273)    Twi_Write_Flag     = false;
_init_data:
    0196 2422      CLR	R2
    0197 92200081  STS	Twi_Write_Flag,R2
(0274)    Twi_Read_Flag      = false;
    0199 92200080  STS	Twi_Read_Flag,R2
(0275)    Twi_Hex_Data_Flag  = false;      
    019B 9220007E  STS	Twi_Hex_Data_Flag,R2
(0276)    Twi_ASCI_Data_Flag = false;
    019D 9220007F  STS	Twi_ASCI_Data_Flag,R2
(0277)    Slave_Led_Status   = LED_OFF;
    019F 9220007D  STS	Slave_Led_Status,R2
(0278)    Main_Led_Status    = LED_OFF;
    01A1 9220007C  STS	Main_Led_Status,R2
(0279)    Cur_Main_Led_Status= LED_OFF;
    01A3 9220007B  STS	Cur_Main_Led_Status,R2
(0280)    Count_10ms         = 0;
    01A5 9220007A  STS	Count_10ms,R2
(0281)    WDR();
    01A7 95A8      WDR
    01A8 9508      RET
(0282) }
(0283) void port_init(void)
(0284) {
(0285)  PORTB = 0x3F;
_port_init:
    01A9 E38F      LDI	R24,0x3F
    01AA BB88      OUT	0x18,R24
(0286)  DDRB  = 0x00;
    01AB 2422      CLR	R2
    01AC BA27      OUT	0x17,R2
(0287)  PORTC = 0x4F; //m103 output only
    01AD E48F      LDI	R24,0x4F
    01AE BB85      OUT	0x15,R24
(0288)  DDRC  = 0x00;
    01AF BA24      OUT	0x14,R2
(0289)  PORTD = 0xFC;
    01B0 EF8C      LDI	R24,0xFC
    01B1 BB82      OUT	0x12,R24
(0290)  DDRD  = 0x00;
    01B2 BA21      OUT	0x11,R2
    01B3 9508      RET
(0291) }
(0292) //call this routine to initialize all peripherals
(0293) void init_devices(void)
(0294) {
(0295)  //stop errant interrupts until set up
(0296)  CLI(); //disable all interrupts
_init_devices:
    01B4 94F8      BCLR	7
(0297)  port_init();
    01B5 DFF3      RCALL	_port_init
(0298)  uart0_init();
    01B6 D079      RCALL	_uart0_init
(0299)  twi_init();
    01B7 D0D4      RCALL	_twi_init
(0300)  timer0_init();
    01B8 D00D      RCALL	_timer0_init
(0301)  watchdog_init();
    01B9 D008      RCALL	_watchdog_init
(0302) 
(0303)  MCUCR = 0x00;
    01BA 2422      CLR	R2
    01BB BE25      OUT	0x35,R2
(0304)  GICR  = 0x00;
    01BC BE2B      OUT	0x3B,R2
(0305)  TIMSK = 0x00; //timer interrupt sources
    01BD BE29      OUT	0x39,R2
(0306)  SEI(); //re-enable interrupts
    01BE 9478      BSET	7
    01BF 9508      RET
(0307)  //all peripherals are now initialized
(0308) }
(0309) void check_watchdog(void)
(0310) {
(0311)  	WDR();//喂狗
_check_watchdog:
    01C0 95A8      WDR
    01C1 9508      RET
(0312) }
(0313) void watchdog_init(void)
(0314) {
(0315)  WDR();//看门狗计数清零
_watchdog_init:
    01C2 95A8      WDR
(0316)  WDTCR=((1<<WDE)|(1<<WDP2)|(1<<WDP0));//64K分频,0.52S
    01C3 E08D      LDI	R24,0xD
    01C4 BD81      OUT	0x21,R24
    01C5 9508      RET
(0317)  //WDIE是看门狗中断使能,WDE看门狗使能 101 512k
(0318) }
(0319) 
(0320) //TIMER0 initialize - prescale:256
(0321) // desired value: 100Hz
(0322) // actual value: 100.000Hz (0.0%)
(0323) void timer0_init(void)
(0324) {
(0325)  TCCR0 = 0x00; //stop
_timer0_init:
    01C6 2422      CLR	R2
    01C7 BE23      OUT	0x33,R2
(0326)  TCNT0 = 0x4C; //set count
    01C8 E48C      LDI	R24,0x4C
    01C9 BF82      OUT	0x32,R24
(0327)  TCCR0 = 0x04; //start timer
    01CA E084      LDI	R24,4
    01CB BF83      OUT	0x33,R24
    01CC 9508      RET
_timer0_ovf_isr:
    01CD 922A      ST	R2,-Y
    01CE 938A      ST	R24,-Y
    01CF 939A      ST	R25,-Y
    01D0 B62F      IN	R2,0x3F
    01D1 922A      ST	R2,-Y
(0328) }
(0329) 
(0330) #pragma interrupt_handler timer0_ovf_isr:10
(0331) void timer0_ovf_isr(void)
(0332) {
(0333)     TCNT0 = 0x4C; //reload counter value
    01D2 E48C      LDI	R24,0x4C
    01D3 BF82      OUT	0x32,R24
(0334)     //主灯
(0335)     Count_10ms++;
    01D4 9180007A  LDS	R24,Count_10ms
    01D6 5F8F      SUBI	R24,0xFF
    01D7 9380007A  STS	Count_10ms,R24
(0336)     if((Count_10ms>0)&&(Count_10ms<5))
    01D9 2422      CLR	R2
    01DA 1628      CP	R2,R24
    01DB F428      BCC	0x01E1
    01DC 3085      CPI	R24,5
    01DD F418      BCC	0x01E1
(0337)     {
(0338)        Cur_Main_Led_Status = LED_ON;
    01DE E081      LDI	R24,1
    01DF 9380007B  STS	Cur_Main_Led_Status,R24
(0339) 	}
(0340)     if((Count_10ms>5)&&(Count_10ms<10))
    01E1 E085      LDI	R24,5
    01E2 9020007A  LDS	R2,Count_10ms
    01E4 1582      CP	R24,R2
    01E5 F430      BCC	0x01EC
    01E6 2D82      MOV	R24,R2
    01E7 308A      CPI	R24,0xA
    01E8 F418      BCC	0x01EC
(0341)     {
(0342)       Cur_Main_Led_Status = LED_OFF;
    01E9 2422      CLR	R2
    01EA 9220007B  STS	Cur_Main_Led_Status,R2
(0343)     }
    01EC 9029      LD	R2,Y+
    01ED BE2F      OUT	0x3F,R2
    01EE 9199      LD	R25,Y+
    01EF 9189      LD	R24,Y+
    01F0 9029      LD	R2,Y+
    01F1 9518      RETI
(0344) }
(0345) void check_main_led(void)
(0346) {
(0347)    if(Main_Led_Status != Cur_Main_Led_Status)
_check_main_led:
    01F2 9020007B  LDS	R2,Cur_Main_Led_Status
    01F4 9030007C  LDS	R3,Main_Led_Status
    01F6 1432      CP	R3,R2
    01F7 F051      BEQ	0x0202
(0348)    {
(0349)  	  if(Main_Led_Status == LED_ON) 	   Main_Led_Off();
    01F8 2D83      MOV	R24,R3
    01F9 3081      CPI	R24,1
    01FA F411      BNE	0x01FD
    01FB 9A93      SBI	0x12,3
    01FC C001      RJMP	0x01FE
(0350) 	  else		   	  		   	   Main_Led_On();
    01FD 9893      CBI	0x12,3
(0351) 	  Main_Led_Status = Cur_Main_Led_Status;
    01FE 9020007B  LDS	R2,Cur_Main_Led_Status
    0200 9220007C  STS	Main_Led_Status,R2
(0352)    }
    0202 9508      RET
(0353) }
(0354) void check_slave_led(void)
(0355) {
(0356)     if(Slave_Led_Status == LED_ON) 
_check_slave_led:
    0203 9180007D  LDS	R24,Slave_Led_Status
    0205 3081      CPI	R24,1
    0206 F411      BNE	0x0209
(0357)     {
(0358)       Slave_Led_On();
    0207 9892      CBI	0x12,2
(0359) 	}
    0208 C001      RJMP	0x020A
(0360) 	else		   	  		   	  
(0361)     {
(0362)       Slave_Led_Off();
    0209 9A92      SBI	0x12,2
(0363)     }
    020A 9508      RET
_uart0_rx_isr:
    020B 922A      ST	R2,-Y
    020C 938A      ST	R24,-Y
    020D 939A      ST	R25,-Y
    020E 93EA      ST	R30,-Y
    020F 93FA      ST	R31,-Y
    0210 B62F      IN	R2,0x3F
    0211 922A      ST	R2,-Y
    0212 EA8E      LDI	R24,0xAE
    0213 E090      LDI	R25,0
    0214 91E0008B  LDS	R30,Rx_Count
    0216 27FF      CLR	R31
    0217 0FE8      ADD	R30,R24
    0218 1FF9      ADC	R31,R25
    0219 B02C      IN	R2,0x0C
    021A 8220      STD	Z+0,R2
    021B 9180008B  LDS	R24,Rx_Count
    021D 5F8F      SUBI	R24,0xFF
    021E 9380008B  STS	Rx_Count,R24
    0220 3089      CPI	R24,0x9
    0221 F431      BNE	0x0228
    0222 E081      LDI	R24,1
    0223 9380008D  STS	Rx_Flag,R24
    0225 2422      CLR	R2
    0226 9220008B  STS	Rx_Count,R2
    0228 9029      LD	R2,Y+
    0229 BE2F      OUT	0x3F,R2
    022A 91F9      LD	R31,Y+
    022B 91E9      LD	R30,Y+
    022C 9199      LD	R25,Y+
    022D 9189      LD	R24,Y+
    022E 9029      LD	R2,Y+
    022F 9518      RETI
_uart0_init:
    0230 2422      CLR	R2
    0231 9220008B  STS	Rx_Count,R2
    0233 9220008D  STS	Rx_Flag,R2
    0235 922000CF  STS	Rx_Start_Pack_Flag,R2
    0237 922000CE  STS	Rx_Over_Pack_Flag,R2
    0239 B82A      OUT	0x0A,R2
    023A B82B      OUT	0x0B,R2
    023B E886      LDI	R24,0x86

⌨️ 快捷键说明

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