ヘッドアップディスプレイ (Head-Up Display : HUD)の製作

フロントウィンドウ上に、走行速度などの情報を表示します。外光があると視認性が落ちるため、夜間もしくはトンネル内でしか機能しません。

プログラム

アセンブラは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