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

📄 uart_to_twi.lst

📁 AVR的M8,GCC平台,内有原理图及代码.
💻 LST
📖 第 1 页 / 共 3 页
字号:
  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 D218      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 D212      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 D0D2      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 9180008C  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 9220008C  STS	Write_Succsee_Flag,R2
(0225) 				
(0226) 				USART_Transmit(UART_TX_buff);//写成功
    016D E900      LDI	R16,0x90
    016E E010      LDI	R17,0
    016F D1DD      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 D1D9      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 D10C      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 9180008B  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 D1C4      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 9220008B  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 E900      LDI	R16,0x90
    0190 E010      LDI	R17,0
    0191 D1BB      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 D170      RCALL	_uart0_init
(0299)  twi_init();
    01B7 D073      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
FILE: H:\程序库\delay.c
(0001) #include <iom8v.h>
(0002) #include <macros.h>
(0003) void delay(unsigned int d)			              	//延时
(0004) {
_delay:
  d                    --> R16
    020B C001      RJMP	0x020D
(0005) 	while (d--)
(0006) 		WDR();																			//喂狗
    020C 95A8      WDR
    020D 0118      MOVW	R2,R16
    020E 5001      SUBI	R16,1
    020F 4010      SBCI	R17,0
    0210 2022      TST	R2
    0211 F7D1      BNE	0x020C
    0212 2033      TST	R3
    0213 F7C1      BNE	0x020C
    0214 9508      RET
(0007) }
(0008) /*				微秒级延时程序	  		*/
(0009) void delay_us(int time)
(0010) 	 {     
(0011)   	  do
(0012) 	  	{
(0013) 		 time--;
_delay_us:
  time                 --> R16
    0215 5001      SUBI	R16,1
    0216 4010      SBCI	R17,0
(0014) 		}	
(0015)   	  while (time>1)WDR();
    0217 E081      LDI	R24,1
    0218 E090      LDI	R25,0
    0219 1780      CP	R24,R16
    021A 0791      CPC	R25,R17
    021B F3CC      BLT	0x0215
    021C 95A8      WDR
    021D 9508      RET
_delay_ms:
  time                 --> R20
    021E D14E      RCALL	push_gset1
    021F 01A8      MOVW	R20,R16
(0016) 	 }	  
(0017) /*	  		    毫秒级延时程序			*/	 
(0018) void delay_ms(unsigned int time)
(0019) 	 {
    0220 C005      RJMP	0x0226
(0020) 	  while(time!=0)
(0021) 	  	  {		
(0022) 		   delay_us(1000);
    0221 EE08      LDI	R16,0xE8
    0222 E013      LDI	R17,3
    0223 DFF1      RCALL	_delay_us
(0023) 		   time--;
    0224 5041      SUBI	R20,1

⌨️ 快捷键说明

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