;****************************************************************************************** ; PIC16F84 Sample Program : ; Project : ; Program Name : ; Programer : ; Create date : Version 1.0 H27.02.15 ; History : ; Laungage : MPLAB MPASM ; ;****************************************************************************************** ; Description ; OSC : External OSC 10MHz ; Assign PIN ; UART PORTA(3):Send, PORTA(4):Recive ; LED PORTB(0-7) ;****************************************************************************************** LIST P=PIC16F84,ST=OFF,R=DEC INCLUDE "P16F84.inc" __CONFIG _HS_OSC & _WDT_OFF & _PWRTE_OFF & _CP_OFF ; ; Define GENERAL PURPOSE RAM AREA (68 bytes maximum) 0Ch-4fh ; TMP_G EQU 0CH TMP_LED EQU 0DH TMP_CNT1 EQU 0EH TMP_CNT2 EQU 0FH TMP_CNT3 EQU 10H IODAT EQU 11H RECWAT EQU 12H RECLP EQU 13H SENDWAT EQU 14H SENDLP EQU 15H MAIN_LP EQU 16H ; ; Define Macro ; BANK0 MACRO BCF STATUS,RP0 BCF STATUS,RP1 ENDM BANK1 MACRO BSF STATUS,RP0 BCF STATUS,RP1 ENDM WAIT1S MACRO MOVLW H'64' CALL WAIT_TM ENDM WAIT02S MACRO MOVLW H'14' CALL WAIT_TM ENDM WAIT01S MACRO MOVLW H'0A' CALL WAIT_TM ENDM PUTC MACRO #PUT_CHAR MOVLW #PUT_CHAR CALL SEND_UART ENDM ; ; Program Start ; ORG 0h GOTO START ORG 4h GOTO START START ; ***************************** ; 1.Initialized ; ***************************** ; (1)Define I/O port BANK1 MOVLW B'11110111' MOVWF TRISA MOVLW B'00000000' MOVWF TRISB ; (2)Initialized the variable BANK0 BSF PORTA,3 MOVLW B'00000001' MOVWF TMP_LED ; (3)Put message CALL DEMO01 ; ***************************** ; 2.Program main ; ***************************** BANK0 MAIN ; (1)Get character code data from the UART CALL RECIVE_UART MOVWF PORTB CALL SEND_UART GOTO MAIN ;****************************************************************************************** ; Program : DEMO01 ; Title : Put message ; Input : ; Output : ;****************************************************************************************** DEMO01 PUTC ' ' PUTC ' ' PUTC 'I' PUTC 'n' PUTC 'p' PUTC 'u' PUTC 't' PUTC '?' PUTC '>' RETURN ;****************************************************************************************** ; Program : WAIT_TM ; Title : Wait for 1 second ; Input : ; Output : ;****************************************************************************************** WAIT_TM BANK0 ; MOVLW H'64' ; 100Hz/100 ==> 1Hz MOVWF TMP_CNT1 WAIT_TM1 MOVLW H'64' ; 10KHz/100 ==> 100Hz MOVWF TMP_CNT2 WAIT_TM2 MOVLW H'19' ; 10MHz/4(PIC)/250 ==> 10KHz MOVWF TMP_CNT3 WAIT_TM3 NOP NOP NOP NOP NOP NOP NOP NOP DECFSZ TMP_CNT3,F GOTO WAIT_TM3 DECFSZ TMP_CNT2,F GOTO WAIT_TM2 DECFSZ TMP_CNT1,F GOTO WAIT_TM1 RETURN ;****************************************************************************************** ; Function Name : RECIVE_UART ; Disctiption : Recive UART(PORTA4) ; Input : ; Output : ;****************************************************************************************** RECIVE_UART ; (1)Initialized the variable CLRF IODAT ; (2)Wait until the reception data is input BTFSC PORTA,4 GOTO $-1 ; (3)Wait 1/2 data MOVLW H'29' ; 9600BPS OSC;10.000MHz MOVWF RECWAT DECFSZ RECWAT,F GOTO $-1 ; (3)Receive 8-bit data MOVLW 8 MOVWF RECLP NOP RECIVE_UART_2 MOVLW H'53' ; 9600BPS OSC;10.000MHz MOVWF RECWAT DECFSZ RECWAT,F GOTO $-1 NOP BTFSS PORTA,4 BCF STATUS,C BTFSC PORTA,4 BSF STATUS,C RRF IODAT,F DECFSZ RECLP,F GOTO RECIVE_UART_2 NOP NOP MOVFW IODAT ; RETURN ;****************************************************************************************** ; Function Name : SEND_UART ; Disctiption : SEND UART(PORTA3) ; Input : ; Output : ;****************************************************************************************** SEND_UART MOVWF IODAT ; (1)Start a data process BCF PORTA,3 MOVLW H'53' ; 9600BPS OSC;10.000MHz MOVWF SENDWAT DECFSZ SENDWAT,F GOTO $-1 ; ; (2)Send 8-bit data MOVLW 8 MOVWF SENDLP NOP SEND_UART_2 RRF IODAT,F NOP BTFSS STATUS,C BCF PORTA,3 BTFSC STATUS,C BSF PORTA,3 MOVLW H'53' ; 9600BPS OSC;10.000MHz MOVWF SENDWAT DECFSZ SENDWAT,F GOTO $-1 DECFSZ SENDLP,F GOTO SEND_UART_2 ; (3)End processing BSF PORTA,3 ; (4)Wait for minitus WAIT01S RETURN END