クロックを内部クロックで行っていましたが、安定化のために外部クロックにしました。
周波数は、シリアル通信で使用するクロックで割り切れる値で、18.4320MHzとしました。
シリアルクロック用の分周値(TAT4Rレジスタ)は18432000/2/16/38400-1で0x0eをセットします。
ld a,0x0e ;A-ch Clock timer :=(PCLK/2/16/38400)-1 (PCLK=18.432MHz >> 38400bps)
ioi ld (TAT4R),a
ハード的には、18.432MHz発振器の出力をRabbit2000のメインオシレータのXTALB1(90pin)に接続します。
続いて、キャラクターディスプレイLCDをAポートに接続してみました。
A ポートは、入力か出力かをバイト単位で設定できます。
今回は、Aポートを出力(8bit単位)に設定しました。
SPCR .equ 0x24 ;;PARALLEL PORT A/SLAVE PORT CONTROL REGISTER
PADR .equ 0X30 ;;PARALLEL PORT A DATA REGISTER
ld a,0b00000100 ;; PORT A OUTPUT SET
ioi ld (SPCR),a
LCDとの接続は4ビットモードで下記のように接続しました
PA0 RS
PA1 R/W
PA2 E
PA3 未接続
PA4 D4
PA5 D5
PA6 D6
PA7 D7
このほかにVo(コントラスト調整)、Vcc、Vddが必要です。
デレィ用のための設定を行います。
約100uS調整した(18.432MHz時)D100Uをセットします。
D100U .equ 132 ;;clock in 18.4320MHz set
dely100u: ;; 100uS dely
push bc
ld b,D100U
l100u: djnz l100u
pop bc
ret
基本的にはi2c用に作成したZ8S180またはTMPZ84C015のサブルーチンをi2c用のサブルーチンを除いた形で代用しました。
ただし、ポートの速度が速いためPADRに書き込み時に100usのデレィを挿入しています。
lcd4bitwrite: ;command mode 4bit data LCD output
rlca ;4bit data upper 4bit set
rlca
rlca
rlca
res RS,a ;LCD Command mode
res RW,a ;LCD Write mode
res EN,a ;LCD EN low
set LED,a ;LCD back light LED ON
ioi ld (PADR),a ;PORT A Write
call dely100u
set EN,a ;LCD EN high
ioi ld (PADR),a ;PORT A Write
call dely100u
res EN,a ;LCD EN low
ioi ld (PADR),a ;PORT A Write
ret
data_lcd4bitwrite: ;data mode 4bit data LCD output
rlca
rlca
rlca
rlca
set RS,a ;LCD RS data mode
res RW,a ;LCD write mode
res EN,a ;LCD EN low
set LED,a ;LCD back light LED ON
ioi ld (PADR),a ;PORT A Write
call dely100u
set EN,a ;LCD EN high
ioi ld (PADR),a ;PORT A Write
call dely100u
res EN,a ;LCD EN low
ioi ld (PADR),a ;PORT A Write
ret
表示は
Hello Z80 World!
Rabbit2000ニモエタイ!
と表示されます。
ソースは下記のとおりです。
;;rabbit2000 LCD (SC1602BS,HD44780 compatible)
;;
;; rabbit2000 cpu
;; rom 0000h -- 7fffh
;; ram 8000h -- ffffh
;; External clock 18.4320MHz
;;
;; lcd 1602 port
;;
;; D0 > RS
;; D1 > R/W
;; D2 > E
;; D3 >
;; D4 > DB4
;; D5 > DB5
;; D6 > DB6
;; D7 > DB7
;; assembler
;; program a000H
;; data a000H
;;
;; assemblers ASxxxx and ASlink V5.10
;; file name rabbit2000_lcd12.asm
;; $ asrab -l -s -o rabbit2000_lcd12.asm
;; $ aslink -i rabbit2000_lcd12
;; $ monitor l command hex download rabbit2000_lcd12.ihx,c command 0xa000
.r2k
;; dely timing set in 100uS
SPCR .equ 0x24 ;;PARALLEL PORT A/SLAVE PORT CONTROL REGISTER
PADR .equ 0X30 ;;PARALLEL PORT A DATA REGISTER
D100U .equ 132 ;;clock in 18.4320MHz set
;1602 LCD
RS .equ 0 ;command >0 :data transfer >1
RW .equ 1 ;write >0 : read >1
EN .equ 2 ;positive pulse
LED .equ 3 ;Led on/off
;monitor v0.72
putchar .equ 0x0435 ;monitor putchar
cr .equ 0x01bb ;monitor CR
.area TEST (ABS)
.org 0xa000
start: ;; main program
ld a,0b00000100 ;; PORT A OUTPUT SET
ioi ld (SPCR),a
call dely100u
call lcd_init ;LCD init
ld a,0x80 ;0x80 + 0x00(1 line top address)
call lcd8bitwrite ; 1 line set
ld hl,lcd_msg ;msg output
ld b,16
main_loop:
ld a,(hl)
call data_lcd8bitwrite
inc hl
djnz main_loop
ld a,0xc0 ;0x80 + 0x40(2 line top address)
call lcd8bitwrite ; 2 line set
ld hl,lcd_msg2 ;msg output
ld b,16
main_loop2:
ld a,(hl)
call data_lcd8bitwrite
inc hl
djnz main_loop2
ret
lcd_init: ;LCD init(4bit mode)
ld a,0x03
call lcd4bitwrite
ld b,0x05 ;;5ms dely
call delym
ld a,0x03
call lcd4bitwrite
call dely500u
ld a,0x03
call lcd4bitwrite
ld a,0x02 ;;4 bit mode
call lcd4bitwrite
ld a,0x28 ;function set
call lcd8bitwrite ;4bit bus,2 line ,1 line=8
ld a,0x0c ;disp on,under cursor off,block cursor off
call lcd8bitwrite
ld a,0x01 ;disp clr
call lcd8bitwrite
ld b,0x02 ;;2mS dely
call delym
ld a,0x06 ;disp address incrmant on,disp shift off
call lcd8bitwrite
ld a,0x02 ;cursor home set
call lcd8bitwrite
ld b,0x02 ;;2ms dely
call delym
ret
lcd8bitwrite: ;command mode 8bit data LCD output
push af ;
rrca ;8bit data upper 4bit data LED output
rrca
rrca
rrca
call lcd4bitwrite ;command mode 4bit data LCD output
pop af ;8bit data low 4bit data LED output
call lcd4bitwrite ;command mode 4bit data LCD output
ret
lcd4bitwrite: ;command mode 4bit data LCD output
rlca ;4bit data upper 4bit set
rlca
rlca
rlca
res RS,a ;LCD Command mode
res RW,a ;LCD Write mode
res EN,a ;LCD EN low
set LED,a ;LCD back light LED ON
ioi ld (PADR),a ;PORT A Write
call dely100u
set EN,a ;LCD EN high
ioi ld (PADR),a ;PORT A Write
call dely100u
res EN,a ;LCD EN low
ioi ld (PADR),a ;PORT A Write
ret
data_lcd8bitwrite: ;data mode 8bit data LCD output
push af
rrca ;8bit data upper 4bit data LED output
rrca
rrca
rrca
call data_lcd4bitwrite ;command mode 4bit data LCD output
pop af ;8bit data low 4bit data LED output
call data_lcd4bitwrite ;command mode 4bit data LCD output
ret
data_lcd4bitwrite: ;data mode 4bit data LCD output
rlca
rlca
rlca
rlca
set RS,a ;LCD RS data mode
res RW,a ;LCD write mode
res EN,a ;LCD EN low
set LED,a ;LCD back light LED ON
ioi ld (PADR),a ;PORT A Write
call dely100u
set EN,a ;LCD EN high
ioi ld (PADR),a ;PORT A Write
call dely100u
res EN,a ;LCD EN low
ioi ld (PADR),a ;PORT A Write
ret
err: ;; err
call cr
ld a,"E"
call putchar
ld a,"r"
call putchar
ld a,"r"
call putchar
call cr
jp 0x0100
delym: ;; B reg set *1mS dely
push bc
delyml: call dely1m
djnz delyml
pop bc
ret
dely1m: ;; 1mS dely
push bc
call dely500u
call dely500u
pop bc
ret
dely500u: ;; 500uS dely
push bc
ld b,5
dd5: call dely100u
djnz dd5
pop bc
ret
dely100u: ;; 100uS dely
push bc
ld b,D100U
l100u: djnz l100u
pop bc
ret
;; data
lcd_msg:
.db 'H
.db 'e
.db 'l
.db 'l
.db 'o
.db 0x20
.db 'Z
.db '8
.db '0
.db 0x20
.db 'W
.db 'o
.db 'r
.db 'l
.db 'd
.db '!
lcd_msg2:
.db 'R
.db 'a
.db 'b
.db 'b
.db 'i
.db 't
.db '2
.db '0
.db '0
.db '0
.db 0xc6 ;ニ
.db 0xd3 ;モ
.db 0xb4 ;エ
.db 0xc0 ;タ
.db 0xb2 ;イ
.db '!
.end