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

📄 soc_test.lst

📁 atmega128串口通信
💻 LST
📖 第 1 页 / 共 5 页
字号:
__start:
__text_start:
    006F EFCF      LDI	R28,0xFF
    0070 E1D0      LDI	R29,0x10
    0071 BFCD      OUT	0x3D,R28
    0072 BFDE      OUT	0x3E,R29
    0073 51C0      SUBI	R28,0x10
    0074 40D0      SBCI	R29,0
    0075 EA0A      LDI	R16,0xAA
    0076 8308      STD	Y+0,R16
    0077 2400      CLR	R0
    0078 E0E0      LDI	R30,0
    0079 E0F1      LDI	R31,1
    007A E011      LDI	R17,1
    007B 38E3      CPI	R30,0x83
    007C 07F1      CPC	R31,R17
    007D F011      BEQ	0x0080
    007E 9201      ST	R0,Z+
    007F CFFB      RJMP	0x007B
    0080 8300      STD	Z+0,R16
    0081 EDED      LDI	R30,0xDD
    0082 E0F0      LDI	R31,0
    0083 E0A0      LDI	R26,0
    0084 E0B1      LDI	R27,1
    0085 E010      LDI	R17,0
    0086 3DED      CPI	R30,0xDD
    0087 07F1      CPC	R31,R17
    0088 F021      BEQ	0x008D
    0089 95C8      LPM
    008A 9631      ADIW	R30,1
    008B 920D      ST	R0,X+
    008C CFF9      RJMP	0x0086
    008D 940E0633  CALL	_main
_exit:
    008F CFFF      RJMP	_exit
FILE: F:\chengxu128L\soc_test.c
(0001) #include  <iom128v.h>
(0002) //单片机ATmega128
(0003) #include  <macros.h>
(0004) //单片机ATmega128
(0005) #include  "soc_test.H"
(0006) //对应头文件
(0007) //寄存器更名
(0008) asm(".define  temp   R16");
(0009) //--------------------------------------------------------
(0010) /*********************************************************
(0011) 连续5个NOP
(0012) *********************************************************/
(0013) void	NOP5(void)
(0014) {
(0015) 	NOP();
_NOP5:
    0090 0000      NOP
(0016) 	NOP();
    0091 0000      NOP
(0017) 	NOP();
    0092 0000      NOP
(0018) 	NOP();
    0093 0000      NOP
(0019) 	NOP();
    0094 0000      NOP
(0020) }
    0095 9508      RET
(0021) //--------------------------------------------------------
(0022) /*********************************************************
(0023) 初始化程序	
(0024) *********************************************************/
(0025) void	initial_work(void)
(0026) {
(0027) 	/*********************************
(0028)   					初始化IO口
(0029)   *********************************/
(0030)   //初始化B口
(0031)   //DDRB|=BIT(FQUD)+BIT(RESET)+BIT(RESET_FPGA)+BIT(W_CLK)+BIT(SDATA);
(0032)   //初始化D口
(0033)   //DDRD|=BIT(INT_DSP);  
(0034)   //初始化E口
(0035)   DDRE|=BIT(NBUS_CLK)+BIT(BUSWEN)+BIT(SAMPLE_START)+BIT(MCUREAD_START);
_initial_work:
    0096 B182      IN	R24,0x02
    0097 638C      ORI	R24,0x3C
    0098 B982      OUT	0x02,R24
(0036) 	
(0037)   /*********************************
(0038)   *********************************/
(0039)   NOP5();
    0099 DFF6      RCALL	_NOP5
(0040)   /*********************************
(0041)   					初始化串口												
(0042)   *********************************/
(0043) 	UCSR0B=0x00;
    009A 2422      CLR	R2
    009B B82A      OUT	0x0A,R2
(0044) 	UCSR0A=0x00;
    009C B82B      OUT	0x0B,R2
(0045) 	UCSR0C=0x06; //8bit,1 stop bit,no check
    009D E086      LDI	R24,6
    009E 93800095  STS	0x95,R24
(0046) 	UBRR0L=0x0B; //现:设置波特率为38.4Kbps(外部晶振时钟7372.8KHz)
    00A0 E08B      LDI	R24,0xB
    00A1 B989      OUT	0x09,R24
(0047) 	UBRR0H=0x00;
    00A2 92200090  STS	0x90,R2
(0048) 	UCSR0B=0x98; //一开始就打开发送使能,是为了使TXC脚电平变高
    00A4 E988      LDI	R24,0x98
    00A5 B98A      OUT	0x0A,R24
(0049) }//end initial_work
    00A6 9508      RET
_process_00workmode:
  i                    --> R20
    00A7 940E0797  CALL	push_gset1
(0050) //--------------------------------------------------------
(0051) /*********************************************************
(0052) 
(0053) 
(0054) 
(0055) *********************************************************/
(0056) void  process_00workmode(void)
(0057) {
(0058) 	unsigned char i;
(0059) 	if(1)
(0060) 	{
(0061) 		for(i=0;i<L00;i++)
    00A9 2744      CLR	R20
    00AA C00F      RJMP	0x00BA
(0062) 		{
(0063) 			reply_buffer[i]=work_state_succeed[i];
    00AB E88C      LDI	R24,0x8C
    00AC E090      LDI	R25,0
    00AD 2FE4      MOV	R30,R20
    00AE 27FF      CLR	R31
    00AF 0FE8      ADD	R30,R24
    00B0 1FF9      ADC	R31,R25
    00B1 91E4      LPM	R30,0(Z)
    00B2 E08B      LDI	R24,0xB
    00B3 E091      LDI	R25,1
    00B4 2FA4      MOV	R26,R20
    00B5 27BB      CLR	R27
    00B6 0FA8      ADD	R26,R24
    00B7 1FB9      ADC	R27,R25
    00B8 93EC      ST	R30,0(X)
    00B9 9543      INC	R20
    00BA 3047      CPI	R20,7
    00BB F378      BCS	0x00AB
(0064) 		}
(0065) 		usart0_send(L00);
    00BC E007      LDI	R16,7
    00BD D028      RCALL	_usart0_send
(0066) 	}
(0067) }//end process_00workmode
    00BE 940E079A  CALL	pop_gset1
    00C0 9508      RET
(0068) //--------------------------------------------------------
(0069) /*********************************************************
(0070) 等待
(0071) *********************************************************/
(0072) void	process_01wait(void)
(0073) {
(0074) 	
(0075) }//end process_01wait
_process_01wait:
    00C1 9508      RET
(0076) //--------------------------------------------------------
(0077) 
(0078) 
(0079) 
(0080) 
(0081) 
(0082) 
(0083) /*********************************************************
(0084) 通用延时子程序
(0085) *********************************************************/
(0086) void delay1(void)
(0087) {
(0088) 	asm("DELAY1:"); 
(0089) 	asm("push r16");
_delay1:
    00C2 930F      PUSH	R16
(0090) 	asm("CC0:  push r16");
    00C3 930F      PUSH	R16
(0091) 	asm("CC1:  push r16");
    00C4 930F      PUSH	R16
(0092) 	asm("CC2:  push r16");
    00C5 930F      PUSH	R16
(0093) 	asm("CC3:  dec  r16");
    00C6 950A      DEC	R16
(0094) 	asm("brne CC3");
    00C7 F7F1      BNE	0x00C6
(0095) 	asm("pop r16");
    00C8 910F      POP	R16
(0096) 	asm("dec r16");
    00C9 950A      DEC	R16
(0097) 	asm("brne CC2");
    00CA F7D1      BNE	0x00C5
(0098) 	asm("pop r16");
    00CB 910F      POP	R16
(0099) 	asm("dec r16");
    00CC 950A      DEC	R16
(0100) 	asm("brne CC1");
    00CD F7B1      BNE	0x00C4
(0101) 	asm("pop r16");
    00CE 910F      POP	R16
(0102) 	asm("dec r16");
    00CF 950A      DEC	R16
(0103) 	asm("brne CC0");
    00D0 F791      BNE	0x00C3
(0104) 	asm("pop r16");    
    00D1 910F      POP	R16
(0105) }//end delay1
    00D2 9508      RET
(0106) //--------------------------------------------------------
(0107) /*********************************************************
(0108) 串口发送查询
(0109) *********************************************************/
(0110) void  query_TXC(void)
(0111) {
(0112) 	while(!(UCSR0A&BIT(TXC0)));
_query_TXC:
    00D3 9B5E      SBIS	0x0B,6
    00D4 CFFE      RJMP	_query_TXC
(0113) 	UCSR0A|=BIT(TXC0);   //写1清零
    00D5 9A5E      SBI	0x0B,6
(0114) }//end query_TXC
    00D6 9508      RET
(0115) //--------------------------------------------------------
(0116) /*********************************************************
(0117) 使能外部SRAM
(0118) *********************************************************/
(0119) void  enable_XMEM(void)
(0120) {
(0121) 	MCUCR=0b10000000; //XMEM enable,no wait states
_enable_XMEM:
    00D7 E880      LDI	R24,0x80
    00D8 BF85      OUT	0x35,R24
(0122) 	XMCRA=0;
    00D9 2422      CLR	R2
    00DA 9220006D  STS	0x6D,R2
(0123) 	XMCRB=0;   				//no XMEM high mask
    00DC 9220006C  STS	0x6C,R2
(0124) }//end enable_XMEM
    00DE 9508      RET
(0125) //--------------------------------------------------------
(0126) /*********************************************************
(0127) 清串口
(0128) *********************************************************/
(0129) void  usart_flush(void)
(0130) {
(0131) 	asm("push temp");
_usart_flush:
    00DF 930F      PUSH	R16
    00E0 C001      RJMP	0x00E2
(0132) 	while(UCSR0A&BIT(RXC0))
(0133) 	{
(0134) 		asm("in temp,0x0c");   //in temp,udr0
    00E1 B10C      IN	R16,0x0C
    00E2 995F      SBIC	0x0B,7
    00E3 CFFD      RJMP	0x00E1
(0135) 		continue;   //继续判断
(0136) 	}
(0137) 	asm("pop temp");
    00E4 910F      POP	R16
(0138) }//end usart_flush
    00E5 9508      RET
_usart0_send:
  i                    --> R20
  uSendLen             --> R22
    00E6 940E07AE  CALL	push_gset2
    00E8 2F60      MOV	R22,R16
(0139) //--------------------------------------------------------
(0140) 
(0141) 
(0142) /*********************************************************
(0143) 通过异步串口0发送回复命令
(0144) *********************************************************/
(0145) void  usart0_send(unsigned char uSendLen)
(0146) {
(0147) 	unsigned char i=0;
    00E9 2744      CLR	R20
(0148) 	for(i=0;i<uSendLen;i++)
    00EA C00A      RJMP	0x00F5
(0149) 	{
(0150) 		UDR0=reply_buffer[i];
    00EB E08B      LDI	R24,0xB
    00EC E091      LDI	R25,1
    00ED 2FE4      MOV	R30,R20
    00EE 27FF      CLR	R31
    00EF 0FE8      ADD	R30,R24
    00F0 1FF9      ADC	R31,R25
    00F1 8020      LDD	R2,Z+0
    00F2 B82C      OUT	0x0C,R2
(0151) 		query_TXC();
    00F3 DFDF      RCALL	_query_TXC
    00F4 9543      INC	R20
    00F5 1746      CP	R20,R22
    00F6 F3A0      BCS	0x00EB
(0152) 	}
(0153) }//end usart0_send
    00F7 940E0791  CALL	pop_gset2
    00F9 9508      RET
_usart0_sendbyte:
  uSendByte            --> R20
    00FA 940E0797  CALL	push_gset1
    00FC 2F40      MOV	R20,R16
(0154) //--------------------------------------------------------
(0155) /*********************************************************
(0156) 通过异步串口0发送一个字节
(0157) *********************************************************/
(0158) void  usart0_sendbyte(unsigned char uSendByte)
(0159) {
(0160)     
(0161)   UDR0=uSendByte;
    00FD B94C      OUT	0x0C,R20
(0162)   query_TXC();  
    00FE DFD4      RCALL	_query_TXC
(0163)     
(0164) }//end usart0_sendbyte
    00FF 940E079A  CALL	pop_gset1
    0101 9508      RET
_usart0_receive:
  revChar              --> R16
    0102 922A      ST	R2,-Y
    0103 930A      ST	R16,-Y
    0104 938A      ST	R24,-Y
    0105 939A      ST	R25,-Y
    0106 93EA      ST	R30,-Y
    0107 93FA      ST	R31,-Y
    0108 B62F      IN	R2,0x3F
    0109 922A      ST	R2,-Y
(0165) //--------------------------------------------------------
(0166) /*********************************************************
(0167) **********************************************************
(0168) 以下为中断服务子程序
(0169) **********************************************************
(0170) *********************************************************/
(0171) //异步串口接收中断处理程序,将所接收命令存于数组buffer[]中
(0172) //为防止意外改变寄存器的值,在这里只用全局变量
(0173) //每次进中断接收一字节数据
(0174) void usart0_receive(void)
(0175) {
(0176) 	unsigned char revChar;
(0177) 	haveUartInt=0x01;  //haveUartInt表示接收了一次串口中断,即一个字节数据
    010A E081      LDI	R24,1
    010B 93800108  STS	_haveUartInt,R24
(0178) 	revChar=UDR0;	//接收一个字节
    010D B10C      IN	R16,0x0C
(0179) 	if(buf_index<MAX_RECEV_LEN)	//如果长度小于最大长度
    010E 91800105  LDS	R24,_buf_index
    0110 3684      CPI	R24,0x64
    0111 F008      BCS	0x0113
    0112 C098      RJMP	0x01AB
(0180) 	{
(0181) 		buffer[buf_index]=revChar;	//将该字节加入buffer
    0113 E18F      LDI	R24,0x1F
    0114 E091      LDI	R25,1
    0115 91E00105  LDS	R30,_buf_index
    0117 27FF      CLR	R31
    0118 0FE8      ADD	R30,R24
    0119 1FF9      ADC	R31,R25
    011A 8300      STD	Z+0,R16
(0182) 		if(END_WORD==buffer[buf_index] && BEGIN_WORD==beginWord && buf_index>2)
    011B 91E00105  LDS	R30,_buf_index
    011D 27FF      CLR	R31
    011E 0FE8      ADD	R30,R24
    011F 1FF9      ADC	R31,R25
    0120 8180      LDD	R24,Z+0
    0121 378E      CPI	R24,0x7E
    0122 F481      BNE	0x0133
    0123 9180010A  LDS	R24,_beginWord
    0125 378E      CPI	R24,0x7E
    0126 F461      BNE	0x0133
    0127 E082      LDI	R24,2
    0128 90200105  LDS	R2,_buf_index
    012A 1582      CP	R24,R2
    012B F438      BCC	0x0133
(0183) 		//这里为beginWord是因为beginWord是在结束字之前设置的,也就是说收到结束字时必须先收到了起始字否则这个结束字是非法的
(0184) 		{	//注意:结束字判断应该在转义操作之前
(0185) 			endWord=END_WORD;			//接收到结束标志
    012C E78E      LDI	R24,0x7E
    012D 93800109  STS	_endWord,R24
(0186) 			beginWord=0x00;			//接收完一次,为接收下一次数据做准备
    012F 2422      CLR	R2
    0130 9220010A  STS	_beginWord,R2
(0187) 		}
    0132 C07B      RJMP	0x01AE
(0188) 		else if(0==buf_index)
    0133 90200105  LDS	R2,_buf_index
    0135 2022      TST	R2
    0136 F461      BNE	0x0143
(0189) 		{	//对第一个数据进行判断
(0190) 			if(BEGIN_WORD==buffer[0])
    0137 9180011F  LDS	R24,_buffer
    0139 378E      CPI	R24,0x7E
    013A F421      BNE	0x013F
(0191) 			{
(0192) 				beginWord=BEGIN_WORD;	//接收到起始字
    013B E78E      LDI	R24,0x7E
    013C 9380010A  STS	_beginWord,R24

⌨️ 快捷键说明

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