You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
91 lines
1.4 KiB
91 lines
1.4 KiB
PORTB = $6000 |
|
PORTA = $6001 |
|
DDRB = $6002 |
|
DDRA = $6003 |
|
|
|
E = %10000000 |
|
RW = %01000000 |
|
RS = %00100000 |
|
|
|
.org $8000 |
|
|
|
|
|
|
|
reset: |
|
lda #%11111111 ; Set all pins on port B to output |
|
sta DDRB |
|
|
|
lda #%11100000 ; Set top 3 pins on port A to output |
|
sta DDRA |
|
|
|
lda #%00111000 ; Set 8-bit mode; 2-line display; 5x8 font |
|
jsr send_inst |
|
|
|
lda #%00001110 ; Display on; cursor on; blink off |
|
jsr send_inst |
|
|
|
lda #%00000001 ; Reset display |
|
jsr send_inst |
|
|
|
lda #%00000110 ; Increment and shift cursor; don't shift display |
|
jsr send_inst |
|
|
|
ldx #0 |
|
print: |
|
lda message,x |
|
beq loop |
|
jsr send_data |
|
inx |
|
jmp print |
|
|
|
loop: |
|
jmp loop |
|
|
|
message: .asciiz "Hello again, Kiddies!" |
|
|
|
lcd_wait: |
|
pha |
|
lda #%00000000 ; PORT B to INPUT |
|
sta DDRB |
|
lcd_busy: |
|
lda #RW |
|
sta PORTA |
|
lda #(RW | E) |
|
sta PORTA |
|
lda PORTB |
|
and #%10000000 |
|
bne lcd_busy |
|
|
|
lda #RW |
|
sta PORTA |
|
lda #%11111111 ; PORT B to output |
|
sta DDRB |
|
pla |
|
rts |
|
|
|
send_inst: |
|
jsr lcd_wait |
|
sta PORTB |
|
lda #0 ; Clear RS/RW/E bits |
|
sta PORTA |
|
lda #E ; Set E bit to send instruction |
|
sta PORTA |
|
lda #0 ; Clear RS/RW/E bits |
|
sta PORTA |
|
rts |
|
|
|
send_data: |
|
jsr lcd_wait |
|
sta PORTB |
|
lda #RS ; Set RS; Clear RW/E bits |
|
sta PORTA |
|
lda #(RS | E) ; Set E bit to send instruction |
|
sta PORTA |
|
lda #RS ; Clear E bits |
|
sta PORTA |
|
rts |
|
|
|
|
|
.org $fffc |
|
.word reset |
|
.word $0000
|
|
|