使用带有 65c22 VIA 的 lcd HD44780U LCD 4 位模式的问题新手组装

问题描述

我正在按照 Ben Eater 的教程运行简单的 65c02 计算机设置并使用 65c22 VIA 添加 LCD 和显示,以及此时的任何内容。 8 位模式没有问题,但是当我试图想出如何使用 4 位模式时,没有任何效果

目前我想要 4 位用于从 65c22 上的 PORT B 到 LCD 显示器的数据,以及从 PORT B 到 LCD 的 E RS 和 RW 控制信号的另外 3 位。我知道在指令之间有延迟很重要,这就是为什么我从代码删除它并决定减慢时钟速度,这样就不会成为问题。这是我目前拥有的代码

PORTB = $6000
PORTA = $6001
DDRB = $6002
DDRA = $6003

E = %00000001  
RW = %00000010
RS = %00000100

SETMODE = %00100000  ; set 4 bit mode
CHARSETA = %00100000  ; set 1-line disply 5x8 char
CHARSETB = %00000000
disPLAYA = %00000000  ; Set display on and cursor on
disPLAYB = %11100000  
disPLAYINCA = %00000000  ; increments the cursor to the right
disPLAYINCB = %01100000

disPLAYHA = %01000000  ; display letter H
disPLAYHB = %10000000

  .org $8000

reset:
  
  lda #%11111111  ; set port B to be outputs
  sta DDRB
  
  jsr delay

  lda #SETMODE   ; set 4-bit mode
  sta PORTB
  
  jsr delay

  lda #(E | SETMODE)  ; toggle E
  sta PORTB
  
  jsr delay

  lda #SETMODE    ; toggle E back to 0
  sta PORTB
  
  jsr delay

  lda #CHARSETA   ; set 1-line disply 5x8 char
  STA PORTB
  
  jsr delay

  lda #(E | CHARSETA)   ; toggle E
  sta PORTB
  
  jsr delay

  lda #CHARSETA     ; toggle E back to 0
  sta PORTB
  
  jsr delay

  lda #CHARSETB
  sta PORTB
  
  jsr delay

  lda #(E | CHARSETB)
  sta PORTB
  
  jsr delay

  lda #CHARSETB
  sta PORTB
  
  jsr delay

  lda #disPLAYA
  sta PORTB
  
  jsr delay

  lda #(E | disPLAYA)
  sta PORTB
  
  jsr delay

  lda #disPLAYA
  sta PORTB
  
  jsr delay

  lda #disPLAYB
  sta PORTB
  
  jsr delay

  lda #(E | disPLAYB)
  sta PORTB
  
  jsr delay

  lda #disPLAYB
  sta PORTB
  
  jsr delay

  lda #disPLAYINCA
  sta PORTB
  
  jsr delay

  lda #(E | disPLAYINCA)
  sta PORTB
  
  jsr delay

  lda #disPLAYINCA
  sta PORTB
  
  jsr delay

  lda #disPLAYINCB
  sta PORTB
  
  jsr delay

  lda #(E | disPLAYINCB)
  sta PORTB
  
  jsr delay

  lda #disPLAYINCB
  sta PORTB
  
  jsr delay

  lda #RS
  sta PORTB
  
  jsr delay

  lda #(RS | disPLAYHA)    ; display first 4 bits for letter H
  sta PORTB
  
  jsr delay

  lda #(E | RS | disPLAYHA)  ; Set E high and also keep RS high
  sta PORTB
  
  jsr delay

  lda #(RS | disPLAYHA)    ; set E low again and only keep RS high
  sta PORTB
  
  jsr delay

  lda #RS
  sta PORTB
  
  jsr delay

  lda #(RS | disPLAYHB)     ; display second 4 bits for letter H
  sta PORTB
  
  jsr delay
 
  lda #(E | RS | disPLAYHB)    ; Set E high and also keep RS high
  sta PORTB
  
  jsr delay

  lda #(RS | disPLAYHB)   ; set E low again and only keep RS high
  sta PORTB
  
  jsr delay



loop:      ; do nothing really and stay in loop
  jmp loop


delay:      ; this is how I did the loop. No need for the clc's I guess
  pha
  clc
  ldy #$ff   ; change that value to control how long the loop will be
  ldx #$ff   ; change that value to control how long the loop will be
delayparttwo:
  dex
  bne delayparttwo
  clc
  dey
  bne delayparttwo
  clc
  pla
  rts


  .org $fffc
  .word reset
  .word $0000

我正在尝试以最简单的方式执行此操作,以便在进一步优化代码之前先使其工作。这是按照 4 位模式的 HD44780U 数据表示例完成的。然而,液晶显示器上没有任何反应。如果这种方法接近应该完成的正确方法,有什么想法吗?谢谢!

这是我想出来的更新和固定代码,只是为了测试和开始,没有将大部分代码添加到子程序中。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)