Rabbit2000のI/O空間にI2C用ICのPCA9564Dを接続して、I2C経由でキャラクターLCDを表示させたいと思います。
使用したLCDは、Z8S180でも使用した「KKHMF DC 5V 1602 LCD ディスプレイモジュール 16×2キャラクタ LCDブルーブラックライト」と「EasyWordMall 1602 LCD ブラック IIC/I2C/TWI/SPI シリアル インタフェース ボード モジュール」です。

まずはハード面から確認していきます。
PCA9564Dの回路は下記のようになります。

DO~D7はデータバスD0~D7に接続します。VDDは3.3Vが必要になりますので3端子レギュレータなどで3.3Vを作成します。

SDAおよびSCLは、I2Cの EasyWordMall 1602 LCD ブラック IIC/I2C/TWI/SPI シリアル インタフェース ボード モジュール に接続します。

RESETはリセット回路に、A0/A1はアドレスバスA0/A1に接続します。
/CEのチップセレクト信号は、I2 PE2(26pin)に接続します。/RDおよび/WRはそれぞれ、/IORD(32pin)および/IOWR(31pin)に接続します。

次はソフト面を確認していきます。
I/O空間は、内部I/O(各種レジスター)と外部I/Oに分かれており、それぞれ内部I/Oはioi命令、外部I/Oはioe命令を使用します。
外部I/OはPE0からPE7まで0x0000-0x1fff刻みでチップセレクトが可能で0x0000-0xffffまで用意されています。
今回は、PE2(26pin)を使用して0x4000-0x5fffのうち0x4000~0x4003までのio空間を使用します。

IBxCR(I/O Bank Control Reg)はbits7-6がWaitを設定、ここでは00-15wait、bits5-4は00-chip selectを設定
bit3は書き込み許可 1-permit write、bits2-0は設定なしとなっています。
IB2CR(0x82)=00001000

PE2はポートEを占有するのでポートEの設定を行っていきます。
PEFR(Port e Funection Register)は2ビット目をI/Oに設定
PEFR(0x75)=00000100
PEDDR(Port E Data Direction Register)は2ビット目をoutputに設定
PEDDR(0x77)=00000100
PEB2R(Port E Bit 2 Register)は2ビット目をONモードに設定
PEB2R(0x7a)=00000100

コードを見ていきます。

まずは、各レジスタを登録していきます

PEFR	.equ	0x75	;Port E Function register
PEDDR	.equ	0x77	;Port E Data Direction register
PEB2R	.equ	0x7a	;Port E bit 2 register

IB2CR	.equ	0x82	;I/O Bank CTL register

PCA9564のアドレスを設定します

I2CSTA  .equ    0x4000    ;PCA9564 setting adress
I2CTO   .equ    0x4000
I2CDAT  .equ    0x4001
I2CADR  .equ    0x4002
I2CCON  .equ    0x4003

デレィを設定します。基準となる100usを設定します。

        ;; dely timing set in 100uS
D100U   .equ    132      ;;clock in 18.4320MHz set

各種レジスタの設定を行います

	ld	a,0b00000100
	ioi ld	(PEFR),a			;i/o setting
	ioi ld	(PEDDR),a			;PE2 output mode
	ioi ld 	(PEB2R),a			;PE2 i/o mode ON
	
	ld	a,0b00001000			;wait 15 ,Chip select mode ,write permit
	ioi ld	(IB2CR),a 

基本的には、Z8S180で使用したI2Cコードと同じです
表示は
Hello Z80 World!
Rabbit2000ニモエタイ!

と表示されます。

ソースは下記のとおりです。

        ;;rabbit2000 i/o port on i2c >> i2c LCD (KKHMF 1602 LCD +EasyWordMall 1602 LCD i2c i/F)) by pinecone 2021/06/23
        ;;
        ;; rabbit2000 cpu
        ;; 0000h -- 7fffh
        ;; External clock 18.4320MHz
        ;;
        ;; i2c-bus controller  PCA9564
        ;;
        ;;  i/o address
        ;;      I2CSTA   i/o  0x4000(r)
        ;;      I2CTO    i/o  0x4000(w)
        ;;      I2CDTA   i/o  0x4001(r/w)
        ;;      I2CADR   i/o  0x4002(r/w)
        ;;      I2CCON   i/o  0x4003(r/w)
        ;;
        ;; lcd 1602 port
        ;;
        ;;      D0 > RS
        ;;      D1 > R/W
        ;;      D2 > E
        ;;      D3 > LED on/off
        ;;      D4 > DB4
        ;;      D5 > DB5
        ;;      D6 > DB6
        ;;      D7 > DB7        

        ;; assembler
        ;;  program a000H
        ;;  data    a000H
        ;;
        ;; assemblers  ASxxxx and ASlink V5.10
        ;; file name rabbit2000_i2c_lcd12.asm
        ;; $ asrab -l -s -o rabbit200_i2c_lcd12.asm
        ;; $ aslink -i rabbit2000_i2c_lcd12
        ;; $ monitor l command hex download rabbit2000_i2c_lcd12.ihx

 
        .r2k

PEFR	.equ	0x75	;Port E Function register
PEDDR	.equ	0x77	;Port E Data Direction register
PEB2R	.equ	0x7a	;Port E bit 2 register

IB2CR	.equ	0x82	;I/O Bank CTL register
 
        ;; dely timing set in 100uS
D100U   .equ    132      ;;clock in 18.4320MHz set

CNTLA0  .equ    0x00
CCR     .equ    0x1f
CMR     .equ    0x1e
 
I2CSTA  .equ    0x4000    ;PCA9564 setting adress
I2CTO   .equ    0x4000
I2CDAT  .equ    0x4001
I2CADR  .equ    0x4002
I2CCON  .equ    0x4003

RS      .equ    0       ;command >0 :data transfer >1
RW      .equ    1       ;write >0 : read >1
EN      .equ    2       ;positive pulse
LED     .equ    3       ;back light off >0 : on >1

putchar .equ    0x0435  ;monitor putchar 
cr      .equ    0x01bb  ;monitor CR

ADDRES  .equ    0x27    ;i2c slave address

 
        .area   TEST (ABS)
 
        .org    0xa000
start: 
	ld	a,0b00000100
	ioi ld	(PEFR),a			;i/o setting
	ioi ld	(PEDDR),a			;PE2 output mode
	ioi ld 	(PEB2R),a			;PE2 i/o mode ON
	
	ld	a,0b00001000			;wait 15 ,Chip select mode ,write permit
	ioi ld	(IB2CR),a 
                                         	;; main program
        call    i2c_init                        ;i2c init
        call    dely100u
        call    lcd_init                        ;LCD init
        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

        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

i2c_init:
        LD      A,0xff                  ;;Timout Register
        ioe ld	(I2CTO),a
        ld      a,0x64                  ;;Own Address
        ioe ld	(I2CADR),a
        ld      a,0x44                  ;;Enable Serial io
        ioe ld	(I2CCON),a
        call    dely500u                ;; 500u Wite
        ld    	a,0xc4                  ;;Slave recciver mode
        ioe ld	(I2CCON),a              ;; AA=1 ENSIO=1 SI=0
        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

        push    af
        ld      d,a                     ;i2c write data set
        ld      e,ADDRES                ;i2c slave address set
        call    i2c_write               ;i2c write

        pop     af
        set     EN,a                    ;LCD EN high
        push    af
        ld      d,a
        ld      e,ADDRES                ;i2c slave address set
        call    i2c_write               ;i2c write

        pop     af
        res     EN,a                    ;LCD EN low
        ld      d,a
        ld      e,ADDRES                ;i2c slave address set          
        call    i2c_write               ;i2c 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

        push    af
        ld      d,a                     ;i2c write data set
        ld      e,ADDRES                ;i2c slave address set
        call    i2c_write               ;i2c write      
 
        pop     af
        set     EN,a                    ;LCD EN high
        push    af
        ld      d,a                     ;i2c write data set
        ld      e,ADDRES                ;i2c slave address set
        call    i2c_write               ;i2c write

        pop     af
        res     EN,a                    ;LCD EN low
        ld      d,a                     ;i2c write data set     
        ld      e,ADDRES                ;i2c slave address set
        call    i2c_write               ;i2c write
        ret

i2c_write:
        ld      a,0xe4                  ;;Slave recciver mode
        ioe ld	(I2CCON),a              ;; AA=1 ENSIO=1 STA=1
loop1:  ioe ld	a,(I2CCON)              ;; SI=1 ?
        bit     3,a    
        jr      z,loop1
        ioe ld	a,(I2CSTA)              ;;Poll from transmission finished
        cp      0x08
        jp      nz,err
        ioe ld	a,(I2CDAT)
        ld      a,e                     ;;Slave address set
        sla     a
        ioe ld	(I2CDAT),a
        ld      a,0xc4                  ;;Slave recciver mode
        ioe ld	(I2CCON),a              ;; AA=1 ENSIO=1 SI=0
loop2:  ioe ld	a,(I2CCON)              ;; SI=1 ?
        bit     3,a
        jr      z,loop2
loop3:
        ioe ld	a,(I2CSTA)              ;;Poll from transmission finished
        cp      0x18
        jr      nz,err
                                        ;; DE reg = buffer adress
                                        ;; end buffer is "00"
 
data_write:
        ld      a,d                     ;; write data Areg is I2CDAT
        ioe ld	(I2CDAT),a
        ld      a,0xc4                  ;;Slave recciver mode
        ioe ld	(I2CCON),a              ;; AA=1 ENSIO=1 SI=0
data_w1:
        ioe ld	a,(I2CCON)              ;; SI=1 ?
        bit     3,a
        jr      z,data_w1
data_w2:
        ioe ld	a,(I2CSTA)              ;;Poll from transmission finished
        cp      0x28
        jr      nz,err
        
        ld      a,0xD4                  ;;Generate STOP mode
        ioe ld	(I2CCON),a              ;; AA=1 ENSIO=1 SI=0
D_W_ST0:
        ioe ld	a,(I2CCON)              ;; STO=0 ?
        bit     4,a
        jr      nz,D_W_ST0
        ioe ld	a,(I2CSTA)
        cp      0xf8
        jr      nz,err
        ret

err:                                    ;; err 
        call    cr
        ld      a,"E"
        call    putchar
        ld      a,"r"
        call    putchar
        ld      a,"r"
        call    putchar
        call    cr
        ret

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    't
    .db    '2
    .db    '0
    .db    '0
    .db    '0
    .db    0xc6 ;ニ
    .db    0xd3 ;モ
    .db    0xb4 ;エ
    .db    0xc0 ;タ
    .db    0xb2 ;イ
    .db    '!

    .end



おすすめの記事