LCDディスプレイ関係サンプル
/*======================================================================*/
/* */
/* HD44780使用LCDユニット用 */
/* ドライブ ライブラリー Vr1.00 */
/* (クロック8MHz データバス直結用) */
/* lcd_drv.h */
/* */
/* 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( ) */
/* 96/06/24 Y,Fushimi */
/* */
/*======================================================================*/
#asm
; LCD_BUSY *** LCDビジーチェック ***
LCD_BUSY: PUSH AF
LCD_BUSY_1: IN A,(IO_LCD_BC)
BIT 7,A
JR NZ,LCD_BUSY_1
POP AF
RET
; LCD_INST *** インストラクションデータ出力 *** (A reg)
LCD_INST: PUSH AF
CALL LCD_BUSY
OUT (IO_LCD_BC),A
POP AF
RET
; LCD_CRLF *** キャッジリターン ***
LCD_CRLF: PUSH AF
LD A,0C0H
CALL LCD_INST
POP AF
RET
; LCD_FUNCTION *** LCDファンクションセット ***
LCD_FUNCTION: PUSH AF ;リセット後一回のみ
BIT 1,A
JR NZ,LCD_FUNCTION1
LD A,30H ;8bit I/F,5x7 Disp,1 Line
JR LCD_FUNCTION2
LCD_FUNCTION1: LD A,38H ;8bit I/F,5x7 Disp,2 Line
LCD_FUNCTION2: OUT (IO_LCD_BC),A
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 hl, 2
add hl, sp
ld a, (hl)
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
call lcd_function
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_busy
out (io_lcd_dt),a
#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_busy
out (io_lcd_dt),a
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_busy
in a,(io_lcd_bc)
and 7fh
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
}