;****************************************************************************************** ; PIC12F1822 Sample Program ; Project : ; Program Name : ; Programer : ; Create date : Version 1.0 H24.03.30 ; History : ; Laungage : MPLAB MPASM ;****************************************************************************************** ; (1)Description ; OSC : Internal OSC 16MHz ; I/O PORT ; PORTA(0) : Reset ; PORTA(1) : Clock ; PORTA(2) : Mode ; PORTA(3) : None ; PORTA(4) : Tx ; PORTA(5) : Rx ;****************************************************************************************** LIST P=PIC12F1822,ST=OFF,R=DEC INCLUDE "P12F1822.inc" __CONFIG _CONFIG1 , _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF __CONFIG _CONFIG2 , _WRT_OFF & _PLLEN_OFF & _STVREN_OFF & _BORV_25 & _LVP_OFF ; ; Define Parameter ; RESBIT EQU H'0000' CLKBIT EQU H'0001' MODEBIT EQU H'0002' ; ; Define GENERAL PURPOSE RAM AREA (80 bytes maximum) ; TMP_WK EQU 20H TMP_WK1 EQU 21H TMP_LP EQU 22H ; ; Define Common RAM AREA (16 bytes) ; TMP_C EQU 70H TMP_UAR EQU 71H ; Define Macro SELBANK MACRO #BANK_NO MOVLW #BANK_NO MOVWF BSR ENDM PUTUART MACRO #CHAR_UART MOVLW #CHAR_UART CALL SNDUART ENDM ORG 0h GOTO START ORG 4h GOTO START START ; ***************************** ; 1.Initialized Segment ; ***************************** ; (1)Define OSC (16MHz, IntOSC) SELBANK 1 MOVLW B'11111010' MOVWF OSCCON ; (2)Define I/O port SELBANK 0 CLRF PORTA SELBANK 1 MOVLW B'11111000' MOVWF TRISA ; (3)Define APFCON Register SELBANK 2 ; SET BANK2 BSF APFCON,RXDTSEL ; RX ==> RA5 BSF APFCON,TXCKSEL ; TX ==> RA4 ; (3)Initialized EUART CALL INTUART ; (4)Demo Message CALL DEMO01 SELBANK 0 ; ***************************** ; 2.Program main ; ***************************** MAIN ; 1.Echo UART-data ; (1)Get UART-data CALL RECUART MOVWF TMP_UAR ; (2)Check UART-data CALL CHKDAT ; (3)Error routing XORLW H'00' BTFSS STATUS,Z GOTO MAIN ; (4)Echo UART-data MOVF TMP_UAR,W CALL SNDUART ; 2.Output data ; (1)Edit data MOVF TMP_UAR,W CALL EDTDAT ; (2)Output data CALL OUTDAT GOTO MAIN ;****************************************************************************************** ; Program : DEMO01 ; Title : ; Input : ; Output : ;****************************************************************************************** DEMO01 PUTUART ' ' PUTUART 'P' PUTUART 'I' PUTUART 'C' PUTUART '1' PUTUART '2' PUTUART 'F' PUTUART '1' PUTUART '8' PUTUART '2' PUTUART '2' PUTUART ' ' PUTUART 'C' PUTUART 'o' PUTUART 'n' PUTUART 'n' PUTUART 'e' PUTUART 'c' PUTUART 't' PUTUART 'e' PUTUART 'd' PUTUART ' ' PUTUART 'O' PUTUART 'K' PUTUART '>' PUTUART ' ' PUTUART ' ' PUTUART 'I' PUTUART 'N' PUTUART 'P' PUTUART 'U' PUTUART 'T' PUTUART '(' PUTUART '1' PUTUART '-' PUTUART '8' PUTUART ')' PUTUART ' ' RETURN ;****************************************************************************************** ; Program : CHKDAT ; Title : Check 1-7 ; Input : ; Output : ; Description : ;****************************************************************************************** CHKDAT MOVWF TMP_WK1 ; (1)0 <= INDAT < 0x30 MOVWF TMP_WK ; MOVLW H'30' MOVLW H'31' SUBWF TMP_WK,F BTFSC STATUS,C GOTO CHKDAT1 RETLW H'01' CHKDAT1 ; (2)0x30 <= INDAT < 0x40 MOVF TMP_WK1,W MOVWF TMP_WK ; MOVLW H'40' MOVLW H'39' SUBWF TMP_WK,F BTFSC STATUS,C RETLW H'01' RETLW H'00' ;****************************************************************************************** ; Program : EDTDAT ; Title : ; Input : ; Output : ; Description : ;****************************************************************************************** EDTDAT ANDLW B'00001111' RETURN ;****************************************************************************************** ; Program : OUTDAT ; Title : ; Input : ; Output : ; Description : ;****************************************************************************************** OUTDAT MOVWF TMP_LP ; ********************** ; 1.Reset CPLD ; ********************** BSF PORTA,RESBIT NOP NOP BCF PORTA,RESBIT NOP NOP ; ********************** ; 2.Output data ; ********************** OUTDAT1 BSF PORTA,CLKBIT NOP NOP BCF PORTA,CLKBIT NOP NOP DECFSZ TMP_LP,F GOTO OUTDAT1 ; ********************** ; 3.Set data ; ********************** BSF PORTA,MODEBIT NOP NOP BCF PORTA,MODEBIT NOP NOP RETURN ;****************************************************************************************** ; Program : INTUART ; Title : ; Input : ; Output : ; Description : Fosc:16MHz, Baud Rate:9600BPS, 16-bit Baud Rate ;****************************************************************************************** INTUART ; ******************************************************* ; 1.Define TXSTA(TRANSMIT STATUS AND CONTROL) Register ; TXSTA(7) CSRC: Clock Source Select bit ; Asynchronous mode:Donft 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 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ft 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ft 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 e0f ; 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 e0f ; 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 ; ******************************************************* ; 3.Define BRG(EUSART Baud Rate Generator Register) Register ; ******************************************************* ; BRG = 16000000(Hz)/4/9600(BPS)-1 ==> 0d0416 ==> 0x1A0 ; (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'A0' MOVWF SPBRG ; SELBANK 0 RETURN ;****************************************************************************************** ; Program : RECUART ; Title : ; Input : ; Output : W-reg ;****************************************************************************************** RECUART ; **************************** ; 1.Check Recvive Flag ; **************************** SELBANK 0 BCF PIR1,RCIF ; BTFSS PIR1,RCIF GOTO $-1 ; **************************** ; 2.Check error ; **************************** SELBANK 3 BTFSS RCSTA,FERR GOTO RECUART_2 ; SELBANK 0 MOVLW H'00' RETURN RECUART_2 BTFSS RCSTA,OERR GOTO RECUART_3 ; SELBANK 0 MOVLW H'00' RETURN RECUART_3 ; **************************** ; 3.Set Recive Data ; **************************** MOVF RCREG,W MOVWF TMP_C SELBANK 0 MOVFW TMP_C RETURN ;****************************************************************************************** ; Program : SNDUART ; Title : ; Input : W-reg ; Output : ;****************************************************************************************** SNDUART MOVWF TMP_C ; *************************** ; 1.Check Send Flag ; *************************** SELBANK 3 BTFSS TXSTA,TRMT GOTO $-1 ; *************************** ; 2.Set data ; *************************** MOVF TMP_C,W MOVWF TXREG SELBANK 0 RETURN END