LCDキャラクターディスプレイ / 8ビットモード

pp.394-396
とにかく何かを1文字ずつ表示する。書き込みしかしないのでR/W端子はGNDに固定した。
f:id:ti-nspire:20200607083002p:plain:h300 f:id:ti-nspire:20200607080955j:plain:h300

.EQU RS = PB0
.EQU EN = PB2

; スタックポインタの初期化マクロ
.MACRO INITSTACK
    LDI R20, HIGH(RAMEND)
    OUT SPH, R20
    LDI R20, LOW(RAMEND)
    OUT SPL, R20
.ENDMACRO

INITSTACK

; PORTDを8本全部使って命令とデータとを出すことにする。
LDI R21, 0xFF
OUT DDRD, R21

; PB0からRS信号を、PB2からEN信号を出すことにする。
SBI DDRB, RS
SBI DDRB, EN

; 最初disableにして少し待つ。
CBI PORTB, EN
CALL DELAY_40ms

; Function Set
; 1, 8/4 bits, 2/1 lines, 10/8 dots, don't care, don't care
LDI R16, 0b111000
CALL COMMAND_W
CALL DELAY_100us

; Display ON/OFF Control
; 1, 文字表示, カーソル表示, カーソル点滅
LDI R16, 0b1111
CALL COMMAND_W
CALL DELAY_100us

; Clear Display
LDI R16, 0x01
CALL COMMAND_W
CALL DELAY_2ms

; Entry Mode Set
; 1, 右/左シフト, 表示範囲全体シフト有効化 
LDI R16, 0b110
CALL COMMAND_W
CALL DELAY_100us

LDI R16, 'h'
CALL DATA_W
LDI R16, 'e'
CALL DATA_W
LDI R16, 'l'
CALL DATA_W
LDI R16, 'l'
CALL DATA_W
LDI R16, 'o'
CALL DATA_W
LDI R16, ','
CALL DATA_W
LDI R16, ' '
CALL DATA_W
LDI R16, 'ワ'
CALL DATA_W
LDI R16, '-'
CALL DATA_W
LDI R16, 'ル'
CALL DATA_W
LDI R16, 'ト'
CALL DATA_W
LDI R16, '゙'
CALL DATA_W

HERE:
    RJMP HERE

; 命令を書き込むためのサブルーチン
COMMAND_W:
    OUT PORTD, R16
    CBI PORTB, RS
    SBI PORTB, EN
    CALL SHORT_DELAY
    CBI PORTB, EN
    CALL DELAY_100us
    RET

; データを書き込むためのサブルーチン
DATA_W:
    OUT PORTD, R16
    SBI PORTB, RS
    SBI PORTB, EN
    CALL SHORT_DELAY
    CBI PORTB, EN
    CALL DELAY_100us
    RET

SHORT_DELAY:
    RET ; 4

DELAY_100us:
    PUSH R17          ; 2
    LDI R17, 200      ; 1
DR0:
    RCALL SHORT_DELAY ; 3
    DEC R17           ; 1
    BRNE DR0          ; falseで1, trueで2
    POP R17           ; 2
    RET               ; 4

DELAY_2ms:
    PUSH R17          ; 2 
    LDI R17, 20       ; 1
LDR0:
    RCALL DELAY_100us ; 3
    DEC R17           ; 1
    BRNE LDR0         ; falseで1, trueで2
    POP R17           ; 2
    RET               ; 4

DELAY_40ms:
    PUSH R17        ; 2
    LDI R17, 20     ; 1
LLDR0:
    RCALL DELAY_2ms ; 3
    DEC R17         ; 1
    BRNE LLDR0      ; falseで1, trueで2
    POP R17         ; 2
    RET             ; 4