;**********************************************************************
;利用串口调试精灵或PC端的超级终端,波特率设为9600,数据位8位,
;停止位1位,无校验位.
;烧写时注意振荡方式XT,WDT要禁止.
;***********************************************************************
LIST P=16F877
INCLUDE "P16F877.INC"
;***********************************
;__CONFIG _DEBUG_OFF&_CP_ALL&_WRT_HALF&_CPD_ON&_LVP_OFF&_BODEN_OFF&_PWRTE_ON&_WDT_OFF&_HS_OSC;
;************************
CBLOCK 0x20
TXBUFF :9
TXPTR
TXCOUNT
RXBUFF :9
PUTPTR
GETPTR
STATUS_TEMP
FSR_TEMP
ENDC
;**********************************
W_TEMP EQU 7FH
;**********************************
ORG 0X000
GOTO MAIN
ORG 0X004
GOTO INT
ORG 0X008
;**********************************
INT
MOVWF W_TEMP ;保护现场
SWAPF STATUS,W
CLRF STATUS
MOVWF STATUS_TEMP
MOVFW FSR
MOVWF FSR_TEMP
;------------------------
CHKRXINT
BANKSEL PIR1
BTFSS PIR1,RCIF ;检查是否为USART发出的中断请求
GOTO CHKTXINT
;----------------------------
_RDRXFIFO
BTFSC RCSTA,FERR ;帧格式错误标志位
GOTO _FERR_PRO
MOVLW RXBUFF ;
MOVWF FSR
MOVF PUTPTR,W
ADDWF FSR,F
MOVF RCREG,W
MOVWF INDF
INCF PUTPTR,F
; MOVLW .7
; ANDWF PUTPTR,F
BTFSC PIR1,RCIF
GOTO _RDRXFIFO
;--------------------------
BTFSS RCSTA,OERR ;超速出错标志位
GOTO ENDOFINT
;------------------------
_OERR_PRO
BCF RCSTA,CREN ;0=禁止连续接收功能
BSF RCSTA,CREN ;1=使能连续接收功能
GOTO ENDOFINT
;------------------------
_FERR_PRO
MOVF RCREG,W
GOTO ENDOFINT
;************************************
;发送程序
CHKTXINT
BSF STATUS,RP0 ;设置文件寄存器的体1
BTFSS PIE1,TXIE ;发送中断标志使能位
GOTO ENDOFINT
BCF STATUS,RP0 ;恢复到文件寄存器体0
BTFSS PIR1,TXIF ;发送中断标志位
GOTO ENDOFINT
;-----------------------
MOVLW TXBUFF ;发送暂存寄存器=20H
MOVWF FSR
MOVF TXPTR,W
ADDWF FSR,F
MOVF INDF,W
MOVWF TXREG
INCF TXPTR,F
DECFSZ TXCOUNT,F ;要发送的数据 位数
GOTO ENDOFINT
;----------------------
BSF STATUS,RP0
BCF PIE1,TXIE ;发送中断位禁止
BCF STATUS,RP0
;--------------------------
ENDOFINT ;恢复现场
CLRF STATUS
MOVFW FSR_TEMP
MOVWF FSR
SWAPF STATUS_TEMP,W
MOVWF STATUS
SWAPF W_TEMP,F
SWAPF W_TEMP,W
RETFIE
;********************************************************
;********************************************************
MAIN
BANKSEL TXSTA ;设置文件寄存器的体1
MOVLW B’00100100’ ;使能USART发送,设置波特率发生器为高速方式
MOVWF TXSTA
MOVLW .25 ;装载波特率发生器为9600
MOVWF SPBRG
CLRF PIE1
BSF PIE1,RCIE ;开放USART的接收中断
CLRF STATUS ;恢复到文件寄存器体0
CLRF TXCOUNT
CLRF GETPTR
CLRF PUTPTR
MOVLW B’10010000’ ;使能USART连续接收,同时使能USART端口
MOVWF RCSTA
CLRF INTCON
BSF INTCON,PEIE ;使能外设中断使能位
BSF INTCON,GIE ;使能全局中断使能位
;*********************************
LOOP
CALL CHECK_DATA
GOTO LOOP
;*********************************
CHECK_DATA
CLRF STATUS
MOVF TXCOUNT,W
SKPZ ;BTFSS STATUS,Z
RETURN
;--------------------------------
MOVF GETPTR,W
XORWF PUTPTR,W
SKPNZ ;BTFSC STATUS,Z
RETURN
;--------------------------------
MOVLW RXBUFF
MOVWF FSR
MOVF GETPTR,W
ADDWF FSR,F
INCF GETPTR,F
; MOVLW .7
; ANDWF GETPTR,F
MOVF INDF,W
MOVWF TXBUFF+0
;-------------------------------
; MOVLW ’-’
; MOVWF TXBUFF+1
; MOVLW ’P’
; MOVWF TXBUFF+2
; MOVLW ’I’
; MOVWF TXBUFF+3
; MOVLW ’C’
; MOVWF TXBUFF+4
; MOVLW ’A’
; MOVWF TXBUFF+5
; MOVLW ’V’
; MOVWF TXBUFF+6
; MOVLW ’R’
; MOVWF TXBUFF+7
;------------------------------
MOVLW 0X0D ;回车键
MOVWF TXBUFF+1
MOVLW 0X0A ;换行键
MOVWF TXBUFF+2
;------------------------------
MOVLW .3
MOVWF TXCOUNT
CLRF TXPTR ;发送清0
BSF STATUS,RP0
BSF PIE1,TXIE
BCF STATUS,RP0
RETURN
;-------------------------------
END
上一篇:基于PIC18F66J60实现的Ethernet-RS-232协议转换器
下一篇:PIC16F72定时器C程序
推荐阅读最新更新时间:2024-03-16 15:48