LCD KG057QV 京セラ 320×240 

クロック信号CP、 LOAD信号 フレーム信号FRMはATtiny2313で作られているので、
FRM信号 と LOAD信号を基準に CP信号に合わせて、
256のSRAMから 80×240 バイトを送出する。
19k byte必要なので、32kbyteのSRAMを使用する。


その後、FRM信号にあわせて、間断なく、SRAMから送出を続けることで表示できる。

文字やデータを書き込むのは、そのLCD領域のSRAMに書き込むことで行う。
よって、データや文字をSRAMに書き込んでいる間は LCDの画面は白くなって未表示と
なるが、 専用LSIを使用していないので、しかたない。
目的は、専用基板を使用しないで、SG12864グラフィックディスプレイを置き換える
のが目的なので、我慢である。
とても綺麗で鮮明である。

方法の概略である

1)画面にメモリの画面データを連続でLCDへ送り込み表示させる
2)画面に文字やラインを表示させる場合は、
  一旦LCDへのデータ転送を終了させる
3)SRAMの中に、文字やライン情報を書き込む
4)書き込んだら、LCD表示ルーチンに戻り、SRAMデータを送り続け
  画面表示させる。

*******************
SRAM−−LCD表示ルーチン
ーーーーーーーーーーーーーーーーーーーーーーーーーーー
まず、 SRAMのデータをLCDに転送するプログラムである
;クロック 680nS (H=340nS、L=340nS)
340nSの間に、データを転送させなければならないので、
工夫をしている。
上位、下位4ビットをswap させれば、SRAMのメモリは減らせるが
メモリは十分にあるため、処理スピードを優先させているため、
1byte中 4ビットしか使用していない。

1行目は FRM信号を処理しているので、処理スピードの関係から
別のプログラムにしている
残り 239行はルーチン化で行う。

40byte 表示したら、LOAD信号を待ってから、次の40byteを
表示させている。
LOAD信号 240 終了したら、FRM信号にあわせて、
スタートをしている。


------------
; 画面 表示
;
;   LOAD 信号 1CP 飛ばす 2CP から表示させる
;   10ステップ 0.062ns×11=680nS 飛ばす
;   LOAD信号の後にデータセットが間に合わない
;
KG_out:
;   ldiw Z,Gdat1 からデータをもらう
;
  ldiw Z,Gdat1 ;Gdat set
  LD w,Z+
  ldi w3,40
KG_FR_1:
  sbic pinB,KG_FRM ;if ret_key=1 then skip
  rjmp KG_FR_1
KG_FR_2:
  sbis pinB,KG_FRM ;if ret_key=1 then skip
  rjmp KG_FR_2
KG_cp1_1:
  out PORTE,w ;4L
KG_cp1_2:
  sbis pinB,KG_CP ;if ret_key=1 then skip
  rjmp KG_cp1_2
  LD w,Z+
KG_cp1_3:
  sbic pinB,KG_CP ;if ret_key=1 then skip
  rjmp KG_cp1_3

  out PORTE,w ;4H
KG_cp1_4:
  sbis pinB,KG_CP ;if ret_key=1 then skip
  rjmp KG_cp1_4
  LD w,Z+
KG_cp1_5:
  sbic pinB,KG_CP ;if ret_key=1 then skip
  rjmp KG_cp1_5

  dec w3
  brne KG_cp1_1

;-------- 2行目以降 --------------------

  ldi w4,238
KG_cp2_0:
  LD w,Z+
  ldi w3,40
KG_cp2_1:
  out PORTE,w ;4L
KG_cp2_2:
  sbis pinB,KG_CP ;if ret_key=1 then skip
  rjmp KG_cp2_2
  LD w,Z+
KG_cp2_3:
  sbic pinB,KG_CP ;if ret_key=1 then skip
  rjmp KG_cp2_3

  out PORTE,w ;4H
KG_cp2_4:
  sbis pinB,KG_CP ;if ret_key=1 then skip
  rjmp KG_cp2_4
  LD w,Z+
KG_cp2_5:
  sbic pinB,KG_CP ;if ret_key=1 then skip
  rjmp KG_cp2_5

  dec w3
  brne KG_cp2_1

 ; LD w,Z+
  dec w4
  brne KG_cp2_0

KG_out_e:
  sbic pinD,card_in ;if in= L then skip
  ret
  sbic pinB,k_can ;if menu= then skip
  rjmp KG_out
  ret

ーーーーーーーーーーーーーーーーーーー
このルーチンで、LCDに文字やキャラクタを表示し続けている。

入力信号k_can が入ったら、サブルーチンから抜けて、
SRAMにデーターを登録するモードに入る
この間は画面が白くなる。
登録(データインプット)が終わると、このサブルーチンを起動させ
LCD画面を表示させる。

*******************
文字表示ルーチン
;-----------------------------------------------
さて、次は、文字やラインを表示してみよう。

CGDATAの文字は7バイトで表示している。
横に8ビット、縦に7バイトで1文字表示する。

LCDのメモリは 0から19200バイトであるから、その中に書き込む

1文字を表示するため、X軸とY軸メモリにカーソルをもっていき
レジスタR16=wに文字を入れて callする

   ldi w,'1'
   rcall cara_one

これが基本である

;---------- 1 キャラ 表示 -------------------------
cara_one:
   push R30
   push R31
   mov carabuf,w
   rcall XY_YL
   sts caradat,carabuf
   rcall KG_cmd
   pop R31
   pop R30
   ret

; --------- 連続キャラ 表示 ----------------------
データ領域に書かれた文字列を表示してみよう。

    LDI ZH,high(crt_pul<<1)
    LDI ZL,low(crt_pul<<1)
    loca 10,11 ;(w=X w1=Y)
    rcall cara_crt

ーーーーーーーーー
cara_crt:
   sts YLcara_buf,w
   sts YHcara_buf,w1
   rcall XY_YL
   lpm w,z+
   cpi w,'$'
   breq cara_crte
   sts caradat,w
   push zh
   push zl
   rcall KG_cmd
   pop zl
   pop zh
   lds w,YLcara_buf
   inc w
   inc w ;8ビット インクリメント
   lds w1,YHcara_buf
   rjmp cara_crt
   cara_crte:
   RET
ーーーーーーーーーーーーーーーーーーーーーーーーーー
ここで、意味不明な loca 10,11 がでてきたが、
これは、下記のマクロで 表示するX軸、Y軸を決めている

;---------------- macro ----------------------
;LDIW
; LDIW Z,SRAM
;
.macro LDIW

   ldi @0H,high(@1)
   ldi @0L,low(@1)
   .endm
;---------------- macro ----------------------
; loca X,Y X=1-80(80桁), Y=0-30(30行)
.macro loca
   ldi w1,@1
   ldi w,@0
   sts locaX,w
   sts locaY,w1
   .endm

ーーーーーーーーーーーーーーーーーーーーーーーーーー
x方向は80文字、Y方向は30文字表示できる;
座標 X=1-80 Y=1-30 (横4、縦8)
; loca x,y W,W1 --->rcall XY_YL
;
XY_YL:
   lds w,locaX
   lds w1,locaY
   ldi w4,81
   clr w2
   clr w3
   cpi w1,0
   breq XY_YL3
XY_YL1:
   ldi w5,8
XY_YL2:
   add w,w4 ;+80
   adc w2,w3
   dec w5
   brne XY_YL2
   dec w1
   brne XY_YL1
XY_YL3:
   sts YLcara,w
   sts YHcara,w2
   lds w,locaX
   inc w
   inc w
   sts locaX,w
   ret


ーーーーーーーーーーーーーーーーーーーーーーーーー
;キャラクタ  caradat 0-19200 (YLcara,YHcara)
; Gdat1 1--19200
; Y=81で改行する
;
KG_CMD:
   lds w,caradat
   LDI ZH,high(CGDATA<<1)
   LDI ZL,low(CGDATA<<1)
   rcall multi7
   clc
   add ZL,CGD
   adc ZH,CGDH

   ldiw Y,Gdat1
   lds w1,YLcara ;変数 YL,YH=80*240=19200(4B00)
   lds w5,YHcara ;YH+
   ldi w4,80 ;変数 X=80
   ldi w3,6 ; 1+6行
   clc
   add YL,w1
   adc YH,w5
   lpm w,Z+
   mov w6,w
   andi w,0x0F
   ST Y+,w ;下位 4ビット表示
   swap w6
   andi w6,0x0F
   ST Y,w6 ;上位 4ビット表示
   clr w5
KG_cls_0:
   clc
   add YL,w4 ;+80
   adc YH,w5
   lpm w,Z+
   mov w6,w
   andi w,0x0F
   st Y+,w ;SRAM ストア
   swap w6
   andi w6,0x0F
   ST Y,w6 ;上位 4ビット表示
   dec w3
   brne KG_cls_0
   ret
;--------------------------------------
;キャラクタ  (20-3F) -->w W-->CGD --->マイナス 20H
; 7倍して CGD,CGDH に入れる
; 後は ZL + CGD
; ZH + CGDH
; キャラクタ スタートアドレスを決める
multi7:
   andi w,0x7F
   ldi w1,0x20 ;マイナス 20H
   clr w2
   clr w5
   ldi w4,8
   sub w,w1
   mov w3,w ;counter
   ldi w,0
   cpi w3,0
   breq multi7_2
multi7_1:
   clc
   add w,w4 ;+7
   adc w2,w5
   dec w3
   brne multi7_1
multi7_2:
   mov CGD,w
   mov CGDH,w2
   ret

*************************
ライン表示ルーチン
次は 縦、横ラインを引いてみよう。
問題はX方向は320ドットある
よって、250までをスクリーン1、以後をスクリーン2で表示させる

;-------- Xline スクリーン1------------
   ldi w,75 ;Y
   ldi w1,10 ;X
   ldi w2,0 ;スクリーン1
   sts dotY,w
   sts dotXL,w1
   sts dotXH,w2
   ldi cnt,246
   rcall Xline_crt

;-------- Xline スクリーン2------------
   ldi w,75 ;Y
   ldi w1,0 ;start X=0
   ldi w2,1 ;スクリーン2 w1=0-64
   sts dotY,w
   sts dotXL,w1
   sts dotXH,w2
   ldi cnt,62
   rcall Xline_crt



;-------- YLINE --------------
   ldi w,5 ;Y
   ldi w1,20 ;X
   ldi w2,0
   sts dotY,w
   sts dotXL,w1
   sts dotXH,w2
   ldi cnt,140
   rcall Yline_crt

;----ライン表示のサブルーチン--------------
; X-line
; dotXL(0-256) dotXH(0,1) dotY(0-239) セット、
; ステップ数 cnt 入れて rcall する
;
Xline_crt:
   rcall dot_crt
   lds w,dotXL
   inc w
   cpi w,0
   brne Xline_crt1
   ldi w1,1
   sts dotXH,w1
Xline_crt1:
   sts dotXL,w
   dec cnt
   brne Xline_crt
   ret

; Y-line
; dotY(0-239) dotXL(0-256)dotXH(0,1) セット、
; ステップ数 cnt 入れて rcall する
;
Yline_crt:
   rcall dot_crt
   lds w,dotY
   inc w
   sts dotY,w
   dec cnt
   brne Yline_crt
   ret

;------------ dot crt -------------------------
ドットを表示させるサブルーチンである
メモリの中にストアするのだが、1バイトで4ビットずつ表示させて
いるが、過去にストアしたデータを残すため、一旦読込む
OR をしてからストアする

;
; dotY= 0-239
; dotXL,XH = 0- 319
; 入れて dot_crt
; ST W----> Y

dot_crt:
   ldiw Y,Gdat1

   ldi w7,4
   clr w6 ;buf
   lds w5,dotY
   lds W3,dotXL
   lds W4,dotXH
   ldi w2,81
   clr w1

   cpi w5,0
   breq dot_crt11
dot_crt1:
   clc ;Y方向 
   add YL,w2 ;+80
   adc YH,w6
   dec w5
   brne dot_crt1
dot_crt11:
   clc
   cpi w4,1
   brne dot_crt2
   ldi w,64
   add w1,w
dot_crt2:
   cpi w3,4
   BRLO dot_crt3
   subi w3,4
   inc w1
   rjmp dot_crt2
dot_crt3:
   clc
   add YL,w1
   adc YH,w6
   clc
   ldi w,1
   cpi w3,0
   breq dot_crt5
dot_crt4:
   ROL w
   dec W3
   brne dot_crt4
dot_crt5:
   LD w1,Y
   or w,w1
   ST Y,w
   ret




ーーーーーーーーーーーーーーーーーーーーーーーーーー
キャラクタ文字
;20H---5FH
CGDATA:
.DB $00,$00,$00,$00,$00,$00,$00
CGDATA21:
.DB $04,$04,$04,$04,$00,$00,$04
CGDATA22:
.DB $1A,$1A,$1A,$00,$00,$00,$00
CGDATA23:
.DB $14,$14,$3E,$14,$3E,$14,$14
CGDATA24:
.DB $08,$3C,$0A,$1C,$28,$1E,$08
CGDATA25:
.DB $06,$26,$10,$08,$04,$32,$30
CGDATA26:
.DB $0C,$12,$0A,$04,$2A,$12,$2C
CGDATA27:
.DB $0C,$08,$04,$00,$00,$00,$00
CGDATA28:
.DB $10,$08,$04,$04,$04,$08,$10
CGDATA29:
.DB $04,$08,$10,$10,$10,$08,$04
CGDATA2A:
.DB $00,$08,$2A,$1C,$2A,$08,$00
CGDATA2B:
.DB $00,$08,$08,$3E,$08,$08,$00
CGDATA2C:
.DB $00,$00,$00,$00,$0C,$08,$04
CGDATA2D:
.DB $00,$00,$00,$3E,$00,$00,$00
CGDATA2E:
.DB $00,$00,$00,$00,$00,$06,$06
CGDATA2F:
.DB $00,$20,$10,$08,$04,$02,$00
CGDATA30:
.DB $1C,$22,$32,$2A,$26,$22,$1C
CGDATA31:
.DB $08,$0C,$08,$08,$08,$08,$1C
CGDATA32:
.DB $1C,$22,$20,$10,$08,$04,$3E
CGDATA33:
.DB $3E,$10,$08,$10,$20,$22,$1C
CGDATA34:
.DB $10,$18,$14,$12,$3E,$10,$10
CGDATA35:
.DB $3E,$02,$1E,$20,$20,$22,$1C
CGDATA36:
.DB $18,$04,$02,$1E,$22,$22,$1C
CGDATA37:
.DB $3E,$20,$10,$08,$04,$04,$04
CGDATA38:
.DB $1C,$22,$22,$1C,$22,$22,$1C
CGDATA39:
.DB $1C,$22,$22,$3C,$20,$10,$0C
CGDATA3A:
.DB $00,$18,$18,$00,$18,$18,$00
CGDATA3B:
.DB $00,$18,$18,$00,$18,$10,$08
CGDATA3C:
.DB $20,$10,$08,$04,$08,$10,$20
CGDATA3D:
.DB $00,$00,$3E,$00,$3E,$00,$00
CGDATA3E:
.DB $04,$08,$10,$20,$10,$08,$04
CGDATA3F:
.DB $1C,$22,$20,$10,$08,$00,$08
CGDATA40:
.DB $1C,$22,$20,$2C,$2A,$2A,$1C
CGDATA41:
.DB $1C,$22,$22,$22,$3E,$22,$22
CGDATA42:
.DB $1E,$22,$22,$1E,$22,$22,$1E
CGDATA43:
.DB $1C,$22,$02,$02,$02,$22,$1C
CGDATA44:
.DB $0E,$12,$22,$22,$22,$12,$0E
CGDATA45:
.DB $3E,$02,$02,$1E,$02,$02,$3E
CGDATA46:
.DB $3E,$02,$02,$1E,$02,$02,$02
CGDATA47:
.DB $1C,$02,$02,$3A,$22,$22,$3C
CGDATA48:
.DB $22,$22,$22,$3E,$22,$22,$22
CGDATA49:
.DB $1C,$08,$08,$08,$08,$08,$1C
CGDATA4A:
.DB $38,$10,$10,$10,$10,$12,$0C
CGDATA4B:
.DB $22,$12,$0A,$06,$0A,$12,$22
CGDATA4C:
.DB $02,$02,$02,$02,$02,$02,$3E
CGDATA4D:
.DB $22,$36,$2A,$2A,$22,$22,$22
CGDATA4E:
.DB $22,$22,$26,$2A,$32,$22,$22
CGDATA4F:
.DB $1C,$22,$22,$22,$22,$22,$1C
CGDATA50:
.DB $1E,$22,$22,$1E,$02,$02,$02
CGDATA51:
.DB $1C,$22,$22,$22,$2A,$12,$2C
CGDATA52:
.DB $1E,$22,$22,$1E,$0A,$12,$22
CGDATA53:
.DB $3C,$02,$02,$1C,$20,$20,$1E
CGDATA54:
.DB $3E,$08,$08,$08,$08,$08,$08
CGDATA55:
.DB $22,$22,$22,$22,$22,$22,$1C
CGDATA56:
.DB $22,$22,$22,$22,$22,$14,$08
CGDATA57:
.DB $22,$22,$22,$2A,$2A,$2A,$14
CGDATA58:
.DB $22,$22,$14,$08,$14,$22,$22
CGDATA59:
.DB $22,$22,$22,$14,$08,$08,$08
CGDATA5A:
.DB $3E,$20,$10,$08,$04,$02,$3E
CGDATA5B:
.DB $1C,$04,$04,$04,$04,$04,$1C
CGDATA5C:
.DB $22,$14,$3E,$08,$3E,$08,$08
CGDATA5D:
.DB $1C,$10,$10,$10,$10,$10,$1C
CGDATA5E:
.DB $08,$14,$22,$00,$00,$00,$00
CGDATA5F:
.DB $00,$00,$00,$00,$00,$00,$3E
CGDATA60:
.DB $04,$08,$10,$00,$00,$00,$00
CGDATA61:
.DB $00,$00,$1C,$20,$3C,$22,$3C
CGDATA62:
.DB $02,$02,$1A,$26,$22,$22,$1E
CGDATA63:
.DB $00,$00,$1C,$02,$02,$22,$1C
CGDATA64:
.DB $20,$20,$2C,$32,$22,$22,$3C
CGDATA65:
.DB $00,$00,$1C,$22,$1E,$02,$1C
CGDATA66:
.DB $18,$24,$04,$0E,$04,$04,$04
CGDATA67:
.DB $00,$3C,$22,$22,$3C,$20,$1C
CGDATA68:
.DB $02,$02,$1A,$26,$22,$22,$22
CGDATA69:
.DB $08,$00,$0C,$08,$08,$08,$1C
CGDATA6A:
.DB $10,$00,$10,$10,$10,$12,$0C
CGDATA6B:
.DB $02,$02,$12,$0A,$06,$0A,$12
CGDATA6C:
.DB $0C,$08,$08,$08,$08,$08,$18
CGDATA6D:
.DB $00,$00,$16,$2A,$2A,$22,$22
CGDATA6E:
.DB $00,$00,$1A,$26,$22,$22,$22
CGDATA6F:
.DB $00,$00,$1C,$22,$22,$22,$1C
CGDATA70:
.DB $00,$00,$1E,$22,$1E,$02,$02
CGDATA71:
.DB $00,$00,$2C,$32,$1C,$20,$20
CGDATA72:
.DB $00,$00,$1A,$26,$02,$02,$02
CGDATA73:
.DB $00,$00,$1C,$02,$1C,$20,$1C
CGDATA74:
.DB $00,$04,$04,$0E,$04,$24,$18
CGDATA75:
.DB $00,$00,$22,$22,$22,$32,$2C
CGDATA76:
.DB $00,$00,$22,$22,$22,$14,$08
CGDATA77:
.DB $00,$00,$22,$22,$2A,$2A,$14
CGDATA78:
.DB $00,$00,$22,$14,$08,$14,$22
CGDATA79:
.DB $00,$00,$22,$22,$3C,$20,$1C
CGDATA7A:
.DB $00,$00,$3E,$10,$08,$04,$3E
CGDATA7B:
.DB $10,$08,$08,$04,$08,$08,$10
CGDATA7C:
.DB $08,$08,$08,$08,$08,$08,$08
CGDATA7D:
.DB $04,$08,$08,$10,$08,$08,$04
CGDATA7E:
.DB $00,$08,$10,$3E,$10,$08,$00
CGDATA7F:
.DB $00,$08,$04,$3E,$04,$08,$00


;-------データ ----------------------------------
.dseg
.org 0x0300

Xziku: .byte 1 ;GLCD X軸データ 0〜127
Yziku: .byte 1 ;GLCD Y軸データ 0〜63
caradat: .byte 1 ;cata D0-D7 data
YLcara: .byte 1 ;Y=1-192000
YHcara: .byte 1 ; 4B00
YLcara_buf: .byte 1 ;Y=1-192000
YHcara_buf: .byte 1 ; 4B00

locaX: .byte 1 ;キャラ 表示座標 
locaY: .byte 1 ;X=0-80 (2バイトずつ)
;Y=0-30

dotY: .byte 1 ;dot Y=0-240
dotXL: .byte 1 ;dot X=0-320
dotXH: .byte 1 ;dot X=0-320

ーーーーーーーーーーーーーー
; SRAM領域である
.org 0x1100

sram0: .byte 1
sram1: .byte 1
sram2: .byte 1
sram3: .byte 1
sram4: .byte 1
sram5: .byte 1

sram6: .byte 1
sram7: .byte 1
sram8: .byte 1
sram9: .byte 1
sram10: .byte 1
sram11: .byte 1

Gdat1: .byte 39
Gdat2: .byte 39
Gdat3: .byte 39
Gdat4: .byte 39
Gdat5: .byte 39
Gdat6: .byte 39
Gdat7: .byte 39
Gdat8: .byte 39
Gdat9: .byte 39
Gdat10: .byte 39
Gdat11: .byte 39
Gdat12: .byte 39
Gdat13: .byte 39
Gdat14: .byte 39
Gdat15: .byte 39
Gdat16: .byte 39
Gdat17: .byte 39

;=============================================================

カタカナは作っていない

あとは、自由に文字やラインを表示してみるとよいだろう。

KG057 プログラム