LCDキャラクターディスプレイ / 8ビットモード
pp.394-396
とにかく何かを1文字ずつ表示する。書き込みしかしないのでR/W端子はGNDに固定した。
.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