;****************************************************************************************** ; PIC16F1939 Sample Program ; Project : ; Program Name : ; Programer : ; Create date : Version 1.0 H23.08.10 ; History : ; Laungage : MPLAB MPASM ;****************************************************************************************** ; Description ; (1)OSC : 10MHz Crystal ; (2)I/O Port ; PORTA(0-3) : LED (1-4) - ; PORTB(0-6) : 7 SEGMENT LED (A[a]-A[g]) - ; PORTD(0-6) : 7 SEGMENT LED (B[a]-B[g]) - ; PORTC(0-5) : 7 SEGMENT LED (Clm[1]-Clm[6]) + ; PORTC(6-7) : Serial Comunication (Tx/Rx) ; PORTE(2) : 7 SEGMENT LED (Clm[7]) + ;****************************************************************************************** LIST P=PIC16F1939,ST=OFF,R=DEC INCLUDE "P16F1939.inc" ; __CONFIG _CONFIG1 , _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF __CONFIG _CONFIG1 , _FOSC_HS & _WDTE_OFF & _PWRTE_OFF & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF __CONFIG _CONFIG2 , _WRT_OFF & _VCAPEN_OFF & _PLLEN_OFF & _STVREN_OFF & _BORV_25 & _LVP_OFF ; ; Define GENERAL PURPOSE RAM AREA (80 bytes maximum) ; TMP_G EQU 20H FNTCOD EQU 21H DA0 EQU 22H DA1 EQU 23H DA2 EQU 24H DA3 EQU 25H DA4 EQU 26H DA5 EQU 27H DA6 EQU 28H DB0 EQU 29H DB1 EQU 2AH DB2 EQU 2BH DB3 EQU 2CH DB4 EQU 2DH DB5 EQU 2EH DB6 EQU 2FH BD01 EQU 30H BD02 EQU 31H BD03 EQU 32H BD04 EQU 34H BD05 EQU 35H BD06 EQU 36H BD07 EQU 37H BD08 EQU 38H BD09 EQU 39H BD10 EQU 3AH BD11 EQU 3BH BD12 EQU 3CH BD13 EQU 3DH BD14 EQU 3EH LP7SEGA EQU 40H LP7SEGB EQU 41H ; ; Define Common RAM AREA (16 bytes) ; TMP_C EQU 70H INTWRG EQU 71H INTSTS EQU 72H WAT1MLP EQU 73H FLG_S EQU 74H UART_C EQU 75H ; ; Define Macro ; SELBANK MACRO #BANK_NO MOVLW #BANK_NO MOVWF BSR ENDM MSNDURT MACRO #URT_CHAR MOVLW #URT_CHAR CALL SNDUART ENDM MFDSET MACRO #FCODE,FREG MOVLW #FCODE MOVWF FREG ENDM MFNT MACRO #FCODE MOVLW #FCODE CALL FNT ENDM MWAIT1M MACRO #TIMLP MOVLW #TIMLP CALL WAIT1M ENDM ; ; Program Start ; ORG 0h GOTO START ; ***************************** ; 0.Interrupts ; ***************************** ORG 4h MOVWF INTWRG ; W-REGの値を保存 SWAPF STATUS,W ; STATUSレジスタの値を保存 MOVWF INTSTS ; STATUSレジスタの値を保存 ; CALL INTR SELBANK 0 ; SET BANK0 ; SWAPF INTSTS,W ; STATUSレジスタの値を復元 MOVWF STATUS ; STATUSレジスタの値を復元 MOVFW INTWRG ; W-REGレジスタの値を復元 RETFIE START ; ***************************** ; 1.Initialized Segment ; ***************************** ; (1)Define OSC (External Oscillator) SELBANK 1 ; SET BANK1 MOVLW B'00000000' MOVWF OSCCON ; (2)Define I/O port SELBANK 1 ; SET BANK1 MOVLW B'11110000' MOVWF TRISA MOVLW B'10000000' MOVWF TRISB MOVLW B'11000000' MOVWF TRISC MOVLW B'10000000' MOVWF TRISD MOVLW B'11111011' MOVWF TRISE SELBANK 0 ; SET BANK0 MOVLW B'00001111' MOVWF PORTA MOVLW B'01111111' MOVWF PORTB MOVLW B'00000000' MOVWF PORTC MOVLW B'01111111' MOVWF PORTD MOVLW B'00000000' MOVWF PORTE ; (3)Initialized EUART CALL INTUART ; (4)Initialized Flag CLRF FLG_S SELBANK 0 ; SET BANK0 ; ***************************** ; 2.Program main ; ***************************** ; (1)Demo UART Message CALL DEMO00 ; (2)Demo LED Message CALL DEMO01 MAIN ; (3)Display CALL PUT7SEG GOTO MAIN ;****************************************************************************************** ; Program : DEMO00 ; Title : UART Message ; Input : ; Output : ;****************************************************************************************** DEMO00 MSNDURT ' ' MSNDURT ' ' MSNDURT 'P' MSNDURT 'I' MSNDURT 'C' MSNDURT '1' MSNDURT '6' MSNDURT 'F' MSNDURT '1' MSNDURT '9' MSNDURT '3' MSNDURT '9' MSNDURT ' ' MSNDURT 'C' MSNDURT 'o' MSNDURT 'n' MSNDURT 'n' MSNDURT 'e' MSNDURT 'c' MSNDURT 't' MSNDURT 'e' MSNDURT 'd' MSNDURT ' ' MSNDURT 'O' MSNDURT 'K' MSNDURT '>' MSNDURT ' ' RETURN ;****************************************************************************************** ; Program : DEMO01 ; Title : 7 Segment Message ; Input : ; Output : ;****************************************************************************************** DEMO01 MFDSET 'F',DA0 MFDSET '6',DA1 MFDSET '1',DA2 MFDSET 'C',DA3 MFDSET 'I',DA4 MFDSET 'P',DA5 MFDSET '-',DA6 MFDSET ' ',DB0 MFDSET ' ',DB1 MFDSET '9',DB2 MFDSET '3',DB3 MFDSET '9',DB4 MFDSET '1',DB5 MFDSET '-',DB6 RETURN ;****************************************************************************************** ; Program : PUT7SEG ; Title : ; Input : ; Output : ;****************************************************************************************** PUT7SEG ; ; 1.column 1 BSF PORTC,0 MOVFW DA0 CALL FNT MOVWF PORTB MOVFW DB0 CALL FNT MOVWF PORTD CALL WAT7SEG CALL PUT7SEGA BCF PORTC,0 ; ; 1.column 2 BSF PORTC,1 MOVFW DA1 CALL FNT MOVWF PORTB MOVFW DB1 CALL FNT MOVWF PORTD CALL WAT7SEG CALL PUT7SEGA BCF PORTC,1 ; ; 1.column 3 BSF PORTC,2 MOVFW DA2 CALL FNT MOVWF PORTB MOVFW DB2 CALL FNT MOVWF PORTD CALL WAT7SEG CALL PUT7SEGA BCF PORTC,2 ; ; 1.column 4 BSF PORTC,3 MOVFW DA3 CALL FNT MOVWF PORTB MOVFW DB3 CALL FNT MOVWF PORTD CALL WAT7SEG CALL PUT7SEGA BCF PORTC,3 ; ; 1.column 5 BSF PORTC,4 MOVFW DA4 CALL FNT MOVWF PORTB MOVFW DB4 CALL FNT MOVWF PORTD CALL WAT7SEG CALL PUT7SEGA BCF PORTC,4 ; ; 1.column 6 BSF PORTC,5 MOVFW DA5 CALL FNT MOVWF PORTB MOVFW DB5 CALL FNT MOVWF PORTD CALL WAT7SEG CALL PUT7SEGA BCF PORTC,5 ; ; 1.column 7 BSF PORTE,2 MOVFW DA6 CALL FNT MOVWF PORTB MOVFW DB6 CALL FNT MOVWF PORTD CALL WAT7SEG CALL PUT7SEGA BCF PORTE,2 RETURN PUT7SEGA MFNT ' ' MOVWF PORTB MOVWF PORTD RETURN ;****************************************************************************************** ; Function Name : WAT7SEG ; Title : ; Input : ; Output : ; Description : 30Hz * 7(column) => 210Hz ; 10MHz / 4 ==(250)==> 10KHz ==(20)==> 500Hz ;****************************************************************************************** WAT7SEG MOVLW H'14' MOVWF LP7SEGB WAT7SEGB MOVLW H'19' MOVWF LP7SEGA WAT7SEGA NOP NOP NOP NOP NOP NOP NOP NOP DECFSZ LP7SEGA,F GOTO WAT7SEGA DECFSZ LP7SEGB,F GOTO WAT7SEGB RETURN ;****************************************************************************************** ; Function Name : FNT ; Title : ; Input : W-reg ; Output : W-reg ;****************************************************************************************** FNT CALL CHGFNTC CALL SETFNT RETURN ;****************************************************************************************** ; Function Name : CHGFNTC ; Title : ; Input : W-reg ; Output : ;****************************************************************************************** CHGFNTC MOVWF FNTCOD XORLW H'00' BTFSS STATUS,Z GOTO CHGFNTC1 MOVLW '0' MOVWF FNTCOD RETURN CHGFNTC1 MOVF FNTCOD,W XORLW H'01' BTFSS STATUS,Z GOTO CHGFNTC2 MOVLW '1' MOVWF FNTCOD RETURN CHGFNTC2 MOVF FNTCOD,W XORLW H'02' BTFSS STATUS,Z GOTO CHGFNTC3 MOVLW '2' MOVWF FNTCOD RETURN CHGFNTC3 MOVF FNTCOD,W XORLW H'03' BTFSS STATUS,Z GOTO CHGFNTC4 MOVLW '3' MOVWF FNTCOD RETURN CHGFNTC4 MOVF FNTCOD,W XORLW H'04' BTFSS STATUS,Z GOTO CHGFNTC5 MOVLW '4' MOVWF FNTCOD RETURN CHGFNTC5 MOVF FNTCOD,W XORLW H'05' BTFSS STATUS,Z GOTO CHGFNTC6 MOVLW '5' MOVWF FNTCOD RETURN CHGFNTC6 MOVF FNTCOD,W XORLW H'06' BTFSS STATUS,Z GOTO CHGFNTC7 MOVLW '6' MOVWF FNTCOD RETURN CHGFNTC7 MOVF FNTCOD,W XORLW H'07' BTFSS STATUS,Z GOTO CHGFNTC8 MOVLW '7' MOVWF FNTCOD RETURN CHGFNTC8 MOVF FNTCOD,W XORLW H'08' BTFSS STATUS,Z GOTO CHGFNTC9 MOVLW '8' MOVWF FNTCOD RETURN CHGFNTC9 MOVF FNTCOD,W XORLW H'09' BTFSS STATUS,Z GOTO CHGFNTCA MOVLW '9' MOVWF FNTCOD RETURN CHGFNTCA MOVF FNTCOD,W XORLW H'0A' BTFSS STATUS,Z GOTO CHGFNTCB MOVLW 'A' MOVWF FNTCOD RETURN CHGFNTCB MOVF FNTCOD,W XORLW H'0B' BTFSS STATUS,Z GOTO CHGFNTCC MOVLW 'B' MOVWF FNTCOD RETURN CHGFNTCC MOVF FNTCOD,W XORLW H'0C' BTFSS STATUS,Z GOTO CHGFNTCD MOVLW 'C' MOVWF FNTCOD RETURN CHGFNTCD MOVF FNTCOD,W XORLW H'0D' BTFSS STATUS,Z GOTO CHGFNTCE MOVLW 'D' MOVWF FNTCOD RETURN CHGFNTCE MOVF FNTCOD,W XORLW H'0E' BTFSS STATUS,Z GOTO CHGFNTCF MOVLW 'E' MOVWF FNTCOD RETURN CHGFNTCF MOVF FNTCOD,W XORLW H'0F' BTFSS STATUS,Z GOTO CHGFNTFCFF MOVLW 'F' MOVWF FNTCOD RETURN CHGFNTFCFF MOVF FNTCOD,W RETURN ;****************************************************************************************** ; Function Name : SETFNT ; Title : ; Input : W-reg ; Output : W-reg ;****************************************************************************************** SETFNT MOVWF FNTCOD XORLW '0' BTFSS STATUS,Z GOTO SETFNT01 MOVLW B'01000000' RETURN SETFNT01 MOVF FNTCOD,W XORLW '1' BTFSS STATUS,Z GOTO SETFNT02 MOVLW B'01111001' RETURN SETFNT02 MOVF FNTCOD,W XORLW '2' BTFSS STATUS,Z GOTO SETFNT03 MOVLW B'00100100' RETURN SETFNT03 MOVF FNTCOD,W XORLW '3' BTFSS STATUS,Z GOTO SETFNT04 MOVLW B'00110000' RETURN SETFNT04 MOVF FNTCOD,W XORLW '4' BTFSS STATUS,Z GOTO SETFNT05 MOVLW B'00011001' RETURN SETFNT05 MOVF FNTCOD,W XORLW '5' BTFSS STATUS,Z GOTO SETFNT06 MOVLW B'00010010' RETURN SETFNT06 MOVF FNTCOD,W XORLW '6' BTFSS STATUS,Z GOTO SETFNT07 MOVLW B'00000010' RETURN SETFNT07 MOVF FNTCOD,W XORLW '7' BTFSS STATUS,Z GOTO SETFNT08 MOVLW B'01111000' RETURN SETFNT08 MOVF FNTCOD,W XORLW '8' BTFSS STATUS,Z GOTO SETFNT09 MOVLW B'00000000' RETURN SETFNT09 MOVF FNTCOD,W XORLW '9' BTFSS STATUS,Z GOTO SETFNT0A MOVLW B'00010000' RETURN SETFNT0A MOVF FNTCOD,W XORLW 'A' BTFSS STATUS,Z GOTO SETFNT0B MOVLW B'00001000' RETURN SETFNT0B MOVF FNTCOD,W XORLW 'B' BTFSS STATUS,Z GOTO SETFNT0C MOVLW B'00000011' RETURN SETFNT0C MOVF FNTCOD,W XORLW 'C' BTFSS STATUS,Z GOTO SETFNT0D MOVLW B'00100111' RETURN SETFNT0D MOVF FNTCOD,W XORLW 'D' BTFSS STATUS,Z GOTO SETFNT0E MOVLW B'00100001' RETURN SETFNT0E MOVF FNTCOD,W XORLW 'E' BTFSS STATUS,Z GOTO SETFNT0F MOVLW B'00000110' RETURN SETFNT0F MOVF FNTCOD,W XORLW 'F' BTFSS STATUS,Z GOTO SETFNT0I MOVLW B'00001110' RETURN SETFNT0I MOVF FNTCOD,W XORLW 'I' BTFSS STATUS,Z GOTO SETFNT0P MOVLW B'01111011' RETURN SETFNT0P MOVF FNTCOD,W XORLW 'P' BTFSS STATUS,Z GOTO SETFNT0R MOVLW B'00001100' RETURN SETFNT0R MOVF FNTCOD,W XORLW 'R' BTFSS STATUS,Z GOTO SETFNT11 MOVLW B'00101111' RETURN SETFNT11 MOVF FNTCOD,W XORLW '-' BTFSS STATUS,Z GOTO SETFNT12 MOVLW B'00111111' RETURN SETFNT12 MOVF FNTCOD,W XORLW '_' BTFSS STATUS,Z GOTO SETFNT13 MOVLW B'01110111' RETURN SETFNT13 MOVF FNTCOD,W XORLW ' ' BTFSS STATUS,Z GOTO SETFNT14 MOVLW B'01111111' RETURN SETFNT14 MOVLW B'01111111' RETURN ;****************************************************************************************** ; Program : WAIT1M ; Title : Wait 10mS * n ; Input : n : W-reg ( 0 < W-reg < 256 ) ; Output : ; Description : ;****************************************************************************************** WAIT1M MOVWF WAT1MLP WAIT1M1 CALL TIMER1M DECFSZ WAT1MLP,F GOTO WAIT1M1 RETURN ;****************************************************************************************** ; Program : TIMER1M ; Title : Timer 10mS ; Input : ; Output : ; Description : Fosc:10MHz ;****************************************************************************************** TIMER1M ; ******************************************************* ; 1.Define T1CON(TIMER1 CONTROL REGISTER) Register ; T1CON(7-6) TMR1CS<1:0>: Timer1 Clock Source Select bits ; 11 =Timer1 clock source is Capacitive Sensing Oscillator (CAPOSC) ; 10 =Timer1 clock source is pin or oscillator: ; If T1OSCEN = 0: External clock from T1CKI pin (on the rising edge) ; If T1OSCEN = 1: Crystal oscillator on T1OSI/T1OSO pins ; 01 =Timer1 clock source is system clock (FOSC) ; 00 =Timer1 clock source is instruction clock (FOSC/4) ; T1CON(5-4) T1CKPS<1:0>: Timer1 Input Clock Prescale Select bits ; 11 = 1:8 Prescale value ; 10 = 1:4 Prescale value ; 01 = 1:2 Prescale value ; 00 = 1:1 Prescale value ; T1CON(3) T1OSCEN: LP Oscillator Enable Control bit ; 1 = Dedicated Timer1 oscillator circuit enabled ; 0 = Dedicated Timer1 oscillator circuit disabled ; T1CON(2) T1SYNC: Timer1 External Clock Input Synchronization Control bit ; TMR1CS<1:0> = 1X ; 1 = Do not synchronize external clock input ; 0 = Synchronize external clock input with system clock (FOSC) ; TMR1CS<1:0> = 0X ; This bit is ignored. Timer1 uses the internal clock when TMR1CS<1:0> = 1X. ; T1CON(1) Unimplemented: Read as ‘0’ ; T1CON(0) TMR1ON: Timer1 On bit ; 1 = Enables Timer1 ; 0 = Stops Timer1 ; Clears Timer1 Gate flip-flop ; ******************************************************* SELBANK 0 ; SET BANK0 MOVLW B'00000101' MOVWF T1CON ; ******************************************************* ; 2.Define T1GCON(TIMER1 GATE CONTROL REGISTER) Register ; T1GCON(7) TMR1GE: Timer1 Gate Enable bit ; If TMR1ON = 0: This bit is ignored ; If TMR1ON = 1: ; 1 = Timer1 counting is controlled by the Timer1 gate function ; 0 = Timer1 counts regardless of Timer1 gate function ; T1GCON(6) T1GPOL: Timer1 Gate Polarity bit ; 1 = Timer1 gate is active-high (Timer1 counts when gate is high) ; 0 = Timer1 gate is active-low (Timer1 counts when gate is low) ; T1GCON(5) T1GTM: Timer1 Gate Toggle Mode bit ; 1 = Timer1 Gate Toggle mode is enabled ; 0 = Timer1 Gate Toggle mode is disabled and toggle flip-flop is cleared ; Timer1 gate flip-flop toggles on every rising edge. ; T1GCON(4) T1GSPM: Timer1 Gate Single-Pulse Mode bit ; 1 = Timer1 gate Single-Pulse mode is enabled and is controlling Timer1 gate ; 0 = Timer1 gate Single-Pulse mode is disabled ; T1GCON(3) T1GGO/DONE: Timer1 Gate Single-Pulse Acquisition Status bit ; 1 = Timer1 gate single-pulse acquisition is ready, waiting for an edge ; 0 = Timer1 gate single-pulse acquisition has completed or has not been started ; This bit is automatically cleared when T1GSPM is cleared. ; T1GCON(2) T1GVAL: Timer1 Gate Current State bit ; Indicates the current state of the Timer1 gate that could be provided to TMR1H:TMR1L. ; Unaffected by Timer1 Gate Enable (TMR1GE). ; T1GCON(1-0) T1GSS<1:0>: Timer1 Gate Source Select bits ; 00 = Timer1 Gate pin ; 01 = Timer0 overflow output ; 10 = Comparator 1 optionally synchronized output (SYNCC1OUT) ; 11 = Comparator 2 optionally synchronized output (SYNCC2OUT) ; ******************************************************* SELBANK 0 ; SET BANK0 MOVLW B'00000000' MOVWF T1GCON ; ******************************************************* ; 3.Define TMR1 Register ; ******************************************************* ; TMR1 data ( OSC:16MHz, 1:1 Prescale value, 0.001[S];1000Hz ) ; 10mS(100Hz): 16MHz / 4(FOSC/4) / 100(100Hz)==> 0d40,000(Count) ==> 0x9C40(Count) ; TMR1 = 0xFFFF - 0x9C40 ==> 0x63BF ; TMR1 data ( OSC:10MHz, 1:1 Prescale value, 0.001[S];1000Hz ) ; 10mS(100Hz): 10MHz / 4(FOSC/4) / 100(100Hz)==> 0d25,000(Count) ==> 0x61A8(Count) ; TMR1 = 0xFFFF - 0x61A8 ==> 0x9E57 SELBANK 0 ; SET BANK0 MOVLW H'9E' MOVWF TMR1H MOVLW H'57' MOVWF TMR1L ; ******************************************************* ; 4.Timer ; ******************************************************* SELBANK 0 ; SET BANK0 BCF PIR1,TMR1IF BTFSS PIR1,TMR1IF GOTO $-1 SELBANK 0 ; SET BANK0 RETURN ;****************************************************************************************** ; Program : INTUART ; Title : ; Input : ; Output : ; Description : Fosc:10MHz, Baud Rate:9600BPS, 16-bit Baud Rate ;****************************************************************************************** INTUART ; ******************************************************* ; 0.Define Interrupts ; ******************************************************* SELBANK 0 ; SET BANK0 ; BCF PIR1,TXIF ; USART Transmit Interrupt Flag bit ; BCF PIR1,RCIF ; USART Receive Interrupt Flag bit BSF INTCON,GIE ; Grobal Interrupt Ebable (->1) BSF INTCON,PEIE ; Peripheral Interrupt Ebable (->1) SELBANK 1 ; SET BANK1 ; BSF PIE1,TXIE ; USART Transmit Interrupt Enable bit (->1) BSF PIE1,RCIE ; USART Receive Interrupt Enable bit (->1) ; ******************************************************* ; 1.Define TXSTA(TRANSMIT STATUS AND CONTROL) Register ; TXSTA(7) CSRC: Clock Source Select bit ; Asynchronous mode:Don’t care ; TXSTA(6) TX9: 9-bit Transmit Enable bit ; 1 = Selects 9-bit transmission ; 0 = Selects 8-bit transmission ; TXSTA(5) TXEN: Transmit Enable bit(1) ; 1 = Transmit enabled ; 0 = Transmit disabled ; TXSTA(4) SYNC: EUSART Mode Select bit ; 1 = Synchronous mode ; 0 = Asynchronous mode ; TXSTA(3) SENDB: Send Break Character bit ; Asynchronous mode: ; 1 = Send Sync Break on next transmission (cleared by hardware upon completion) ; 0 = Sync Break transmission completed ; TXSTA(2) BRGH: High Baud Rate Select bit ; Asynchronous mode: ; 1 = High speed ; 0 = Low speed ; TXSTA(1) TRMT: Transmit Shift Register Status bit ; 1 = TSR empty ; 0 = TSR full ; TXSTA(0) TX9D: Ninth bit of Transmit Data ; Can be address/data bit or a parity bit. ; ******************************************************* SELBANK 3 ; SET BANK3 MOVLW B'00100100' MOVWF TXSTA ; ******************************************************* ; 2.Define RCSTA(RECEIVE STATUS AND CONTROL) Register ; RCSTA(7) SPEN: Serial Port Enable bit ; 1 = Serial port enabled (configures RX/DT and TX/CK pins as serial port pins) ; 0 = Serial port disabled (held in Reset) ; RCSTA(6) RX9: 9-bit Receive Enable bit ; 1 = Selects 9-bit reception ; 0 = Selects 8-bit reception ; RCSTA(5) SREN: Single Receive Enable bit ; Asynchronous mode: ; Don’t care ; RCSTA(4) CREN: Continuous Receive Enable bit ; Asynchronous mode: ; 1 = Enables receiver ; 0 = Disables receiver ; RCSTA(3) ADDEN: Address Detect Enable bit ; Asynchronous mode 9-bit (RX9 = 1): ; 1 = Enables address detection, enable interrupt and load the receive buffer when RSR<8> is set ; 0 = Disables address detection, all bytes are received and ninth bit can be used as parity bit ; Asynchronous mode 8-bit (RX9 = 0): ; Don’t care ; RCSTA(2) FERR: Framing Error bit ; 1 = Framing error (can be updated by reading RCREG register and receive next valid byte) ; 0 = No framing error ; RCSTA(1) OERR: Overrun Error bit ; 1 = Overrun error (can be cleared by clearing bit CREN) ; 0 = No overrun error ; RCSTA(0) RX9D: Ninth bit of Received Data ; This can be address/data bit or a parity bit and must be calculated by user firmware. ; ******************************************************* MOVLW B'10010000' MOVWF RCSTA ; ******************************************************* ; 3.Define BAUDCON(BAUD RATE CONTROL) Register ; BAUDCON(7) ABDOVF: Auto-Baud Detect Overflow bit ; Asynchronous mode: ; 1 = Auto-baud timer overflowed ; 0 = Auto-baud timer did not overflow ; BAUDCON(6) RCIDL: Receive Idle Flag bit ; Asynchronous mode: ; 1 = Receiver is Idle ; 0 = Start bit has been detected and the receiver is active ; BAUDCON(5) Unimplemented: Read as ‘0’ ; BAUDCON(4) SCKP: Synchronous Clock Polarity Select bit ; Asynchronous mode: ; 1 = Transmit inverted data ; 0 = Transmit non-inverted data ; BAUDCON(3) BRG16: 16-bit Baud Rate Generator bit ; 1 = 16-bit Baud Rate Generator is used (SPBRGH:SPBRG) ; 0 = 8-bit Baud Rate Generator is used (SPBRG) ; BAUDCON(2) Unimplemented: Read as ‘0’ ; BAUDCON(1) WUE: Wake-up Enable bit ; Asynchronous mode: ; 1 = Receiver is waiting for a falling edge. No character will be received but RCIF will be set on ; the falling edge. WUE will automatically clear on the rising edge. ; 0 = Receiver is operating normally ; BAUDCON(0) ABDEN: Auto-Baud Detect Enable bit ; Asynchronous mode: ; 1 = Auto-Baud Detect mode is enabled (clears when auto-baud is complete) ; 0 = Auto-Baud Detect mode is disabled ; ******************************************************* MOVLW B'00001000' MOVWF BAUDCON ; ******************************************************* ; 4.Define BRG(EUSART Baud Rate Generator Register) Register ; ******************************************************* ; BRG = 16000000(Hz)/4/9600(BPS)-1 ==> 0d0416 ==> 0x01A0 ; BRG = 10000000(Hz)/4/9600(BPS)-1 ==> 0d0259 ==> 0x0103 ; (1)Define SPBRGH(EUSART Baud Rate Generator Register, High Byte) Register MOVLW H'01' MOVWF SPBRGH ; (2)Define SPBRG(EUSART Baud Rate Generator Register, Low Byte) Register MOVLW H'03' MOVWF SPBRG ; SELBANK 0 ; SET BANK0 RETURN ;****************************************************************************************** ; Program : RECUART ; Title : ; Input : ; Output : W-reg ;****************************************************************************************** RECUART ; **************************** ; 1.Check Recvive Flag ; **************************** SELBANK 0 ; SET BANK0 BCF PIR1,RCIF ; BTFSS PIR1,RCIF GOTO $-1 ; **************************** ; 2.Check error ; **************************** SELBANK 3 ; SET BANK3 BTFSS RCSTA,FERR GOTO RECUART_2 ; SELBANK 0 ; SET BANK0 MOVLW H'00' RETURN RECUART_2 BTFSS RCSTA,OERR GOTO RECUART_3 ; SELBANK 0 ; SET BANK0 MOVLW H'00' RETURN RECUART_3 ; **************************** ; 3.Set Recive Data ; **************************** MOVF RCREG,W MOVWF TMP_C SELBANK 0 ; SET BANK0 MOVFW TMP_C RETURN ;****************************************************************************************** ; Program : SNDUART ; Title : ; Input : W-reg ; Output : ;****************************************************************************************** SNDUART MOVWF TMP_C ; *************************** ; 1.Check Send Flag ; *************************** SELBANK 3 ; SET BANK3; BTFSS TXSTA,TRMT GOTO $-1 ; *************************** ; 2.Set data ; *************************** MOVF TMP_C,W MOVWF TXREG SELBANK 0 ; SET BANK0 RETURN ;****************************************************************************************** ; Program : INTR ; Title : Interrupts ; Input : ; Output : ; Description : ;****************************************************************************************** INTR ; ************************* ; 1.UART Echo ; ************************* CALL RECUART MOVWF UART_C CALL SNDUART ; ************************* ; 2.Process 1 ; ************************* MOVF FLG_S,W XORLW H'00' BTFSC STATUS,Z GOTO INTRB MOVF FLG_S,W XORLW H'01' BTFSS STATUS,Z GOTO INTR02 MOVF UART_C,W MOVWF BD01 CALL SETBUF CLRF FLG_S RETURN INTR02 MOVF FLG_S,W XORLW H'02' BTFSS STATUS,Z GOTO INTR03 MOVF UART_C,W MOVWF BD02 MOVLW H'01' MOVWF FLG_S RETURN INTR03 MOVF FLG_S,W XORLW H'03' BTFSS STATUS,Z GOTO INTR04 MOVF UART_C,W MOVWF BD03 MOVLW H'02' MOVWF FLG_S RETURN INTR04 MOVF FLG_S,W XORLW H'04' BTFSS STATUS,Z GOTO INTR05 MOVF UART_C,W MOVWF BD04 MOVLW H'03' MOVWF FLG_S RETURN INTR05 MOVF FLG_S,W XORLW H'05' BTFSS STATUS,Z GOTO INTR06 MOVF UART_C,W MOVWF BD05 MOVLW H'04' MOVWF FLG_S RETURN INTR06 MOVF FLG_S,W XORLW H'06' BTFSS STATUS,Z GOTO INTR07 MOVF UART_C,W MOVWF BD06 MOVLW H'05' MOVWF FLG_S RETURN INTR07 MOVF FLG_S,W XORLW H'07' BTFSS STATUS,Z GOTO INTR08 MOVF UART_C,W MOVWF BD07 MOVLW H'06' MOVWF FLG_S RETURN INTR08 MOVF FLG_S,W XORLW H'08' BTFSS STATUS,Z GOTO INTR09 MOVF UART_C,W MOVWF BD08 MOVLW H'07' MOVWF FLG_S RETURN INTR09 MOVF FLG_S,W XORLW H'09' BTFSS STATUS,Z GOTO INTR10 MOVF UART_C,W MOVWF BD09 MOVLW H'08' MOVWF FLG_S RETURN INTR10 MOVF FLG_S,W XORLW H'10' BTFSS STATUS,Z GOTO INTR11 MOVF UART_C,W MOVWF BD10 MOVLW H'09' MOVWF FLG_S RETURN INTR11 MOVF FLG_S,W XORLW H'11' BTFSS STATUS,Z GOTO INTR12 MOVF UART_C,W MOVWF BD11 MOVLW H'10' MOVWF FLG_S RETURN INTR12 MOVF FLG_S,W XORLW H'12' BTFSS STATUS,Z GOTO INTR13 MOVF UART_C,W MOVWF BD12 MOVLW H'11' MOVWF FLG_S RETURN INTR13 MOVF FLG_S,W XORLW H'13' BTFSS STATUS,Z GOTO INTR14 MOVF UART_C,W MOVWF BD13 MOVLW H'12' MOVWF FLG_S RETURN INTR14 MOVF FLG_S,W XORLW H'14' BTFSS STATUS,Z GOTO INTR15 MOVF UART_C,W MOVWF BD14 MOVLW H'13' MOVWF FLG_S RETURN INTR15 MOVLW H'14' MOVWF FLG_S RETURN ; ************************* ; 3.Process 2 ; ************************* INTRB MOVF UART_C,W XORLW '>' BTFSS STATUS,Z RETURN MOVLW H'14' MOVWF FLG_S RETURN ;****************************************************************************************** ; Program : SETBUF ; Title : ; Input : ; Output : ; Description : ;****************************************************************************************** SETBUF MOVFW BD14 MOVWF DA0 MOVFW BD13 MOVWF DA1 MOVFW BD12 MOVWF DA2 MOVFW BD11 MOVWF DA3 MOVFW BD10 MOVWF DA4 MOVFW BD09 MOVWF DA5 ; ; MOVFW BD08 MOVWF DB0 MOVFW BD07 MOVWF DB1 MOVFW BD06 MOVWF DB2 MOVFW BD05 MOVWF DB3 MOVFW BD04 MOVWF DB4 MOVFW BD03 MOVWF DB5 ; ; MOVFW BD02 MOVWF DB6 MOVFW BD01 MOVWF DA6 RETURN END