LCD4ビットインターフェースサンプル
/*======================================================================*/
/* */
/* HD44780使用LCDユニット用 */
/* ドライブ ライブラリー Vr1.00 */
/* (クロック8MHz PIO4bit接続) */
/* */
/* lcd_drv4.h Ver1.00 Tomcat works 2000/02/09 */
/* */
/* pio_bd0 --- lcd RS */
/* pio_bd1 --- lcd R/W */
/* pio_bd2 --- lcd E */
/* pio_bd3 --- nc (使用禁止、出力モード 必ずオープンにする事!) */
/* pio_bd4 --- lcd DB4 */
/* pio_bd5 --- lcd DB5 */
/* pio_bd6 --- lcd DB6 */
/* pio_bd7 --- lcd DB7 */
/* */
/* void lcd_reset(int line) line = 1 or 2 */
/* void lcd_clear( ) */
/* void lcd_data_dsp(int dsp_dat) */
/* void lcd_str_dsp(char *str) */
/* void cursor_home( ) */
/* void cursor_adr_w(int c_adr) */
/* int cursor_adr_r( ) */
/* void display_on( ) */
/* void cursor_on( ) */
/* void brnk_on( ) */
/* void cursor_brnk_on( ) */
/* void display_off( ) */
/* */
/*======================================================================*/
#asm
; LCD_BUSY *** LCDビジーチェック ***
LCD_BUSY: PUSH AF
PUSH BC
LD A,0CFH
OUT (IO_PIO_BC),A
LD A,0F0H
OUT (IO_PIO_BC),A
LCD_BUSY_1: LD A,02H
OUT (IO_PIO_BD),A ;R/W high
SET 2,A
OUT (IO_PIO_BD),A ;E high
IN A,(IO_PIO_BD)
LD B,A
RES 2,A
OUT (IO_PIO_BD),A ;E low
SET 2,A
OUT (IO_PIO_BD),A ;E high
RES 2,A
OUT (IO_PIO_BD),A ;E low
BIT 7,B
JR NZ,LCD_BUSY_1
LD A,0CFH
OUT (IO_PIO_BC),A
LD A,00H
OUT (IO_PIO_BC),A
POP BC
POP AF
RET
; LCD_INST *** インストラクションデータ出力 *** (A reg)
LCD_INST: PUSH AF
PUSH BC
LD C,A
AND 0FH
RLCA
RLCA
RLCA
RLCA
LD B,A
LD A,C
AND 0F0H
CALL LCD_BUSY
OUT (IO_PIO_BD),A
SET 2,A
OUT (IO_PIO_BD),A ;E = HIGH
RES 2,A
OUT (IO_PIO_BD),A ;E = LOW
LD A,B
OUT (IO_PIO_BD),A
SET 2,A
OUT (IO_PIO_BD),A ;E = HIGH
RES 2,A
OUT (IO_PIO_BD),A ;E = LOW
POP BC
POP AF
RET
; LCD_ADDR *** LCDアドレスリード( AF Reg in) ***
LCD_ADDR: PUSH BC
LD A,0CFH
OUT (IO_PIO_BC),A
LD A,0F0H
OUT (IO_PIO_BC),A
LCD_ADDR_1: LD A,02H
OUT (IO_PIO_BD),A ;R/W high
SET 2,A
OUT (IO_PIO_BD),A ;E high
IN A,(IO_PIO_BD)
LD B,A
RES 2,A
OUT (IO_PIO_BD),A ;E low
SET 2,A
OUT (IO_PIO_BD),A ;E high
IN A,(IO_PIO_BD)
LD C,A
RES 2,A
OUT (IO_PIO_BD),A ;E low
BIT 7,B
JR NZ,LCD_ADDR_1
SRL C
SRL C
SRL C
SRL C
LD A,B
AND 70H
OR C
LD B,A
LD A,0CFH
OUT (IO_PIO_BC),A
LD A,00H
OUT (IO_PIO_BC),A
LD A,B
POP BC
RET
; LCD_DATA *** データ出力(A reg out) ***
LCD_DATA: PUSH AF
PUSH BC
LD C,A
AND 0FH
RLCA
RLCA
RLCA
RLCA
LD B,A
LD A,C
AND 0F0H
SET 0,A
CALL LCD_BUSY
OUT (IO_PIO_BD),A
SET 2,A
OUT (IO_PIO_BD),A ;E = HIGH
RES 2,A
OUT (IO_PIO_BD),A ;E = LOW
LD A,B
SET 0,A
OUT (IO_PIO_BD),A
SET 2,A
OUT (IO_PIO_BD),A ;E = HIGH
RES 2,A
OUT (IO_PIO_BD),A ;E = LOW
POP BC
POP AF
RET
; LCD_DATA_IN *** LCDデータリード( AF Reg in) ***
LCD_DATA_IN: PUSH BC
LD A,0CFH
OUT (IO_PIO_BC),A
LD A,0F0H
OUT (IO_PIO_BC),A
LCD_DATA_IN1: LD A,02H
OUT (IO_PIO_BD),A ;R/W high
SET 2,A
OUT (IO_PIO_BD),A ;E high
IN A,(IO_PIO_BD)
LD B,A
RES 2,A
OUT (IO_PIO_BD),A ;E low
SET 2,A
OUT (IO_PIO_BD),A ;E high
RES 2,A
OUT (IO_PIO_BD),A ;E low
BIT 7,B
JR NZ,LCD_DATA_IN1
LD A,03H
OUT (IO_PIO_BD),A ;R/W high
SET 2,A
OUT (IO_PIO_BD),A ;E high
IN A,(IO_PIO_BD)
LD B,A
RES 2,A
OUT (IO_PIO_BD),A ;E low
SET 2,A
OUT (IO_PIO_BD),A ;E high
IN A,(IO_PIO_BD)
LD C,A
RES 2,A
OUT (IO_PIO_BD),A ;E low
SRL C
SRL C
SRL C
SRL C
LD A,B
AND 0F0H
OR C
LD B,A
LD A,0CFH
OUT (IO_PIO_BC),A
LD A,00H
OUT (IO_PIO_BC),A
LD A,B
POP BC
RET
; LCD_CRLF *** キャッジリターン ***
LCD_CRLF: PUSH AF
LD A,0C0H
CALL LCD_INST
POP AF
RET
; LCD_FUNCTION *** LCDファンクションセット ***
LCD_FUNCTION: PUSH AF ;リセット後3回のみ
LD A,30H ;8bit I/F
OUT (IO_PIO_BD),A
SET 2,A
OUT (IO_PIO_BD),A ;E = HIGH
RES 2,A
OUT (IO_PIO_BD),A ;E = LOW
POP AF
RET
; LCD_FUNC_B *** LCDファンクションセットB ***
LCD_FUNC_B: PUSH AF ;一回のみ
PUSH BC
BIT 1,A
JR NZ,LCD_FUNC_B1
LD B,00H ;1 Line
JR LCD_FUNC_B2
LCD_FUNC_B1: LD B,80H ;2 Line
LCD_FUNC_B2: LD A,20H ;4 bit I/F
OUT (IO_PIO_BD),A
SET 2,A
OUT (IO_PIO_BD),A ;E = HIGH
RES 2,A
OUT (IO_PIO_BD),A ;E = LOW
LD A,B
OUT (IO_PIO_BD),A
SET 2,A
OUT (IO_PIO_BD),A ;E = HIGH
RES 2,A
OUT (IO_PIO_BD),A ;E = LOW
POP BC
POP AF
RET
; *** 表示用タイマー ***
WAIT_SHORT: PUSH AF ;4MHzの場合316μs
PUSH BC ;6MHzの場合210μs
LD B,93 ;8MHzの場合158μs
WAIT_SHORT_1: DJNZ WAIT_SHORT_1
POP BC
POP AF
RET
WAIT_LONG: PUSH AF ;4MHzの場合1.63ms
PUSH BC
LD B,103 ;8MHzの場合103
WAIT_LONG_1: CALL WAIT_SHORT
DJNZ WAIT_LONG_1
POP BC
POP AF
RET
#endasm
/* *** 電源オンリセット *** */
/* line = 1 or 2 */
void lcd_reset(int line)
{
#asm
ld a,0cfh
out (IO_PIO_BC),a
ld a,00h
out (IO_PIO_BC),a
ld b,10
lcd_reset1:
call wait_long
djnz lcd_reset1
call lcd_function
ld b,3
lcd_reset2:
call wait_long
djnz lcd_reset2
call lcd_function
call wait_short
call lcd_function
call wait_short
ld hl, 2 ; 引き数の取り出し
add hl, sp
ld a, (hl)
call lcd_func_b
ld a,06h
call lcd_inst
ld a,01h
call lcd_inst
ld a,0ch
call lcd_inst
#endasm
}
/* *** LCD1文字表示データ出力 *** */
void lcd_data_dsp(int dsp_dat)
{
#asm
ld hl, 2
add hl, sp
ld a, (hl)
call lcd_data
#endasm
}
/* *** LCD文字列表示データ出力 *** */
void lcd_str_dsp(char *str)
{
#asm
ld hl, 2
add hl, sp
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
print_to_null:
ld a,(hl)
inc hl
or a
jr z,print_to_null_1
call lcd_data
jr print_to_null
print_to_null_1:
#endasm
}
/* *** LCD全桁表示消去 *** */
void lcd_clear( )
{
#asm
ld a,01h
call lcd_inst
#endasm
}
/* *** カーソルをホームポジションへ *** */
void cursor_home( )
{
#asm
ld a,02h
call lcd_inst
#endasm
}
/* *** カーソルを指定位置に *** */
void cursor_adr_w(int c_adr)
{
#asm
ld hl, 2
add hl, sp
ld a, (hl)
or 80h
call lcd_inst
#endasm
}
/* *** カーソル位置リード *** */
int cursor_adr_r( )
{
#asm
call lcd_addr
ld l, a
ld h, 0
#endasm
}
/* *** 表示ON *** */
void display_on( )
{
#asm
ld a,0ch
call lcd_inst
#endasm
}
/* *** カーソル ON *** */
void cursor_on( )
{
#asm
ld a,0eh
call lcd_inst
#endasm
}
/* *** ブリンク ON *** */
void brnk_on( )
{
#asm
ld a,0dh
call lcd_inst
#endasm
}
/* *** カーソル、ブリンク ON *** */
void cursor_brnk_on( )
{
#asm
ld a,0fh
call lcd_inst
#endasm
}
/* *** 表示OFF *** */
void display_off( )
{
#asm
ld a,08h
call lcd_inst
#endasm
}