目次 > 9章PIC18編 > PIC18F2320 > A/D変換を使う> ソース
A/D変換を使う
更新日2009.8.1
以下のソースを取り込んで、アセンブル→PIC書き込み→実行して下さい。
; ========================== ここから ============================== ; ファイル名 2320AD_LCD.asm ; 作成日 2008.6.28 ; 作成者 mit.ueno ; バージョン 1.0 ; ; PIC PIC18F2320 ; クロック INTIO2 8MHz ; 概要 ; PIC18F2320でA/D変換,結果をLCDに表示 ; 内部クロック8MHz ; 使用ポート ; RA0 AN0(VR) ; ; 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) not used ; 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 ; ======== EEPROM =========== ; 16進変換テーブル ORG 0xF00000 DE "0123456789ABCDEF" ; ======== リセットベクタ ============================= ORG 0x0000 ; ======== 初期処理 =================================== MOVLW 0x7F MOVWF OSCCON ;8MHz,INTOSC MOVLW 0x0E MOVWF ADCON1 ;AD:AN0 MOVLW 0xA5 MOVWF ADCON2 ;右詰,ACQT:8TAD,ADCS:FOSC/16 MOVLW 0x01 MOVWF ADCON0 ;AD有効,CHAN:0 CLRF EECON1 CLRF TRISC ;PORTC:Output(LCD) CLRF PORTC CALL wait5ms CALL wait5ms CALL wait5ms CALL LCD_init ;LCD初期化 CALL LCD_init_disp ;LCD初期表示 ; ======== メイン処理 ================================= main BSF ADCON0,GO ;A/D変換開始 MOVLW 0C4h CALL LCD_command main_AD BTFSC ADCON0,GO ;A/D変換完了? GOTO main_AD ; No MOVF ADRESH,W CALL bin2hex CALL LCD_write SWAPF ADRESL,W CALL bin2hex CALL LCD_write MOVF ADRESL,W CALL bin2hex CALL LCD_write GOTO main ;================= LCD初期表示 =========================== LCD_init_disp 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 CALL LCD_2line MOVLW 'A' CALL LCD_write MOVLW '/' CALL LCD_write MOVLW 'D' CALL LCD_write MOVLW '=' CALL LCD_write RETURN ;================= 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 ; ========= Wregの下位4ビットを16進表現に変換 ======= bin2hex ANDLW 0Fh ; Wregの下位4ビットを取り出す MOVWF EEADR BSF EECON1,RD MOVF EEDATA,W ; 16進表現文字をセット RETURN END ; ========================== ここまで ==============================