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
;=============================================================
カタカナは作っていない
あとは、自由に文字やラインを表示してみるとよいだろう。