1

我在硬件中为自己制作了一个字符 LCD 驱动程序(LCD 有一个 HD47780 芯片组),其中数据在 ROM 上预定义,我还制作了一个电路来加载 ROM。

在下面的第一张图片中,ROM maker 电路的一部分(我通过并行端口连接到我的计算机)连接起来,以便 ROM 上的数据引脚排列如下,从 LSB(最低有效位)到 MSB(最高有效位):

A8,A9,A10,A11,A12,A13,A14,A0,A1,A2,A3,A4,A5,A6,A7

ROM制造商

下一个图像是 LCD 驱动程序的一部分。将rom(使用rom maker制作)插入驱动器,移位寄存器用于选择地址和控制RS(LCD处于命令模式还是数据模式)。

两个移位寄存器的时钟都与微控制器的一个引脚以及一个定时器相关联,该定时器使 LCD 使能线变为高电平 220 微秒,每次时钟逻辑电平变化时都会延长时间。第一个寄存器 (INP) 的数据输入连接在一起,也连接到微控制器的另一个引脚。CLR 输入连接到高电平以启用输出。

液晶驱动器

我用我制作的 rom 测试仪测试了 rom 中的前 256 个字节的数据,输出是正确的,所以我看不出我的 rom 是问题,所以现在我看到问题出在代码上。

这是我的代码:

LCDC equ(时钟到移位寄存器 GPIO 引脚) DAT equ(移位寄存器数据输入引脚)

  ;Inputs to function:
  ; RSLINE (0=want LCD command mode, 1=want LCD data mode)
  ; DPTR (15-bit address to data. highest bit ignored)

  lcdwrite:
; Reset values
clr LCDC
clr LCDEOD
clr C
; (I might have screwed up here) Take low byte and shift left and save result to R7
mov A,DPL
rlc A
mov R7,A
; Shift high byte and let the MSB of the low byte be the LSB of the high byte and save to R5
mov A,DPH
rlc A
mov R5,A
; Take low shifted byte and shift the low 7 bits back and the new MSB is the RSLINE bit
mov A,R7
mov C,RSLINE
rrc A
; Shift low 8 bits into register
mov R7,#08h
shift8:
  rlc A
  mov DAT,C
  nop
  setb LCDC
  nop
  clr LCDC
  nop
djnz R7,shift8
; shift high 8 bits into register
mov A,R5
mov R7,#08h
shift82:
  rlc A
  mov DAT,C
  nop
  setb LCDC
  nop
  clr LCDC
  nop
djnz R7,shift82
nop
clr LCDC
mov R7,#0h
mov R5,#0h
;wait 40ms (micro is on a 20Mhz clock)
waitloop:
  djnz R7,$
djnz R5,waitloop
inc dptr
  ret

我只是调用该函数来发出命令:

mov DPTR,(address of value)
clr RSLINE
lcall lcdwrite

或数据

mov DPTR,(address of value)
setb RSLINE
lcall lcdwrite

有些命令似乎可以执行(除非我把我的地址弄混了),但是当我尝试打印一个普通字符时,我得到了一个奇怪的字符。

例如,在我的 rom 上,我用相同的字节填充了它的前 256 个字节(例如:地址 0 的值为 00h,地址 255 的值为 0FFh)。如果我执行:

mov DPTR,0038h
clr RSLINE
lcall lcdwrite

mov DPTR,0041h
setb RSLINE
lcall lcdwrite

我想看到一个字母“A”出现在屏幕上,但什么也没有出现。

我的编码正确吗?或者我可以改进它吗?

我正在使用来自http://plit.de/asem-51/asemw.htm的汇编器,所以我不知道是我自己还是某些汇编器有错误,我应该修改和/或消除一些满足这些汇编程序的代码。

请指教。

谢谢。

4

0 回答 0