【プログラムを奇麗に書く】
プログラムを書く時、最も気にしなければならないことは、まず奇麗に
書くことです。これは、上手なプログラムを書くことでは無く、見た目だけ
の話です。つまり、プログラムのリストを見た目に奇麗にすることで、
後から他人が見たり、自分が見直しをする時非常に見やすいということ
が肝心なことだからです。
【奇麗に書くには】
プログラムリストが奇麗になるようにするには、いくつかのコツがあります。
【プログラム例】
下記は実際に私が作成したプログラムです。多少我流の所があります
が、まあまあわかりやすい方だと思います。
;*************************************************************
;************** RS232C PROCESS *****************************
;**** Preset Baud Rate ****
;************ Define constant for TIMER0 ****
;BaudRate PulseWidth Counter prescale TMR0(BITTMR) width
; 300 3333.33usec 8333 64(5) 130(7E) 3328usec
; 1200 833.33 2083 16(3) 130(7E) 832
; 2400 416.67 1041 8(2) 128(80) 409
; 4800 208.33 521 4(1) 124(84) 198
; 9600 104.17 260 2(0) 122(86) 99
; This TMR0 RATE is used for BAUDRATE parameter as prescaler.
;
;BAUDRATE:boud rate 300 to 9600 at 10MHz clock.
; 5=300bps 3=1200bps 2=2400bps 1=4800bps 0=9600bps
;
BAUDRATE SET 0 ;preset to 9600bps
BITTMR SET 086H ;TMR0 DATA -122
BITTMR1 SET 06AH ;TMR0 DATA -150
;
;****************************************
; Interrupt process module
;****************************************
INTERRUPT
BTFSS INTCON,T0IF ;TMR0's interrupt?
RETFIE ;not, quick return
BCF INTCON,T0IF ;reset T0IF bit
;**** save W register & status register
MOVWF WREG ;save w reg
SWAPF STATUS,W ;status to wreg
MOVWF SREG ;save status
BTFSC TXBUSY ;In send mode
GOTO TXNEXT ;send next bit
BTFSC RXBUSY ;In receive mode
GOTO RXNEXT ;receive next bit
GOTO STARTBIT ;must be start bit
;**** register restore and return
RESTORE
SWAPF SREG,W ;get saved status
MOVWF STATUS
SWAPF WREG,F ;get saved wreg
SWAPF WREG,W
RETFIE
;************************************
; Transmission process module
;************************************
PUTCHAR
BSF TXBUSY ;set busy bit
MOVLW 8 ;bit count
MOVWF BITCNT ;reset bit counter
MOVLW 1
MOVWF EXTRA ;set stopbit flag
CALL TXSTART ;start send dumy bit
BCF INTCON,T0IF ;reset flag
BSF INTCON,T0IE ;permit TMR0 interrupt
RETFIE
;**** Send start bit ****
TXSTART
CLRF TMR0 ;reset timer
BSF STATUS,RP0 ;page 1
CLRWDT
MOVLW BAUDRATE ;set prescaler
MOVWF OPTION_REG
BCF STATUS,RP0 ;page 0
BCF PORTA,3 ;send start bit
MOVLW BITTMR
MOVWF TMR0 ;start timer
RETURN
;****** Interrupt process for Send next bit *****
TXNEXT
MOVLW BITTMR ;timer restart
MOVWF TMR0
MOVF BITCNT ;end test
BTFSC STATUS,Z
GOTO STOPBIT ;send stop bit
NEXT TXBIT
DECF BITCNT,F ;BITCNT-1
BSF STATUS,C ;C on
RRF TXREG ;shift send data
BTFSS STATUS,C ;bit test
BCF PORTA,3 ;0 out
BTFSC STATUS,C
BSF PORTA,3 ;1 out
GOTO RESTORE ;return
;**** Send Stop bit ****
STOPBIT
MOVF EXTRA,W
BTFSC STATUS,Z ;end test
GOTO DONE ;goto end
DECF EXTRA,F ;end of stop
BSF PORTA,3 ;send 1 for stop bit
GOTO RESTORE ;return
;*** all end of send ****
DONE
BCF INTCON,T0IE ;Disable interrupt
BCF TXBUSY ;reset busy flag
GOTO RESTORE ;return
;***********************************************************