;****************************************************************************************** ; PIC12F1822 Sample Program ; Project : ; Program Name : ; Programer : ; Create date : Version 1.0 H23.07.01 ; History : ; Laungage : MPLAB MPASM ;****************************************************************************************** ; Description ; (1)Sysytem Clock ; Internal OSC 16MHz ; (2)I/O Port ; Mouse clock (In) : PORTA(0) ; Mouse clock (Out): PORTA(1) ; Mouse data (Out): PORTA(2) ; Mouse data (In) : PORTA(3) ; Sereal Port (Tx) : PORTA(4) ; Sereal Port (Rx) : PORTA(5) ; ;****************************************************************************************** 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_G EQU 20H KEYDAT EQU 21H KEYRECLP EQU 22H BITDAT EQU 23H PRTDAT EQU 24H ; ; Define Common RAM AREA (16 bytes) ; TMP_C EQU 70H LP1 EQU 71H LP2 EQU 72H LP3 EQU 73H DAT0 EQU 74H DAT1 EQU 75H DAT2 EQU 76H ; ; Define USER Symbol ; PI_CLK_I EQU 0 PI_CLK_O EQU 1 PI_DAT_O EQU 2 PI_DAT_I EQU 3 ; ; Define Macro ; SELBANK MACRO #BANK_NO MOVLW #BANK_NO MOVWF BSR ENDM SNDDATA MACRO #HOS_DATA,#PRT_DATA MOVLW #HOS_DATA MOVWF KEYDAT MOVLW #PRT_DATA MOVWF PRTDAT CALL SNDCMD ENDM PUTUART MACRO #UAR_CHAR MOVLW #UAR_CHAR CALL SNDUART ENDM CLK_H MACRO BCF PORTA,PI_CLK_O ENDM CLK_L MACRO BSF PORTA,PI_CLK_O ENDM DAT_H MACRO BCF PORTA,PI_DAT_O ENDM DAT_L MACRO BSF PORTA,PI_DAT_O 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 APFCON Register SELBANK 2 ; SET BANK2 BSF APFCON,RXDTSEL ; RX ==> RA5 BSF APFCON,TXCKSEL ; TX ==> RA4 ; (3)Initialized EUART CALL INTUART ; (4)Define ANSELA (ALL Digital Port) SELBANK 3 ; SET BANK3 CLRF ANSELA ; (5)Define I/O port SELBANK 0 ; SET BANK0 CLRF PORTA SELBANK 1 ; SET BANK1 MOVLW B'11111001' MOVWF TRISA SELBANK 0 ; SET BANK0 ; ***************************** ; 2.Program main ; ***************************** ; (1)Initialized Mouse CALL INTMOUS ; (2)Put Message CALL PUTSTRMSG ; (3)Main loop MAIN CALL PRG01 GOTO MAIN ; ;****************************************************************************************** ; Function Name : PUTSTRMSG ; Title : START MESSAGE ; Input : ; Output : ;****************************************************************************************** PUTSTRMSG 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 ' ' RETURN ; ;****************************************************************************************** ; Function Name : PRG01 ; Title : ; Input : ; Output : ;****************************************************************************************** PRG01 ; 1.Get data CALL GETCMD MOVF KEYDAT,W MOVWF DAT0 ; CALL GETCMD MOVF KEYDAT,W MOVWF DAT1 ; CALL GETCMD MOVF KEYDAT,W MOVWF DAT2 ; 2.Put data PUTUART '[' MOVF DAT0,W CALL DMPUART PUTUART '/' MOVF DAT1,W CALL DMPUART PUTUART '/' MOVF DAT2,W CALL DMPUART PUTUART ']' PUTUART ' ' PUTUART ' ' RETURN ; ;****************************************************************************************** ; Function Name : DMPUART ; Title : Dump command ; Input : W-reg ; Output : ;****************************************************************************************** DMPUART MOVWF KEYDAT ; MOVLW H'08' MOVWF KEYRECLP DMPUART1 BTFSS KEYDAT,7 PUTUART '0' BTFSC KEYDAT,7 PUTUART '1' RLF KEYDAT,F DECFSZ KEYRECLP,F GOTO DMPUART1 RETURN ; ;****************************************************************************************** ; Function Name : INTMOUS ; Title : Initialized Mouse ; Input : ; Output : ;****************************************************************************************** INTMOUS ; 1.Resive Mouse Start Command ; (1)Start CALL GETCMD ; (2)Command Pass CALL LP01S ; 2.Send Host Command ; (1)Start Condition CALL STRCOND ; (2)Enable device SNDDATA H'F4',H'00' ; Send command-data (#Data,#Parity) ; (3)Command Pass CALL LP01S RETURN ; ;****************************************************************************************** ; Function Name : STRCOND ; Title : Start Condition ; Input : ; Output : ;****************************************************************************************** STRCOND CLK_L CALL LOOPA DAT_L CALL LOOPA CLK_H RETURN ; ;****************************************************************************************** ; Function Name : SNDCMD ; Title : Send Host Command ; Input : KEYDAT ; Output : ;****************************************************************************************** SNDCMD ; 1.Wait command BTFSC PORTA,PI_CLK_I GOTO GETCMD DAT_L CALL WRTBIT ; 2.Write data(8Bit) MOVLW H'08' MOVWF KEYRECLP SNDCMD1 BTFSC PORTA,PI_CLK_I GOTO $-1 BTFSS KEYDAT,0 DAT_L BTFSC KEYDAT,0 DAT_H RRF KEYDAT,F CALL WRTBIT ; DECFSZ KEYRECLP,F GOTO SNDCMD1 ; 3.Wait parity-bit (1の数を奇数にする!!!!) BTFSC PORTA,PI_CLK_I GOTO $-1 BTFSS PRTDAT,0 DAT_L BTFSC PRTDAT,0 DAT_H CALL WRTBIT ; 4.Wait stop-bit BTFSC PORTA,PI_CLK_I GOTO $-1 DAT_H CALL WRTBIT ; 5.Wait ; CALL TIMERB RETURN ;******************************************************************************************* ; Function Name : WRTBIT ; Title : Write bit ; Input : BITDAT ; Output : ;******************************************************************************************* WRTBIT BTFSS PORTA,PI_CLK_I GOTO WRTBIT RETURN ;******************************************************************************************* ; Function Name : GETCMD ; Title : ; Input : ; Output : KEYDAT ;******************************************************************************************* GETCMD ; 1.Wait command BTFSC PORTA,PI_CLK_I GOTO $-1 CALL REDBIT ; 2.Recive data(8Bit) CLRF KEYDAT MOVLW H'08' MOVWF KEYRECLP GETCMD0 RRF KEYDAT,F ; BTFSC PORTA,PI_CLK_I GOTO $-1 CALL REDBIT BTFSS BITDAT,0 BCF KEYDAT,7 BTFSC BITDAT,0 BSF KEYDAT,7 ; DECFSZ KEYRECLP,F GOTO GETCMD0 ; 3.Wait parity-bit BTFSC PORTA,PI_CLK_I GOTO $-1 CALL REDBIT ; 4.Wait stop-bit BTFSC PORTA,PI_CLK_I GOTO $-1 CALL REDBIT ; 5.Wait ; CALL TIMERB RETURN ;******************************************************************************************* ; Function Name : REDBIT ; Title : Read bit ; Input : ; Output : BITDAT ;******************************************************************************************* REDBIT NOP CLRF BITDAT BTFSC PORTA,PI_DAT_I BSF BITDAT,0 BTFSS PORTA,PI_DAT_I BCF BITDAT,0 REDBIT1 BTFSS PORTA,PI_CLK_I GOTO REDBIT1 NOP RETURN ; ;****************************************************************************************** ; Function Name : LOOPA ; Title : ; Input : ; Output : ;****************************************************************************************** LOOPA MOVLW H'0F' MOVWF LP1 LOOPA1 NOP NOP NOP NOP NOP NOP NOP NOP DECFSZ LP1,F GOTO LOOPA1 RETURN ; ;****************************************************************************************** ; Function Name : LP01S ; Title : Wait about 0.1[S] ; Input : ; Output : ; Descriptrion : 16/4MHz ==(40)==>100KHz==(100)==>1KHz==(100)==>10Hz ;****************************************************************************************** LP01S MOVLW H'28' MOVWF LP3 LP01S3 MOVLW H'64' MOVWF LP2 LP01S2 MOVLW H'0A' MOVWF LP1 LP01S1 NOP NOP NOP NOP NOP NOP NOP NOP DECFSZ LP1,F GOTO LP01S1 DECFSZ LP2,F GOTO LP01S2 DECFSZ LP3,F GOTO LP01S3 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’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 ; ******************************************************* ; 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 END