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

📄 project.lst

📁 AVR单片机 C语言程序设计经典实用
💻 LST
📖 第 1 页 / 共 5 页
字号:
    012B C042      RJMP	_SciBuffer_Init
(0089) 
(0090) //********************************************************************
(0091) // Function    : Enable_UART_RX_INT
(0092) // Input       : none
(0093) // Output      : none
(0094) // Description : Enable UART RX Interrupt
(0095) //********************************************************************
(0096) void Enable_UART_RX_INT(void)
(0097) {
(0098) 	UCSRB |= 0x80;
_Enable_UART_RX_INT:
    012C 9A57      SBI	0x0A,7
(0099) }
    012D 9508      RET
(0100) 
(0101) //********************************************************************
(0102) // Function    : Enable_UART_TX_INT
(0103) // Input       : none
(0104) // Output      : none
(0105) // Description : Enable UART TX Interrupt
(0106) //********************************************************************
(0107) void Enable_UART_TX_INT(void)
(0108) {
(0109) 	UCSRB |= 0x40;
_Enable_UART_TX_INT:
    012E 9A56      SBI	0x0A,6
(0110) }
    012F 9508      RET
(0111) 
(0112) //********************************************************************
(0113) // Function    : Disable_UART_RX_INT
(0114) // Input       : none
(0115) // Output      : none
(0116) // Description : Disable UART RX Interrupt
(0117) //********************************************************************
(0118) void Disable_UART_RX_INT(void)
(0119) {
(0120) 	UCSRB &= ~0x80;
_Disable_UART_RX_INT:
    0130 9857      CBI	0x0A,7
(0121) }
    0131 9508      RET
(0122) 
(0123) //********************************************************************
(0124) // Function    : Disable_UART_TX_INT
(0125) // Input       : none
(0126) // Output      : none
(0127) // Description : Disable UART TX Interrupt
(0128) //********************************************************************
(0129) void Disable_UART_TX_INT(void)
(0130) {
(0131) 	UCSRB &= ~0x40;
_Disable_UART_TX_INT:
    0132 9856      CBI	0x0A,6
(0132) }
    0133 9508      RET
(0133) 
(0134) //********************************************************************
(0135) // Function    : UART_TX_DATA
(0136) // Input       : bData-data to be send
(0137) // Output      : none
(0138) // Description : Write Data to UART TX Reigster
(0139) //********************************************************************
(0140) void UART_TX_DATA(INT8U bData)
(0141) {
(0142) 	UDR = bData;
_UART_TX_DATA:
  bData                --> R16
    0134 B90C      OUT	0x0C,R16
(0143) }
    0135 9508      RET
(0144) 
(0145) //********************************************************************
(0146) // Function    : UART_RX_DATA
(0147) // Input       : none
(0148) // Output      : data received
(0149) // Description : Get Received Data from Register
(0150) //********************************************************************
(0151) INT8U UART_RX_DATA(void)
(0152) {
(0153) 	return(UDR);
_UART_RX_DATA:
    0136 B10C      IN	R16,0x0C
    0137 9508      RET
_sUART_RX_ISR:
  data                 --> R20
    0138 940E0723  CALL	push_lset
    013A 940E06FB  CALL	push_gset1
(0154) }
(0155) 
(0156) //********************************************************************
(0157) // Function    : sUART_RX_ISR
(0158) // Input       : none
(0159) // Output      : none
(0160) // Description : UART RX Interrupt Service Routine
(0161) //********************************************************************
(0162) #pragma interrupt_handler sUART_RX_ISR:12  
(0163) void sUART_RX_ISR(void)
(0164) {
(0165) 	INT8U data;
(0166) 	//step1:read receive register to clear interrupt flag
(0167) 	data = UART_RX_DATA();
    013C DFF9      RCALL	_UART_RX_DATA
    013D 2F40      MOV	R20,R16
(0168) 	//step2:report event or store received char to buffer
(0169) 	if((data == 0x0A) || (data == 0x0D))
    013E 300A      CPI	R16,0xA
    013F F011      BEQ	0x0142
    0140 300D      CPI	R16,0xD
    0141 F459      BNE	0x014D
(0170) 	{
(0171) 		if(sbGetRxBufferEmptyStatus(&stSciBuffer) == false)
    0142 E10C      LDI	R16,0x1C
    0143 E011      LDI	R17,1
    0144 D07F      RCALL	_sbGetRxBufferEmptyStatus
    0145 2300      TST	R16
    0146 F451      BNE	0x0151
(0172) 		{
(0173) 			SciBuffer_Rx_Reset(&stSciBuffer);
    0147 E10C      LDI	R16,0x1C
    0148 E011      LDI	R17,1
    0149 D082      RCALL	_SciBuffer_Rx_Reset
(0174) 			sSet_SCI_Event(1);
    014A E001      LDI	R16,1
    014B DFC4      RCALL	_sSet_SCI_Event
(0175) 		}
(0176) 	}
    014C C004      RJMP	0x0151
(0177) 	else
(0178) 	{
(0179) 		SciBuffer_Rx_In(&stSciBuffer,data);
    014D 2F24      MOV	R18,R20
    014E E10C      LDI	R16,0x1C
    014F E011      LDI	R17,1
    0150 D024      RCALL	_SciBuffer_Rx_In
(0180) 	}
(0181) }
    0151 940E06FE  CALL	pop_gset1
    0153 940E073A  CALL	pop_lset
    0155 9518      RETI
_sUART_TX_ISR:
  bData                --> R20
    0156 940E0723  CALL	push_lset
    0158 940E06FB  CALL	push_gset1
(0182) 
(0183) //********************************************************************
(0184) // Function    : sUART_TX_ISR
(0185) // Input       : none
(0186) // Output      : none
(0187) // Description : UART TX Interrupt Service Routine
(0188) //********************************************************************
(0189) #pragma interrupt_handler sUART_TX_ISR:14  
(0190) void sUART_TX_ISR(void)
(0191) {
(0192) 	INT8U bData;
(0193) 	if(sbGetTxBufferNoEmptyStatus(&stSciBuffer) == true)
    015A E10C      LDI	R16,0x1C
    015B E011      LDI	R17,1
    015C D055      RCALL	_sbGetTxBufferNoEmptyStatus
    015D 3001      CPI	R16,1
    015E F431      BNE	0x0165
(0194) 	{
(0195) 		bData = SciBuffer_Tx_Out(&stSciBuffer);
    015F E10C      LDI	R16,0x1C
    0160 E011      LDI	R17,1
    0161 D029      RCALL	_SciBuffer_Tx_Out
    0162 2F40      MOV	R20,R16
(0196) 		UART_TX_DATA(bData);
    0163 DFD0      RCALL	_UART_TX_DATA
(0197) 	}
    0164 C004      RJMP	0x0169
(0198) 	else
(0199) 	{
(0200) 		Disable_UART_TX_INT();
    0165 DFCC      RCALL	_Disable_UART_TX_INT
(0201) 		SciBuffer_Tx_Reset(&stSciBuffer);
    0166 E10C      LDI	R16,0x1C
    0167 E011      LDI	R17,1
    0168 D067      RCALL	_SciBuffer_Tx_Reset
(0202) 	}
(0203) }
    0169 940E06FE  CALL	pop_gset1
    016B 940E073A  CALL	pop_lset
    016D 9518      RETI
(0204) 
(0205) //********************************************************************
(0206) // Function    : SciBuffer_Init
(0207) // Input       : ptr-pointer to SCI Buffer
(0208) // Output      : none
(0209) // Description : Initialization of SCI Buffer
(0210) //********************************************************************
(0211) void SciBuffer_Init(struct SCI_Buffer *ptr)
(0212) {
(0213) 	ptr->bRxLength = 0;
_SciBuffer_Init:
  ptr                  --> R16
    016E 2422      CLR	R2
    016F 01F8      MOVW	R30,R16
    0170 8220      STD	Z+0,R2
(0214) 	ptr->bTxLength = 0;
    0171 8221      STD	Z+1,R2
(0215) 	ptr->bTxBufferLength = 0;
    0172 01F8      MOVW	R30,R16
    0173 8222      STD	Z+2,R2
(0216) }
    0174 9508      RET
(0217) 
(0218) //********************************************************************
(0219) // Function    : SciBuffer_Rx_In
(0220) // Input       : ptr-pointer to SCI Buffer
(0221) // Output      : none
(0222) // Description : Add data into the SCI RX Buffer
(0223) //********************************************************************
(0224) void SciBuffer_Rx_In(struct SCI_Buffer *ptr,INT8U bData)
(0225) {
(0226) 	if(ptr->bRxLength < cMaxRxLength)
_SciBuffer_Rx_In:
  bData                --> R18
  ptr                  --> R16
    0175 01F8      MOVW	R30,R16
    0176 8180      LDD	R24,Z+0
    0177 3382      CPI	R24,0x32
    0178 F460      BCC	0x0185
(0227) 	{
(0228) 		ptr->bRxBuffer[ptr->bRxLength] = bData;
    0179 01CF      MOVW	R24,R30
    017A 9603      ADIW	R24,3
    017B 81E0      LDD	R30,Z+0
    017C 27FF      CLR	R31
    017D 0FE8      ADD	R30,R24
    017E 1FF9      ADC	R31,R25
    017F 8320      STD	Z+0,R18
(0229) 		ptr->bRxLength++;
    0180 01F8      MOVW	R30,R16
    0181 8180      LDD	R24,Z+0
    0182 5F8F      SUBI	R24,0xFF
    0183 8380      STD	Z+0,R24
(0230) 	}
    0184 C005      RJMP	0x018A
(0231) 	else
(0232) 	{
(0233) 		ptr->bRxBuffer[0] = bData;
    0185 01F8      MOVW	R30,R16
    0186 8323      STD	Z+3,R18
(0234) 		ptr->bRxLength = 1;
    0187 E081      LDI	R24,1
    0188 01F8      MOVW	R30,R16
    0189 8380      STD	Z+0,R24
(0235) 	}
(0236) }
    018A 9508      RET
_SciBuffer_Tx_Out:
  bData                --> R20
  ptr                  --> R16
    018B 940E06FB  CALL	push_gset1
(0237) 
(0238) //********************************************************************
(0239) // Function    : SciBuffer_Tx_Out
(0240) // Input       : ptr-pointer to SCI Buffer
(0241) // Output      : data from SCI TX Buffer
(0242) // Description : Get data from the SCI TX Buffer
(0243) //********************************************************************
(0244) INT8U SciBuffer_Tx_Out(struct SCI_Buffer *ptr)
(0245) {
(0246) 	INT8U bData;
(0247) 	bData = ptr->bTxBuffer[ptr->bTxLength];
    018D 01C8      MOVW	R24,R16
    018E 96C5      ADIW	R24,0x35
    018F 01F8      MOVW	R30,R16
    0190 81E1      LDD	R30,Z+1
    0191 27FF      CLR	R31
    0192 0FE8      ADD	R30,R24
    0193 1FF9      ADC	R31,R25
    0194 8140      LDD	R20,Z+0
(0248) 	ptr->bTxLength++;
    0195 01C8      MOVW	R24,R16
    0196 9601      ADIW	R24,1
    0197 01FC      MOVW	R30,R24
    0198 8180      LDD	R24,Z+0
    0199 5F8F      SUBI	R24,0xFF
    019A 8380      STD	Z+0,R24
(0249) 	return(bData);	
    019B 2F04      MOV	R16,R20
    019C 940E06FE  CALL	pop_gset1
    019E 9508      RET
(0250) }
(0251) 
(0252) //********************************************************************
(0253) // Function    : SciBuffer_Tx_In
(0254) // Input       : ptr-pointer to SCI Buffer
(0255) // Output      : none
(0256) // Description : Add data into the SCI TX Buffer
(0257) //********************************************************************
(0258) void SciBuffer_Tx_In(struct SCI_Buffer *ptr,INT8U bData)
(0259) {
(0260) 	if(ptr->bTxBufferLength < cMaxTxLength)
_SciBuffer_Tx_In:
  bData                --> R18
  ptr                  --> R16
    019F 01F8      MOVW	R30,R16
    01A0 8182      LDD	R24,Z+2
    01A1 3684      CPI	R24,0x64
    01A2 F470      BCC	0x01B1
(0261) 	{
(0262) 		ptr->bTxBuffer[ptr->bTxBufferLength] = bData;
    01A3 01C8      MOVW	R24,R16
    01A4 96C5      ADIW	R24,0x35
    01A5 01F8      MOVW	R30,R16
    01A6 81E2      LDD	R30,Z+2
    01A7 27FF      CLR	R31
    01A8 0FE8      ADD	R30,R24
    01A9 1FF9      ADC	R31,R25
    01AA 8320      STD	Z+0,R18
(0263) 		ptr->bTxBufferLength++;
    01AB 01C8      MOVW	R24,R16
    01AC 9602      ADIW	R24,2
    01AD 01FC      MOVW	R30,R24
    01AE 8180      LDD	R24,Z+0
    01AF 5F8F      SUBI	R24,0xFF
    01B0 8380      STD	Z+0,R24
(0264) 	}
(0265) }
    01B1 9508      RET
(0266) 		
(0267) //********************************************************************
(0268) // Function    : sbGetTxBufferNoEmptyStatus
(0269) // Input       : ptr-pointer to SCI Buffer
(0270) // Output      : Status of SCI TX Buffer
(0271) // Description : Check whether the SCI TX Buffer is empty or not
(0272) //********************************************************************
(0273) INT8U sbGetTxBufferNoEmptyStatus(struct SCI_Buffer *ptr)
(0274) {
(0275) 	if(ptr->bTxLength < ptr->bTxBufferLength)
_sbGetTxBufferNoEmptyStatus:
  ptr                  --> R16
    01B2 01F8      MOVW	R30,R16
    01B3 8022      LDD	R2,Z+2
    01B4 01F8      MOVW	R30,R16
    01B5 8031      LDD	R3,Z+1
    01B6 1432      CP	R3,R2
    01B7 F410      BCC	0x01BA
(0276) 	{
(0277) 		return(true);
    01B8 E001      LDI	R16,1
    01B9 C001      RJMP	0x01BB
(0278) 	}
(0279) 	return(false);
    01BA 2700      CLR	R16
    01BB 9508      RET
(0280) }
(0281) 
(0282) //********************************************************************
(0283) // Function    : sbGetTxBufferNoEmptyStatus
(0284) // Input       : ptr-pointer to SCI Buffer
(0285) // Output      : Status of SCI TX Buffer
(0286) // Description : Check whether the SCI TX Buffer is empty or not
(0287) //********************************************************************
(0288) INT8U sbGetTxBufferEmptyStatus(struct SCI_Buffer *ptr)
(0289) {
(0290) 	if(ptr->bTxBufferLength == 0)
_sbGetTxBufferEmptyStatus:
  ptr                  --> R16
    01BC 01F8      MOVW	R30,R16
    01BD 8022      LDD	R2,Z+2
    01BE 2022      TST	R2
    01BF F411      BNE	0x01C2
(0291) 	{
(0292) 		return(true);
    01C0 E001      LDI	R16,1
    01C1 C001      RJMP	0x01C3
(0293) 	}
(0294) 	return(false);
    01C2 2700      CLR	R16
    01C3 9508      RET
(0295) }
(0296) 
(0297) //********************************************************************
(0298) // Function    : sbGetRxBufferEmptyStatus
(0299) // Input       : ptr-pointer to SCI Buffer
(0300) // Output      : Status of SCI TX Buffer
(0301) // Description : Check whether the SCI TX Buffer is empty or not
(0302) //********************************************************************
(0303) INT8U sbGetRxBufferEmptyStatus(struct SCI_Buffer *ptr)
(0304) {
(0305) 	if(ptr->bRxLength == 0)
_sbGetRxBufferEmptyStatus:
  ptr                  --> R16
    01C4 01F8      MOVW	R30,R16
    01C5 8020      LDD	R2,Z+0
    01C6 2022      TST	R2
    01C7 F411      BNE	0x01CA

⌨️ 快捷键说明

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