フロントウィンドウ上に、走行速度などの情報を表示します。外光があると視認性が落ちるため、夜間もしくはトンネル内でしか機能しません。
アセンブラはMPASMを使用しています。他の構成部品と言語が異なるのは、開発時期が異なるためで、特別な理由はありません。
LIST P=PIC16F84 INCLUDE "P16F84.INC" __CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF ;******************************** ; Define Variables ;******************************** TEMP EQU 10H ;Tempolary Save Area WORK1 EQU 11H WORK2 EQU 12H DIGIT1 EQU 15H ;Dispaly Data 1-2 DIGIT2 EQU 16H ;Display Data 3-4 DAT_CNT EQU 17H COLUM EQU 18H ;Display Digit Position SHIFT EQU 19H ; BLANK EQU 1AH ;BLANK_flag BYTE0 EQU 1EH ;受信データ2バイト目 BYTE1 EQU 1FH ;受信データ1バイト目 CNT1 EQU 20H ;Timer Counter for CLOCK CNT2 EQU 21H CNT3 EQU 22H RX_PORT SET 4 ORG 0 ;******************************** ; Initialize ;******************************** INIT BCF STATUS,RP0 ;switch to Bank0 CLRF PORTA CLRF PORTB BSF STATUS,RP0 ;switch to Bank1 MOVLW B'00010000' MOVWF TRISA ;PortA set MOVLW B'00000000' MOVWF TRISB ;PortB set BCF STATUS,RP0 ;switch to Bank0 CLRF BYTE0 CLRF BYTE1 CALL BCD ;CONVERT TO BCD ;******************************** ; Main routine ;******************************** MAIN BSF BLANK,0 ;Set BLANK_flag MOVLW B'00001000' MOVWF COLUM MOVF DIGIT2,W ;3,4桁目取り出し CALL DISP MOVLW B'00000010' MOVWF COLUM MOVF DIGIT1,W ;1,2桁目取り出し CALL DISP GOTO MAIN ;***************************************** ; 表示出力サブルーチン ; PORTA:桁制御 ; PORTB:セグメント制御 ;***************************************** DISP MOVWF TEMP ;表示データ保存 SWAPF TEMP,W ;上位下位入れ替え CALL GET_7SEG ;セグメントデータに変換 CLRF PORTA MOVWF PORTB ;ポートBへ出力 MOVF COLUM,W ;桁位置取り出し BTFSS BLANK,0 ;check BLANK_flag MOVWF PORTA ;桁出力 BCF STATUS,C ;Carry reset RRF COLUM,F ;次の桁へシフト CALL TIME2MR ;Wait 2msec MOVF TEMP,W ;下位取り出し CALL GET_7SEG CLRF PORTA MOVWF PORTB MOVF COLUM,W BTFSS BLANK,0 ;check BLANK_flag MOVWF PORTA CALL TIME2MR RETURN ;******************************** ; Serial ;******************************** RXD CALL TIME10 CALL TIME10 CALL TIME10 CALL TIME10 CALL TIME10 BTFSC PORTA,RX_PORT ;START_bit ReTest RETURN ;Error Skip CALL TIME10 CALL TIME10 CALL TIME10 CALL TIME10 CALL TIME10 MOVLW 0x10 ;16Bits Counter MOVWF DAT_CNT RXD_LP RLF BYTE0,F ;全ビット左シフト RLF BYTE1,F BSF BYTE0,0 ;最下位に1をセット BTFSS PORTA,RX_PORT ;入力データが1? BCF BYTE0,0 ;最下位を0に再セット CALL TIME100 DECFSZ DAT_CNT,F GOTO RXD_LP BTFSS PORTA,RX_PORT ;Check STOP_bit RETURN CALL BCD RETURN ;************************************* ; Convert BINARY to BCD ;************************************* BCD BCF STATUS,C ;キャリーリセット MOVLW 0x10 ;シフトカウンタ初期化 MOVWF SHIFT CLRF DIGIT1 ;BCDデータエリア初期化 CLRF DIGIT2 ;**** 変換ループ処理 ********** LOOP RLF BYTE0,F ;shift BYTE to DIGIT RLF BYTE1,F RLF DIGIT1,F RLF DIGIT2,F DECFSZ SHIFT,F ;終了か? GOTO ADJST ;BCD調整処理へ RETURN ;***** BCD調整処理 ***** ADJST MOVF DIGIT1,W ;DIGIT1 adjust TO BCD CALL ADJBCD MOVWF DIGIT1 MOVF DIGIT2,W ;DIGIT2 adjust to BCD CALL ADJBCD MOVWF DIGIT2 GOTO LOOP ;**** 1桁BCD調整処理 **** ADJBCD MOVWF WORK1 ;save MOVLW 0x03 ;W+3 ADDWF WORK1,W MOVWF WORK2 BTFSC WORK2,3 ;Test W+3>7 MOVWF WORK1 ;>7 then W+3 else W MOVLW 0x30 ;W+30 ADDWF WORK1,W MOVWF WORK2 BTFSC WORK2,7 ;Test W+30>7* MOVWF WORK1 ;>70 then W+30 else W MOVF WORK1,W RETURN ;************************************************* ; BCDからセグメントへの変換 ;************************************************* GET_7SEG ANDLW 0x0F BTFSS BLANK,0 ;check BLANK_flag GOTO NOTBLNK ANDLW 0x0F BTFSC STATUS,Z ;0 check RETURN BCF BLANK,0 ;Clear BLANK_flag NOTBLNK ADDWF PCL,F ;Add to PC reg ; RETLW B'11101101' ;0 ; RETLW B'01100000' ;1 ; RETLW B'11001110' ;2 ; RETLW B'11101010' ;3 ; RETLW B'01100011' ;4 ; RETLW B'10101011' ;5 ; RETLW B'10101111' ;6 ; RETLW B'11100000' ;7 ; RETLW B'11101111' ;8 ; RETLW B'11101011' ;9 ; Reverse RETLW B'11101101' ;0 RETLW B'01100000' ;1 RETLW B'10101011' ;2 RETLW B'11101010' ;3 RETLW B'01100110' ;4 RETLW B'11001110' ;5 RETLW B'11001111' ;6 RETLW B'01101000' ;7 RETLW B'11101111' ;8 RETLW B'11101110' ;9 ;******************************** ;Timer subroutine ; TIME10 :10u ; TIME100 :100u ;******************************** TIME10 ; -------------- MOVLW D'15' ;10usec MOVWF CNT1 NOP NOP LP1 DECFSZ CNT1,F ;1*(15-1)+2=16 GOTO LP1 ;2*(15-1) =28 RETURN ;4+(16+28)+2= 50 TIME100 ; -------------- MOVLW D'09' ;100usec MOVWF CNT2 NOP NOP LP2 CALL TIME10 ;(2+50)*9=468 DECFSZ CNT2,F ;1*(9-1)+2=10 GOTO LP2 ;2*(9-1) =16 RETURN ;4+(468+10+16)+2= 500 ;***** DISPLAY DELAY AND RECEIVE CHECK **** TIME100R; -------------- MOVLW D'09' ;100usec MOVWF CNT2 BTFSS PORTA,RX_PORT ;Check START_bit CALL RXD ;DATA RECEIVE LP4 CALL TIME10 DECFSZ CNT2,F GOTO LP4 RETURN TIME2MR ; -------------- MOVLW D'19' ;2msec MOVWF CNT3 LP5 CALL TIME100R DECFSZ CNT3,F GOTO LP5 RETURN END