目次 > 9章PIC18編 > PIC18F2320 > 液晶ディスプレイ(LCD)を使う(内部クロック動作)> ソース
液晶ディスプレイ(LCD)を使う
− 内部クロック動作 −
更新日2009.6.7
以下のソースを取り込んで、アセンブル→PIC書き込み→実行して下さい。
; ========================== ここから ============================== ; ファイル名 2320LCD.asm ; 作成日 2008.6.28 ; 作成者 mit.ueno ; バージョン 1.0 ; ; PIC PIC18F2320 ; クロック INTIO2 8MHz ; 概要 ; PIC18F2320でLCDの制御 ; 内部クロック8MHz ; 使用ポート ; RC4 LCD DB4 ; RC5 LCD DB5 ; RC6 LCD DB6 ; RC7 LCD DB7 ; ; RC0 LCD E (6:Enable Signal) ; RC1 LCD R/W (5:Read/Write) ; RC2 LCD RS (4:Register Select) ; ; ***************************************************** LIST P=18F2320 INCLUDE P18F2320.INC CONFIG OSC = INTIO2 ; ***************************************************** CBLOCK 0x000 CNT50us CNT05ms CNT5ms CNT1ms CNT01s CNT1s char ;LCD表示文字 ENDC E EQU 0x00 ;LCD Enable RW EQU 0x01 ;LCD Read/Write RS EQU 0x02 ;LCD Register Select ; ******** リセットベクタ ***************************** ORG 0x0000 ; ******** 初期処理 *********************************** MOVLW 0x72 MOVWF OSCCON ;8MHz,INTOSC CLRF TRISC ;PORTC:Output(LCD) CLRF PORTC ; ******** メイン処理 ********************************* CALL wait5ms CALL wait5ms CALL wait5ms CALL LCD_init ;LCD初期化 MOVLW 'P' CALL LCD_write MOVLW 'I' CALL LCD_write MOVLW 'C' CALL LCD_write MOVLW '1' CALL LCD_write MOVLW '8' CALL LCD_write MOVLW 'F' CALL LCD_write MOVLW '2' CALL LCD_write MOVLW '3' CALL LCD_write MOVLW '2' CALL LCD_write MOVLW '0' CALL LCD_write main: CALL LCD_2line MOVLW '.' CALL LCD_write CALL wait1s CALL LCD_2line MOVLW ' ' CALL LCD_write CALL wait1s GOTO main ;================= LCD表示をクリアする =================== LCD_clear MOVLW 01h CALL LCD_command CALL wait5ms ;LCDのBFをチェックしないので1.53mS以上待つ RETURN ;================= LCDのカーソル位置を先頭に戻す ========= LCD_home MOVLW 080h 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 BSF PORTC,RS ;RS=1(Data) MOVLW 00Fh ;PORTCの上位4ビットを ANDWF PORTC,F ; クリア MOVF char,W ;上位 ANDLW 0F0h ;4ビットを IORWF PORTC,F ;PORTC(4-7)にセット(PORTC(0-3)はそのまま) BSF PORTC,E ;LCDにデータ書き込み NOP BCF PORTC,E MOVLW 00Fh ;PORTCの上位4ビットを ANDWF PORTC,F ; クリア SWAPF char,W ;下位 ANDLW 0F0h ;4ビットを IORWF PORTC,F ;PORTC(4-7)にセット(PORTC(0-3)はそのまま) BSF PORTC,E ;LCDにデータ書き込み NOP BCF PORTC,E CALL wait50us ;LCDのBFをチェックしないので50uS待つ RETURN ;================= LCDにコマンドを送る =================== LCD_command MOVWF char BCF PORTC,RS ;RS=0(Command) MOVLW 00Fh ;PORTCの上位4ビットを ANDWF PORTC,F ; クリア MOVF char,W ;上位 ANDLW 0F0h ;4ビットを IORWF PORTC,F ;PORTC(4-7)にセット(PORTC(0-3)はそのまま) BSF PORTC,E ;LCDにデータ書き込み NOP BCF PORTC,E MOVLW 00Fh ;PORTCの上位4ビットを ANDWF PORTC,F ; クリア SWAPF char,W ;下位 ANDLW 0F0h ;4ビットを IORWF PORTC,F ;PORTC(4-7)にセット(PORTC(0-3)はそのまま) BSF PORTC,E ;LCDにデータ書き込み NOP BCF PORTC,E CALL wait50us ;LCDのBFをチェックしないので50uS待つ RETURN ;================= LCD初期化 ================================ LCD_init BCF PORTC,RS ;RS=0 BCF PORTC,E ;E=0 MOVLW 030h ;上位4ビットに'3'をセット MOVWF PORTC BSF PORTC,E ;ファンクションセット(1回目) NOP BCF PORTC,E CALL wait5ms ;5mS待つ BSF PORTC,E ;ファンクションセット(2回目) NOP BCF PORTC,E CALL wait5ms ;5mS待つ BSF PORTC,E ;ファンクションセット(3回目) NOP BCF PORTC,E CALL wait5ms ;5mS待つ MOVLW 020h ;4ビットモード MOVWF PORTC ;に BSF PORTC,E ;設定 NOP BCF PORTC,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 ; ******** タイマルーチン ***************************** ; ******** 1sタイマ ******** wait1s MOVLW d'10' MOVWF CNT1s wait1sL CALL wait01s DECFSZ CNT1s GOTO wait1sL RETURN ; ******** 100msタイマ ******** wait01s MOVLW d'200' MOVWF CNT01s wait01sL CALL wait05ms DECFSZ CNT01s GOTO wait01sL RETURN ; ******** 5msタイマ ******** wait5ms MOVLW d'10' MOVWF CNT5ms wait5msL CALL wait05ms DECFSZ CNT5ms GOTO wait5msL RETURN ; ******** 1msタイマ ******** wait1ms MOVLW d'2' MOVWF CNT1ms wait1msL CALL wait05ms DECFSZ CNT1ms GOTO wait1msL RETURN ; ******** 0.5msタイマ ******** wait05ms MOVLW d'249' MOVWF CNT05ms wait05msL NOP DECFSZ CNT05ms,F GOTO wait05msL RETURN ; ******** 50usタイマ ******** wait50us MOVLW d'25' MOVWF CNT50us wait50usL NOP DECFSZ CNT50us,F GOTO wait50usL RETURN END ; ========================== ここまで ==============================