;****************************************************************************************** ; PIC12F1822 Sample Program ; Project : ; Program Name : ; Programer : ; Create date : Version 1.0 H23.02.20 ; History : ; Laungage : MPLAB MPASM ;****************************************************************************************** ; (1)Description ; OSC : Internal OSC 16MHz ;****************************************************************************************** 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 GENERAL PURPOSE RAM AREA (80 bytes maximum) ; TMP_WK EQU 20H ; ; Define Common RAM AREA (16 bytes) ; TMP_C EQU 70H EEP_ADDR EQU 71H EEP_DATA EQU 72H ; Define Macro SELBANK MACRO #BANK_NO MOVLW #BANK_NO MOVWF BSR ENDM EEP_ECO MACRO CALL RECUART MOVWF EEP_DATA CALL SNDUART MOVFW EEP_DATA ENDM EEP_OUT MACRO #ADR MOVWF EEP_DATA MOVLW #ADR MOVWF EEP_ADDR CALL WRT_EEP ENDM EEP_INP MACRO #ADR MOVLW #ADR MOVWF EEP_ADDR CALL READ_EEP MOVFW EEP_DATA ENDM ORG 0h GOTO START ORG 4h GOTO START START ; ***************************** ; 1.Initialized Segment ; ***************************** ; (1)Define OSC (16MHz, IntOSC) SELBANK 1 ; SET BANK1 MOVLW B'11111010' MOVWF OSCCON ; (2)Define I/O port SELBANK 1 ; SET BANK1 MOVLW B'11111111' 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 ; SET BANK0 ; ***************************** ; 2.Program main ; ***************************** ; (1)Main loop MAIN CALL DEMO02 GOTO MAIN ;****************************************************************************************** ; Program : DEMO01 ; Title : ; Input : ; Output : ;****************************************************************************************** DEMO01 MOVLW ' ' CALL SNDUART MOVLW 'P' CALL SNDUART MOVLW 'I' CALL SNDUART MOVLW 'C' CALL SNDUART MOVLW '1' CALL SNDUART MOVLW '2' CALL SNDUART MOVLW 'F' CALL SNDUART MOVLW '1' CALL SNDUART MOVLW '8' CALL SNDUART MOVLW '2' CALL SNDUART MOVLW '2' CALL SNDUART MOVLW ' ' CALL SNDUART MOVLW 'C' CALL SNDUART MOVLW 'o' CALL SNDUART MOVLW 'n' CALL SNDUART MOVLW 'n' CALL SNDUART MOVLW 'e' CALL SNDUART MOVLW 'c' CALL SNDUART MOVLW 't' CALL SNDUART MOVLW 'e' CALL SNDUART MOVLW 'd' CALL SNDUART MOVLW ' ' CALL SNDUART MOVLW 'O' CALL SNDUART MOVLW 'K' CALL SNDUART MOVLW '>' CALL SNDUART MOVLW ' ' CALL SNDUART RETURN ;****************************************************************************************** ; Program : DEMO02 ; Title : ; Input : ; Output : ;****************************************************************************************** DEMO02 ; ****************************** ; READ EEP ; ****************************** ; 1.Title (Start) MOVLW ' ' CALL SNDUART MOVLW 'E' CALL SNDUART MOVLW 'E' CALL SNDUART MOVLW 'P' CALL SNDUART MOVLW ' ' CALL SNDUART MOVLW 'D' CALL SNDUART MOVLW 'A' CALL SNDUART MOVLW 'T' CALL SNDUART MOVLW 'A' CALL SNDUART MOVLW '[' CALL SNDUART ; 2.Data EEP_INP 0 CALL SNDUART EEP_INP 1 CALL SNDUART EEP_INP 2 CALL SNDUART EEP_INP 3 CALL SNDUART EEP_INP 4 CALL SNDUART ; 3.Title (End) MOVLW ']' CALL SNDUART ; ****************************** ; Write EEP ; ****************************** ; 1.Title (Start) MOVLW '=' CALL SNDUART MOVLW '>' CALL SNDUART ; 2.Data EEP_ECO EEP_OUT 0 EEP_ECO EEP_OUT 1 EEP_ECO EEP_OUT 2 EEP_ECO EEP_OUT 3 EEP_ECO EEP_OUT 4 ; 3.Title (End) MOVLW ' ' CALL SNDUART RETURN ;****************************************************************************************** ; Program : INTUART ; Title : ; Input : ; Output : ; Description : Fosc:32MHz, 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 ; 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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 ; 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 : WRT_EEP ; Title : ; Input : EEP_ADDR,EEP_DATA ; Output : ;****************************************************************************************** WRT_EEP SELBANK 3 ; SET BANK3 MOVFW EEP_ADDR MOVWF EEADRL MOVFW EEP_DATA MOVWF EEDATL BCF EECON1,CFGS BCF EECON1,EEPGD BSF EECON1,WREN BCF INTCON,GIE MOVLW 55h MOVWF EECON2 MOVLW 0AAh MOVWF EECON2 BSF EECON1,WR BSF INTCON,GIE BCF EECON1,WREN BTFSC EECON1,WR GOTO $-2 SELBANK 0 ; SET BANK0 ;****************************************************************************************** ; Program : READ_EEP ; Title : ; Input : ; Output : EEP_ADDR,EEP_DATA ;****************************************************************************************** READ_EEP SELBANK 3 ; SET BANK3 MOVFW EEP_ADDR MOVWF EEADRL ; BCF EECON1,CFGS BCF EECON1,EEPGD BSF EECON1,RD MOVF EEDATL,W MOVWF EEP_DATA SELBANK 0 ; SET BANK0 RETURN END