Z8S180でI2C経由で接続した「KKHMF DC 5V 1602 LCD ディスプレイモジュール 16×2キャラクタ LCDブルーブラックライト」と「EasyWordMall 1602 LCD ブラック IIC/I2C/TWI/SPI シリアル インタフェース ボード モジュール」(amazonで購入) を使用して、LCD表示をTMPZ84C015でもやってみたいと思います。

今回使用するLCDは5V仕様なので、I2Cの電源は5Vとします。
i2Cインターフェイスモジュールは PCF8574Tを使用しており、I2Cのスレーブアドレスは0x27(A0/A1/A2オープン時)となっています。
(PCF8574ATでは、0x3f となるようです。 amazonデビューより)

ソフトの変更点ですが、Z8S180とZ80( TMPZ84C015)ではi/0命令が違うので変更します。
in0 → in
out0 → out

また、アセンブラの指示をZ80に変更します。
.z180 → .z80

時間待ちの100μSのカウンター値を変更します。
D100U .equ 65 ;;clock in 16MHz set
から
D100U .equ 70 ;;clock in 20MHz set
に変更。

下記の変更のソースをアセンブルして、.ihxファイルをモニタのlコマンドで読み込み、cコマンドでa000番地をコールするとLCDに
Hello Z80 World!
*** Z80ニモエタイ ***
と表示されます。

なお、エラー表示にモニタの表示サブルーチンを読んでいますので、モニタによって、ソース中の下記部分のコメントを変更してください。

;			;monitor v0.71
;putchar .equ    0x0364  ;monitor putchar 
;cr      .equ    0x014e  ;monitor CR

			;monitor v0.71(SPI)
putchar .equ    0x06f3  ;monitor putchar 
cr      .equ    0x0156  ;monitor CR

ソースは次のおとりです。

        ;;TMPZ84C015 + PCA9564 on i2c >> i2c LCD (KKHMF 1602 LCD +EasyWordMall 1602 LCD i2c i/F))
        ;;
        ;; TMPZ84C015 cpu
        ;; rom 0000h -- 7fffh
	;; ram 8000h -- ffffh
        ;; External clock 20MHz
        ;;
        ;; i2c-bus controller  PCA9564
        ;;
        ;;  i/o address
        ;;      I2CSTA   i/o  0x80(r)
        ;;      I2CTO    i/o  0x80(w)
        ;;      I2CDTA   i/o  0x81(r/w)
        ;;      I2CADR   i/o  0x82(r/w)
        ;;      I2CCON   i/o  0x83(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 tmpz84c015_i2c_lcd12.asm
        ;; $ asz80 -l -s -o tmpz84c015_i2c_lcd12.asm
        ;; $ aslink -i tmpz84c015_i2c_lcd12
        ;; $ monitor l command hex download tmpz84c015_i2c_lcd12.ihx,c command 0xa000

 
        .z80
 
        ;; dely timing set in 100uS
D100U   .equ    70      ;;clock in 20MHz set
 
I2CSTA  .equ    0x80    ;PCA9564 setting adress
I2CTO   .equ    0x80
I2CDAT  .equ    0x81
I2CADR  .equ    0x82
I2CCON  .equ    0x83

			;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       ;back light off >0 : on >1

;			;monitor v0.71
;putchar .equ    0x0364  ;monitor putchar 
;cr      .equ    0x014e  ;monitor CR

			;monitor v0.71(SPI)
putchar .equ    0x06f3  ;monitor putchar 
cr      .equ    0x0156  ;monitor CR


ADDRES  .equ    0x27    ;i2c slave address

 
        .area   TEST (ABS)
 
        .org    0xa000
start:                                          ;; 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
        out    	(I2CTO),a
        ld      a,0x64                  ;;Own Address
        out    	(I2CADR),a
        ld      a,0x44                  ;;Enable Serial io
        out    	(I2CCON),a
        call    dely500u                ;; 500u Wite
        ld      a,0xc4                  ;;Slave recciver mode
        out    	(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
        out    	(I2CCON),a              ;; AA=1 ENSIO=1 STA=1
loop1:  in     	a,(I2CCON)              ;; SI=1 ?
        bit     3,a    
        jr      z,loop1
        in     	a,(I2CSTA)              ;;Poll from transmission finished
        cp      0x08
        jp      nz,err
        in      a,(I2CDAT)
        ld      a,e                     ;;Slave address set
        sla     a
        out    	(I2CDAT),a
        ld      a,0xc4                  ;;Slave recciver mode
        out    	(I2CCON),a              ;; AA=1 ENSIO=1 SI=0
loop2:  in     	a,(I2CCON)              ;; SI=1 ?
        bit     3,a
        jr      z,loop2
loop3:
        in     	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
        out    	(I2CDAT),a
        ld      a,0xc4                  ;;Slave recciver mode
        out    	(I2CCON),a              ;; AA=1 ENSIO=1 SI=0
data_w1:
        in     	a,(I2CCON)              ;; SI=1 ?
        bit     3,a
        jr      z,data_w1
data_w2:
        in     	a,(I2CSTA)              ;;Poll from transmission finished
        cp      0x28
        jr      nz,err
        
        ld      a,0xD4                  ;;Generate STOP mode
        out    	(I2CCON),a              ;; AA=1 ENSIO=1 SI=0
D_W_ST0:
        in     	a,(I2CCON)              ;; STO=0 ?
        bit    	4,a
        jr     	nz,D_W_ST0
        in    	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
        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    '*
    .db    '*
    .db    '*
    .db    0x20
    .db    'Z
    .db    '8
    .db    '0
    .db    0xc6 ;ニ
    .db    0xd3 ;モ
    .db    0xb4 ;エ
    .db    0xc0 ;タ
    .db    0xb2 ;イ
    .db    0x20
    .db    '*
    .db    '*
    .db    '*
    .end
LCD, TMPZ84C015, Z80, I2Cの関連記事
  • Z80(TMPZ84C015)に萌えたい。I2Cソフト:LCD+RTC+温度表示
  • Z80(TMPZ84C015)に萌えたい。I2Cソフト:LCD編
  • Z80(Z8S180)に萌えたい LCDに温湿度表示(AM2321)その2
  • Z80(Z8S180)に萌えたい LCDに時計表示
  • Z80(Z8S180)に萌えたい 格安LCDをつないでみる
おすすめの記事