http://mitt.la.coocan.jp/pic/pic5_17.html
のサイトを主に参考にさせていただきました。感謝 謝!
ぶっちゃけ、参考というより、ほぼ99.9% コピペにて 感謝 謝!
PIC16F88 に変更しています。
カーソル位置を少し右よりにして表示してます。
アセンブラです。
;LCD SC1602BS*B 接続 基本動作
;参考URL http://mitt.la.coocan.jp/pic/pic5_17.html
;まあ、ほぼまるコピーです 感謝 謝!
;**********************************************************
; clock:20MHz
;
; LCDを4ビットで制御
;
; PICのピン接続
; RB0 LCD DB4
; RB1 LCD DB5
; RB2 LCD DB6
; RB3 LCD DB7
;
; RA0 LCD R/W (6:Read/Write)
; RA1 LCD E (5:Enable Signal)
; RA2 LCD RS (4:Register Select)
;
; 使用タイマ(プログラムループ)
; 15mS LCDパワーオンリセット待ち
; 5mS LCD初期化ルーチン
; 1mS LCD初期化ルーチン
; 50uS LCD初期化ルーチン,書き込み待ち
;
list p=PIC16F88
INCLUDE "p16F88.inc"
__CONFIG _CONFIG1, _CP_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_ON & _WDT_OFF & _PWRTE_ON & _HS_OSC
__CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF
; __CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF
ORG 00h
;******
CBLOCK 20h
save_st ;STATUSのセーブ
save_w ;W-regのセーブ
CNT15mS ;15mSカウンタ
CNT5mS ;5mSカウンタ
CNT1mS ;1mSカウンタ
CNT50uS ;50μSカウンタ
char ;LCD表示データ
ENDC
RW EQU 00h ;LCD R/W
E EQU 01h ;LCD Enable
RS EQU 02h ;LCD Register Select
BUSY EQU 03h ;BUSY FLAG (PORTB,3)
; ==================== 初期処理 =====================
org 0
init
BSF STATUS,RP0 ;■バンク1に切替え
CLRF ANSEL
MOVLW H'F8'
MOVWF TRISA ;RA0-2は出力
MOVLW H'F0'
MOVWF TRISB ;RB0-3は出力
BCF OPTION_REG,NOT_RBPU
BCF STATUS,RP0 ;■バンク0に切替え
CLRF PORTA
CLRF PORTB
;***************************************************
goto start
;タイマチェック
TIM
BCF PORTA,0
CALL TIM1
BSF PORTA,0
CALL TIM1
GOTO TIM
TIM1
CALL wait50us
; CALL wait1ms
; CALL wait5ms
RETURN
;***************************************************
start
CALL LCD_init ;LCD 初期化
; ==================== メイン処理 =====================
main
CALL LCD_home ;カーソルを1行目の先頭に
MOVLW 084h ;表示位置変更 80h+00h~
CALL LCD_command
MOVLW 'H'
CALL LCD_write
MOVLW 'e'
CALL LCD_write
MOVLW 'l'
CALL LCD_write
MOVLW 'l'
CALL LCD_write
MOVLW 'o'
CALL LCD_write
MOVLW ','
CALL LCD_write
CALL LCD_2line ;カーソルを2行目の先頭に
MOVLW 0CAh ;表示位置変更 80h+40h~
CALL LCD_command
MOVLW 'w'
CALL LCD_write
MOVLW 'o'
CALL LCD_write
MOVLW 'r'
CALL LCD_write
MOVLW 'l'
CALL LCD_write
MOVLW 'd'
CALL LCD_write
MOVLW '!'
CALL LCD_write
CLRF PORTA
CLRF PORTB
SLEEP
GOTO main
;================= LCD表示をクリアする ===================
LCD_clear
MOVLW 01h
CALL LCD_command
RETURN
;================= LCDのカーソル位置を先頭に戻す =========
LCD_home
MOVLW 02h
CALL LCD_command
RETURN
;================= LCDのカーソル位置を2行目の先頭に =====
LCD_2line
MOVLW 0C0h
CALL LCD_command
RETURN
;================= LCDのディスプレイをONにする =========
LCD_on
MOVLW 0Ch
CALL LCD_command
RETURN
;================= LCDのディスプレイとカーソルをONにする ==
LCD_on_cur
MOVLW 0Eh
CALL LCD_command
RETURN
;================= LCDのディスプレイをOFFにする =======
LCD_off
MOVLW 08h
CALL LCD_command
RETURN
;================= LCDにデータを送る =====================
LCD_write
MOVWF char
CALL LCD_BF_wait ;LCD busy 解除待ち
BCF PORTA,RW ;R/W=0(Write)
BSF PORTA,RS ;RS=1(Data)
MOVLW 0F0h ;PORTBの下位4ビットを
ANDWF PORTB,F ; クリア
SWAPF char,W ;上位
ANDLW 0Fh ;4ビットを
IORWF PORTB,F ;PORTB(3-0)にセット(PORTB(7-4)はそのまま)
BSF PORTA,E ;LCDにデータ書き込み
NOP
BCF PORTA,E
MOVLW 0F0h ;PORTBの下位4ビットを
ANDWF PORTB,F ; クリア
MOVF char,W ;下位
ANDLW 0Fh ;4ビットを
IORWF PORTB,F ;PORTB(3-0)にセット(PORTB(7-4)はそのまま)
BSF PORTA,E ;LCDにデータ書き込み
NOP
BCF PORTA,E
RETURN
;================= LCDにコマンドを送る ===================
LCD_command
MOVWF char
CALL LCD_BF_wait ;LCD busy 解除待ち
BCF PORTA,RW ;R/W=0(Write)
BCF PORTA,RS ;RS=0(Command)
MOVLW 0F0h ;PORTBの下位4ビットを
ANDWF PORTB,F ; クリア
SWAPF char,W ;上位
ANDLW 0Fh ;4ビットを
IORWF PORTB,F ;PORTB(3-0)にセット(PORTB(7-4)はそのまま)
BSF PORTA,E ;LCDにデータ書き込み
NOP
BCF PORTA,E
MOVLW 0F0h ;PORTBの下位4ビットを
ANDWF PORTB,F ; クリア
MOVF char,W ;下位
ANDLW 0Fh ;4ビットを
IORWF PORTB,F ;PORTB(3-0)にセット(PORTB(7-4)はそのまま)
BSF PORTA,E ;LCDにデータ書き込み
NOP
BCF PORTA,E
RETURN
;================= LCD Busy 解除待ち ========================
LCD_BF_wait
BCF PORTA,E
BCF PORTA,RS ;RS=0(Control)
BSF PORTA,RW ;R/W=1(Read) Busy Flag read
BSF STATUS,RP0 ;■バンク1に切替え
MOVLW 0FFh
MOVWF TRISB ;RB0-7は入力
BCF STATUS,RP0 ;■バンク0に切替え
BSF PORTA,E ;LCD上位4ビット読み込み
NOP
BTFSS PORTB,BUSY ;LCD Busy ?
GOTO LCD_BF_wait1 ; No
BCF PORTA,E
NOP
BSF PORTA,E ;LCD下位4ビット読み飛ばし
NOP
BCF PORTA,E
GOTO LCD_BF_wait
LCD_BF_wait1
BSF PORTA,E ;LCD下位4ビット読み飛ばし
NOP
BCF PORTA,E
BSF STATUS,RP0 ;■バンク1に切替え
MOVLW 0F0h ;RB0-3は出力
MOVWF TRISB
BCF STATUS,RP0 ;■バンク0に切替え
RETURN
;================= LCD初期化 ================================
LCD_init
CALL wait15ms ;15mS待つ
BCF PORTA,RW ;R/W=0
BCF PORTA,RS ;RS=0
BCF PORTA,E ;E=0
MOVLW 0F0h ;PORTBの上位4ビットを
ANDWF PORTB,W ;取り出す(変更しないように)
IORLW 03h ;下位4ビットに'3'をセット
MOVWF PORTB
BSF PORTA,E ;ファンクションセット(1回目)
NOP
BCF PORTA,E
CALL wait5ms ;5mS待つ
MOVLW 0F0h ;PORTBの上位4ビットを
ANDWF PORTB,W ;取り出す(変更しないように)
IORLW 03h ;下位4ビットに'3'をセット
MOVWF PORTB
BSF PORTA,E ;ファンクションセット(2回目)
NOP
BCF PORTA,E
CALL wait5ms ;5mS待つ
MOVLW 0F0h ;PORTBの上位4ビットを
ANDWF PORTB,W ;取り出す(変更しないように)
IORLW 03h ;下位4ビットに'3'をセット
MOVWF PORTB
BSF PORTA,E ;ファンクションセット(3回目)
NOP
BCF PORTA,E
CALL wait5ms ;5mS待つ
MOVLW 0F0h ;PORTBの上位4ビットを
ANDWF PORTB,W ;取り出す(変更しないように)
IORLW 02h ;4ビットモード
MOVWF PORTB ;に
BSF PORTA,E ;設定
NOP
BCF PORTA,E
CALL wait1ms ;1mS待つ
MOVLW 028h ;4ビットモード,2行表示,7ドット
CALL LCD_command
CALL LCD_off ;ディスプレイOFF
CALL LCD_clear ;LCDクリア
MOVLW 06h ;
CALL LCD_command ;カーソルモードセット (Increment)
CALL LCD_on ;ディスプレイON,カーソルOFF
RETURN
;================= 15mS WAIT ================================
wait15ms
MOVLW d'3'
MOVWF CNT15mS
wait15ms_loop
CALL wait5ms
DECFSZ CNT15mS,F
GOTO wait15ms_loop
RETURN
;================= 5mS WAIT =================================
wait5ms
MOVLW d'100'
MOVWF CNT5mS
wait5ms_loop
CALL wait50us
DECFSZ CNT5mS,F
GOTO wait5ms_loop
RETURN
;================= 1mS WAIT =================================
wait1ms
MOVLW d'20'
MOVWF CNT1mS
wait1ms_loop
CALL wait50us
DECFSZ CNT1mS,F
GOTO wait1ms_loop
RETURN
;================= 50μS WAIT ===============================
wait50us
; 1サイクル(4クロック):0.2μS
; 50μS=0.2μS×250サイクル
MOVLW d'82' ;1
MOVWF CNT50uS ;1
wait50us_loop
DECFSZ CNT50uS,F ;1
GOTO wait50us_loop ;2
RETURN ;2+1
END
※コメント投稿者のブログIDはブログ作成者のみに通知されます