我自己制作了一个字符LCD驱动程序(LCD有一个HD47780芯片组),硬件中的数据是在ROM上预定义的,我还制作了一个加载ROM的电路。
在下面的第一张图中,部分Rom制造商电路(我通过并行端口连接到我的计算机)接线,以便ROM上的数据引脚从LSB(最低有效位)排列如下到MSB(最重要的位):
A8,A9,A10,A11,A12,A13,A14,A0,A1,A2,A3,A4,A5,A6,A7
下一张图像是LCD驱动程序的一部分。 rom(由Rom制造商制造)插入驱动器,移位寄存器用于选择地址和控制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的汇编程序,所以我不知道它是否仅仅是我或者是否有一些汇编程序有错误,我应该修改和/或删除一些代码来满足那些汇编程序。< / p>
请告知。
感谢。