クロックを内部クロックで行っていましたが、安定化のために外部クロックにしました。
周波数は、シリアル通信で使用するクロックで割り切れる値で、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

おすすめの記事