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

📄 uart_to_twi.lst

📁 AVR单片机的T_TO_TWI通讯方式
💻 LST
📖 第 1 页 / 共 3 页
字号:
__text_start:
__start:
    0020 E5CF      LDI	R28,0x5F
    0021 E0D4      LDI	R29,4
    0022 BFCD      OUT	0x3D,R28
    0023 BFDE      OUT	0x3E,R29
    0024 51C0      SUBI	R28,0x10
    0025 40D0      SBCI	R29,0
    0026 EA0A      LDI	R16,0xAA
    0027 8308      STD	Y+0,R16
    0028 2400      CLR	R0
    0029 E7EA      LDI	R30,0x7A
    002A E0F0      LDI	R31,0
    002B E010      LDI	R17,0
    002C 3DE2      CPI	R30,0xD2
    002D 07F1      CPC	R31,R17
    002E F011      BEQ	0x0031
    002F 9201      ST	R0,Z+
    0030 CFFB      RJMP	0x002C
    0031 8300      STD	Z+0,R16
    0032 E2E6      LDI	R30,0x26
    0033 E0F0      LDI	R31,0
    0034 E6A0      LDI	R26,0x60
    0035 E0B0      LDI	R27,0
    0036 E010      LDI	R17,0
    0037 34E0      CPI	R30,0x40
    0038 07F1      CPC	R31,R17
    0039 F021      BEQ	0x003E
    003A 95C8      LPM
    003B 9631      ADIW	R30,1
    003C 920D      ST	R0,X+
    003D CFF9      RJMP	0x0037
    003E D001      RCALL	_main
_exit:
    003F CFFF      RJMP	_exit
FILE: F:\UART_TO_TWI\uart_to_twi_m8.c
(0001) /*****************************************************************
(0002) ICC-AVR application builder : 2005-8-19 14:40:53
(0003)  Target : M8
(0004)  Crystal: 7.3728Mhz
(0005) // Crystal: 4.6080Mhz
(0006) 
(0007) 实验:做usart串行通讯实验
(0008) 目的:了解及会使用usart串口
(0009) CPU:atmega8L
(0010) 相关的5个寄存器:UCSRA,UCSRB,UCSRC,UDR,UBRR(UBRRH,UBRRL)
(0011) 	         其中:UBRRH和UCSRC共用一个地址
(0012) ******************************************************************/
(0013) /*配置:CKOPT=0,CKSEL3..0=1111,SUT1..0=11(65ms慢速上升电源)*/
(0014) #include <iom8v.h>
(0015) #include <macros.h>
(0016) #include "usart_m8.h"
(0017) #include "twi_master_polling.h"
(0018) 
(0019) //#define test
(0020) 
(0021) #define LED_ON   1
(0022) #define LED_OFF  0
(0023) 
(0024) #define IO_OUT_MAIN_LED   3 //PD3 pin1
(0025) #define IO_OUT_SLAVE_LED  2 //PD2 pin32
(0026) 
(0027) #define  Main_Led_Off()    PORTD |= BIT(IO_OUT_MAIN_LED)
(0028) #define  Slave_Led_Off()   PORTD |= BIT(IO_OUT_SLAVE_LED)
(0029) #define  Main_Led_On()     PORTD &= ~BIT(IO_OUT_MAIN_LED)
(0030) #define  Slave_Led_On()    PORTD &= ~BIT(IO_OUT_SLAVE_LED)
(0031) 
(0032) void init_data(void);
(0033) void port_init(void);
(0034) void init_devices(void);
(0035) void timer0_init(void);
(0036) void check_watchdog(void);
(0037) void process_data_pack(void);
(0038) void twi_transmint(void);
(0039) void watchdog_init(void);
(0040) void check_main_led(void);
(0041) void check_slave_led(void);
(0042) void ascii_to_hex(void);
(0043) void show_data(unsigned char dat);
(0044) 
(0045) unsigned char Twi_Hex_Data[3];
(0046) unsigned char Twi_ASCI_Data[6];
(0047) unsigned char Twi_Write_Flag,Twi_Read_Flag;
(0048) unsigned char Twi_ASCI_Data_Flag,Twi_Hex_Data_Flag;
(0049) //LED指示灯
(0050) unsigned char Slave_Led_Status;
(0051) unsigned char Main_Led_Status,Cur_Main_Led_Status,Count_10ms;
(0052) 
(0053) 
(0054) 
(0055) void main(void)
(0056) {
(0057) 	init_devices();
_main:
    0040 D173      RCALL	_init_devices
(0058) 	init_data();
    0041 D154      RCALL	_init_data
(0059)     
(0060) 	USART_Transmit( "read go!" );//用来指示,是不是看门狗复位
    0042 E600      LDI	R16,0x60
    0043 E010      LDI	R17,0
    0044 D211      RCALL	_USART_Transmit
    0045 C005      RJMP	0x004B
(0061) 	while(1)  //forever
(0062) 	   {
(0063) 		  UART_Receive();
    0046 D1FC      RCALL	_UART_Receive
(0064) 		  check_watchdog();//喂狗
    0047 D178      RCALL	_check_watchdog
(0065) 	      process_data_pack();//解包
    0048 D004      RCALL	_process_data_pack
(0066) 		  //while(1)WDR();
(0067) 		  twi_transmint();
    0049 D103      RCALL	_twi_transmint
(0068) 	      //while(1)WDR();
(0069) 		  check_main_led();
    004A D1A7      RCALL	_check_main_led
    004B CFFA      RJMP	0x0046
    004C 9508      RET
_process_data_pack:
  dat                  --> R22
  cnt                  --> R20
    004D D31D      RCALL	push_gset2
(0070) 		}
(0071)        
(0072) }
(0073) //>>>>>>>>>>>>>>>>>>>>>>>>解包
(0074) void process_data_pack(void)
(0075) {
(0076)    unsigned char cnt,dat;
(0077)    
(0078)    if(Rx_Over_Pack_Flag == true)
    004E 918000CE  LDS	R24,Rx_Over_Pack_Flag
    0050 3081      CPI	R24,1
    0051 F009      BEQ	0x0053
    0052 C08A      RJMP	0x00DD
(0079)     {   
(0080) 	    //从灯
(0081) 		Slave_Led_Status = LED_ON;
    0053 E081      LDI	R24,1
    0054 9380007D  STS	Slave_Led_Status,R24
(0082) 		check_slave_led();//先让通讯亮一下
    0056 D1AC      RCALL	_check_slave_led
(0083) 		Rx_Over_Pack_Flag = false;
    0057 2422      CLR	R2
    0058 922000CE  STS	Rx_Over_Pack_Flag,R2
(0084) 		Slave_Led_Status = LED_OFF;
    005A 9220007D  STS	Slave_Led_Status,R2
(0085) 
(0086) 		if(UART_RX_buff[1] == 0x57)
    005C 918000AF  LDS	R24,UART_RX_buff+1
    005E 3587      CPI	R24,0x57
    005F F569      BNE	0x008D
(0087) 		{
(0088) 		   for(cnt =0;cnt<6;cnt++)
    0060 2744      CLR	R20
    0061 C025      RJMP	0x0087
(0089) 		    {
(0090) 			   dat = UART_RX_buff[cnt+2];//前面两个字节是'x','w'或'R'
    0062 EB80      LDI	R24,0xB0
    0063 E090      LDI	R25,0
    0064 2FE4      MOV	R30,R20
    0065 27FF      CLR	R31
    0066 0FE8      ADD	R30,R24
    0067 1FF9      ADC	R31,R25
    0068 8160      LDD	R22,Z+0
(0091) 			   if((dat >= 0x30)&&(dat <=0x39))
    0069 3360      CPI	R22,0x30
    006A F068      BCS	0x0078
    006B E389      LDI	R24,0x39
    006C 1786      CP	R24,R22
    006D F050      BCS	0x0078
(0092) 			    {
(0093) 				  Twi_ASCI_Data[cnt] = dat - 0x30;
    006E E882      LDI	R24,0x82
    006F E090      LDI	R25,0
    0070 2FE4      MOV	R30,R20
    0071 27FF      CLR	R31
    0072 0FE8      ADD	R30,R24
    0073 1FF9      ADC	R31,R25
    0074 2F86      MOV	R24,R22
    0075 5380      SUBI	R24,0x30
    0076 8380      STD	Z+0,R24
(0094) 				}
    0077 C00E      RJMP	0x0086
(0095) 			   else if((dat>=0x41)&&(dat<=0x46))
    0078 3461      CPI	R22,0x41
    0079 F060      BCS	0x0086
    007A E486      LDI	R24,0x46
    007B 1786      CP	R24,R22
    007C F048      BCS	0x0086
(0096) 			    {
(0097) 				  Twi_ASCI_Data[cnt] = dat - 0x37;//如果是字母,那么减去0x37
    007D E882      LDI	R24,0x82
    007E E090      LDI	R25,0
    007F 2FE4      MOV	R30,R20
    0080 27FF      CLR	R31
    0081 0FE8      ADD	R30,R24
    0082 1FF9      ADC	R31,R25
    0083 2F86      MOV	R24,R22
    0084 5387      SUBI	R24,0x37
    0085 8380      STD	Z+0,R24
    0086 9543      INC	R20
    0087 3046      CPI	R20,6
    0088 F2C8      BCS	0x0062
(0098) 				}
(0099) 		    }
(0100) 			ascii_to_hex();//组合成数据
    0089 D055      RCALL	_ascii_to_hex
(0101) 		   Twi_Write_Flag = true;
    008A E081      LDI	R24,1
    008B 93800081  STS	Twi_Write_Flag,R24
(0102) 		}
(0103) 		if(UART_RX_buff[1] == 0x52)
    008D 918000AF  LDS	R24,UART_RX_buff+1
    008F 3582      CPI	R24,0x52
    0090 F569      BNE	0x00BE
(0104) 		{
(0105) 		   for(cnt =0;cnt<4;cnt++)
    0091 2744      CLR	R20
    0092 C025      RJMP	0x00B8
(0106) 		    {
(0107) 			   dat = UART_RX_buff[cnt+2];
    0093 EB80      LDI	R24,0xB0
    0094 E090      LDI	R25,0
    0095 2FE4      MOV	R30,R20
    0096 27FF      CLR	R31
    0097 0FE8      ADD	R30,R24
    0098 1FF9      ADC	R31,R25
    0099 8160      LDD	R22,Z+0
(0108) 			   if((dat >= 0x30)&&(dat <=0x39))
    009A 3360      CPI	R22,0x30
    009B F068      BCS	0x00A9
    009C E389      LDI	R24,0x39
    009D 1786      CP	R24,R22
    009E F050      BCS	0x00A9
(0109) 			    {
(0110) 				  Twi_ASCI_Data[cnt] = dat - 0x30;
    009F E882      LDI	R24,0x82
    00A0 E090      LDI	R25,0
    00A1 2FE4      MOV	R30,R20
    00A2 27FF      CLR	R31
    00A3 0FE8      ADD	R30,R24
    00A4 1FF9      ADC	R31,R25
    00A5 2F86      MOV	R24,R22
    00A6 5380      SUBI	R24,0x30
    00A7 8380      STD	Z+0,R24
(0111) 				}
    00A8 C00E      RJMP	0x00B7
(0112) 			   else if((dat>=0x41)&&(dat<=0x46))
    00A9 3461      CPI	R22,0x41
    00AA F060      BCS	0x00B7
    00AB E486      LDI	R24,0x46
    00AC 1786      CP	R24,R22
    00AD F048      BCS	0x00B7
(0113) 			    {
(0114) 				  Twi_ASCI_Data[cnt] = dat - 0x37;//如果是字母,那么减去0x37
    00AE E882      LDI	R24,0x82
    00AF E090      LDI	R25,0
    00B0 2FE4      MOV	R30,R20
    00B1 27FF      CLR	R31
    00B2 0FE8      ADD	R30,R24
    00B3 1FF9      ADC	R31,R25
    00B4 2F86      MOV	R24,R22
    00B5 5387      SUBI	R24,0x37
    00B6 8380      STD	Z+0,R24
    00B7 9543      INC	R20
    00B8 3044      CPI	R20,4
    00B9 F2C8      BCS	0x0093
(0115) 				}
(0116) 		    }
(0117) 			ascii_to_hex();
    00BA D024      RCALL	_ascii_to_hex
(0118) 		   Twi_Read_Flag = true;
    00BB E081      LDI	R24,1
    00BC 93800080  STS	Twi_Read_Flag,R24
(0119) 		}
(0120) 		Twi_Hex_Data_Flag = true;
    00BE E081      LDI	R24,1
    00BF 9380007E  STS	Twi_Hex_Data_Flag,R24
(0121) 		//处理完,先把数据放在UART_TX_buff[]绶冲区,且接收绶冲区清零
(0122) 		for(cnt=0;cnt<9;cnt++)
    00C1 2744      CLR	R20
    00C2 C017      RJMP	0x00DA
(0123) 		{
(0124) 		   UART_TX_buff[cnt] = UART_RX_buff[cnt];
    00C3 EA8E      LDI	R24,0xAE
    00C4 E090      LDI	R25,0
    00C5 2FE4      MOV	R30,R20
    00C6 27FF      CLR	R31
    00C7 0FE8      ADD	R30,R24
    00C8 1FF9      ADC	R31,R25
    00C9 8020      LDD	R2,Z+0
    00CA E88E      LDI	R24,0x8E
    00CB E090      LDI	R25,0
    00CC 2FE4      MOV	R30,R20
    00CD 27FF      CLR	R31
    00CE 0FE8      ADD	R30,R24
    00CF 1FF9      ADC	R31,R25
    00D0 8220      STD	Z+0,R2
(0125) 		   UART_RX_buff[cnt] = 0;
    00D1 EA8E      LDI	R24,0xAE
    00D2 E090      LDI	R25,0
    00D3 2FE4      MOV	R30,R20
    00D4 27FF      CLR	R31
    00D5 0FE8      ADD	R30,R24
    00D6 1FF9      ADC	R31,R25
    00D7 2422      CLR	R2
    00D8 8220      STD	Z+0,R2
    00D9 9543      INC	R20
    00DA 3049      CPI	R20,0x9
    00DB F338      BCS	0x00C3
(0126) 		}
(0127) 		WDR();
    00DC 95A8      WDR
(0128) 	}
    00DD D285      RCALL	pop_gset2
    00DE 9508      RET
(0129) }
(0130) //继续解包,=>两个ASCII码组成一个数
(0131) void ascii_to_hex(void)
(0132) {
(0133)     unsigned char cnt,i;
(0134)    
(0135) 	for(cnt=0,i=0;cnt<6;cnt++,cnt++,i++)
_ascii_to_hex:
  i                    --> R16
  cnt                  --> R18
    00DF 2722      CLR	R18
    00E0 2700      CLR	R16
    00E1 C02B      RJMP	0x010D
(0136) 	{
(0137) 	  Twi_Hex_Data[i] = Twi_ASCI_Data[cnt];//先放ASCII的高位(四位)
    00E2 E882      LDI	R24,0x82
    00E3 E090      LDI	R25,0
    00E4 2FE2      MOV	R30,R18
    00E5 27FF      CLR	R31
    00E6 0FE8      ADD	R30,R24
    00E7 1FF9      ADC	R31,R25
    00E8 8020      LDD	R2,Z+0
    00E9 E888      LDI	R24,0x88
    00EA E090      LDI	R25,0
    00EB 2FE0      MOV	R30,R16
    00EC 27FF      CLR	R31
    00ED 0FE8      ADD	R30,R24
    00EE 1FF9      ADC	R31,R25
    00EF 8220      STD	Z+0,R2
(0138) 	  Twi_Hex_Data[i] <<= 4;
    00F0 2E20      MOV	R2,R16
    00F1 2433      CLR	R3
    00F2 0E28      ADD	R2,R24
    00F3 1E39      ADC	R3,R25
    00F4 01F1      MOVW	R30,R2
    00F5 8180      LDD	R24,Z+0
    00F6 708F      ANDI	R24,0xF
    00F7 9582      SWAP	R24
    00F8 8380      STD	Z+0,R24
(0139) 	  Twi_Hex_Data[i] += Twi_ASCI_Data[cnt+1];
    00F9 E888      LDI	R24,0x88
    00FA E090      LDI	R25,0
    00FB 2E20      MOV	R2,R16
    00FC 2433      CLR	R3
    00FD 0E28      ADD	R2,R24
    00FE 1E39      ADC	R3,R25
    00FF E883      LDI	R24,0x83
    0100 E090      LDI	R25,0
    0101 2FE2      MOV	R30,R18
    0102 27FF      CLR	R31
    0103 0FE8      ADD	R30,R24
    0104 1FF9      ADC	R31,R25
    0105 8040      LDD	R4,Z+0
    0106 01F1      MOVW	R30,R2
    0107 8050      LDD	R5,Z+0
    0108 0C54      ADD	R5,R4
    0109 8250      STD	Z+0,R5
    010A 9523      INC	R18
    010B 9523      INC	R18
    010C 9503      INC	R16
    010D 3026      CPI	R18,6
    010E F408      BCC	0x0110
    010F CFD2      RJMP	0x00E2
    0110 9508      RET
_hex_to_ascii:
  dat_buff             --> R20
  dat                  --> R16
    0111 D25B      RCALL	push_gset1
(0140) 	}
(0141) }
(0142) void hex_to_ascii(unsigned char dat)
(0143) {
(0144)     unsigned char dat_buff;
(0145)   
(0146)     dat_buff = dat;
    0112 2F40      MOV	R20,R16
(0147)     dat = dat&0x0f;
    0113 700F      ANDI	R16,0xF
(0148)     if((dat>=0)&&(dat<=9))
    0114 3000      CPI	R16,0
    0115 F028      BCS	0x011B
    0116 E089      LDI	R24,0x9
    0117 1780      CP	R24,R16
    0118 F010      BCS	0x011B
(0149)     {
(0150)        dat += 0x30;
    0119 5D00      SUBI	R16,0xD0
(0151)     }
    011A C001      RJMP	0x011C
(0152)     else
(0153)        dat += 0x37;
    011B 5C09      SUBI	R16,0xC9
(0154) 	UART_TX_buff[7] = dat;
    011C 93000095  STS	0x95,R16
(0155) 	  
(0156)     dat = dat_buff;
    011E 2F04      MOV	R16,R20
(0157) 	dat >>= 4;
    011F 2F80      MOV	R24,R16
    0120 9582      SWAP	R24
    0121 708F      ANDI	R24,0xF
    0122 2F08      MOV	R16,R24
(0158) 	dat = dat&0x0f;
    0123 700F      ANDI	R16,0xF
(0159)     if((dat>=0)&&(dat<=9))
    0124 3000      CPI	R16,0
    0125 F028      BCS	0x012B
    0126 E089      LDI	R24,0x9
    0127 1780      CP	R24,R16
    0128 F010      BCS	0x012B
(0160)     {
(0161)       dat += 0x30;
    0129 5D00      SUBI	R16,0xD0
(0162)     }
    012A C001      RJMP	0x012C
(0163)     else
(0164)       dat += 0x37;
    012B 5C09      SUBI	R16,0xC9
(0165) 	UART_TX_buff[6] = dat;
    012C 93000094  STS	0x94,R16
    012E D241      RCALL	pop_gset1
    012F 9508      RET
(0166) }
(0167) //<<<<<<<<<<<<<<<<<<<<<

⌨️ 快捷键说明

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