asm-test/character-lcd.asm.in

84 lines
2.3 KiB
NASM

include(`common.m4')
;;; begin lcd_init
;; Set Port A to Output
lcd_init: LDA # hh(L_DDR_MASK)
STA a VIA0_DDRA
;; Function Set:
;; D7 D6 D5 D4 D3 D2 D1 D0
;; 0 0 1 B L F x x
;; (Bits 8/4, Lines 2/1, Font 5x11/5x8)
LDA # %00111000
JSR a :lcd_w_rs0
;; Display ON/OFF:
;; D7 D6 D5 D4 D3 D2 D1 D0
;; 0 0 0 0 0 D C B
;; (Display, Cursor, Blink)
LDA # %00001110
JSR a :lcd_w_rs0
;; Clear Display:
;; D7 D6 D5 D4 D3 D2 D1 D0
;; 0 0 0 0 0 0 0 1
LDA # %00000001
JSR a :lcd_w_rs0
;; Entry Mode Set:
;; D7 D6 D5 D4 D3 D2 D1 D0
;; 0 0 0 0 0 1 I/D S
;; (Increment/Decrement, Shift)
LDA # %00000110
JSR a :lcd_w_rs0
RTS s
;;; end lcd_init
;; write "instruction"
lcd_w_rs0: JSR a :lcd_wait
STA a VIA0_PORTB
LDA # 0
STA a VIA0_PORTA
LDA # hh(C_E)
STA a VIA0_PORTA
LDA # 0
STA a VIA0_PORTA
RTS s
;; write "data" to lcd
lcd_w_rs1: JSR a :lcd_wait
STA a VIA0_PORTB
LDA # hh(C_RS)
STA a VIA0_PORTA
LDA # hh(C_RS|C_E)
STA a VIA0_PORTA
LDA # hh(C_RS)
STA a VIA0_PORTA
RTS s
;; wait BF
lcd_wait: PHA s
LDA # %00000000 ;; Set pins 0-7 on Port B to Input
STA a VIA0_DDRB
_lcd_wait: LDA # hh(C_RW)
STA a VIA0_PORTA
LDA # hh(C_E|C_RW)
STA a VIA0_PORTA
LDA a VIA0_PORTB
AND # %10000000
BNE r :_lcd_wait
LDA # hh(C_RW)
STA a VIA0_PORTA
LDA # %11111111 ;; Set pins 0-7 on Port B to Output
STA a VIA0_DDRB
PLA s
RTS s