ROM上にデータがあらかじめ定義されているハードウェアで、キャラクタLCDドライバ(LCDにはHD47780チップセットが搭載されています)を自作し、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がコマンドモードかデータモードか)。
両方のシフト レジスタのクロックは、マイクロコントローラーの 1 つのピンと、クロック ロジック レベルが変化するたびに時間を延長して LCD イネーブル ラインを 220 マイクロ秒間ハイにするタイマーに接続されています。最初のレジスタ (INP) のデータ入力は一緒に接続され、マイクロコントローラの別のピンにも接続されます。CLR 入力を High に接続して、出力を有効にします。
作成した 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のアセンブラーを使用しているので、それが私だけなのか、それとも一部のアセンブラーにバグがあり、一部を変更および/または削除する必要があるのか わかりませんそれらのアセンブラーを満たすコード。
お知らせ下さい。
ありがとう。

