;***********************************************
; 2005/2/9
; LM35 LCD表示温度計 0℃〜100℃
; pic16f873 クロック 10MHZ
;
;************************************************
LIST P=PIC16F873,R=DEC
INCLUDE "P16F873.INC"
__CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _LVP_OFF
;
;**************************************************
; 変数
;**************************************************
DLYH EQU H'20'
DLYL EQU H'21'
SAVE1 EQU H'22'
CNT04M EQU H'24'
CNT10M EQU H'25'
CNT50M EQU H'26'
CNT20M EQU H'27'
CNT20U EQU H'28'
BCD1 EQU H'33'
BCD10 EQU H'34'
BCD100 EQU H'35'
BCD1000 EQU H'36'
BCD_BIT_L EQU H'37'
BCD_BIT_H EQU H'38'
BCD_CNT EQU H'39'
BCD_SAVE EQU H'40'
CNT1SEC EQU H'41'
;****************************************************
; 定数
;*****************************************************
RS SET 1 ;RS
RW SET 2 ;RW
E SET 3 ;E
ORG 0
GOTO MAIN
;****************************************************
; MAIN
;****************************************************
MAIN CALL INIT ;初期設定
CALL INIT_LCD ;LCDの初期化
MOVLW B'00000001' ;SET CUR
CALL OUTLCD0
CALL DLY20MS
MOVLW H'3D' ;=オンド=を表示
CALL OUTLCD1
CALL DLY20MS
MOVLW H'3D'
CALL OUTLCD1
CALL DLY20MS
MOVLW H'3D'
CALL OUTLCD1
CALL DLY20MS
MOVLW H'3D'
CALL OUTLCD1
CALL DLY20MS
MOVLW H'3D'
CALL OUTLCD1
CALL DLY20MS
MOVLW H'B5'
CALL OUTLCD1
CALL DLY20MS
MOVLW H'DD'
CALL OUTLCD1
CALL DLY20MS
MOVLW H'C4'
CALL OUTLCD1
CALL DLY20MS
MOVLW H'DE'
CALL OUTLCD1
CALL DLY20MS
MOVLW H'B9'
CALL OUTLCD1
CALL DLY20MS
MOVLW H'B2'
CALL OUTLCD1
CALL DLY20MS
MOVLW H'3D'
CALL OUTLCD1
CALL DLY20MS
MOVLW H'3D'
CALL OUTLCD1
CALL DLY20MS
MOVLW H'3D'
CALL OUTLCD1
CALL DLY20MS
MOVLW H'3D'
CALL OUTLCD1
CALL DLY20MS
MOVLW H'3D'
CALL OUTLCD1
CALL DLY20MS
;********************************************************
; 1秒間隔で温度測定
;********************************************************
LOOP MOVLW B'10000001' ;Fosc/32 RA0 A/D ON
MOVWF ADCON0
CALL DLY20US ;20us待機
BSF ADCON0,GO ;A/D変換スタート
AD_LOOP BTFSC ADCON0,GO ;A/D変換完了チェック
GOTO AD_LOOP
MOVF ADRESH,W
ANDLW B'00000011'
MOVWF BCD_BIT_H
BSF STATUS,RP0
MOVF ADRESL,W
BCF STATUS,RP0
MOVWF BCD_BIT_L
CALL DISP_ONDO ;温度表示
MOVLW B'00000010'
XORWF PORTA,F ;LED点滅
CALL DLY1SEC ;1秒間隔で温度チェック
GOTO LOOP
;***************************************************
; DISP_ONDO
;***************************************************
DISP_ONDO
CALL BCD16BIT ;BCD変換へ
MOVF BCD1000,W
BTFSS STATUS,Z ;0なら表示しない
GOTO B1000
MOVF BCD100,W
BTFSS STATUS,Z ;0なら表示しない
GOTO B100
GOTO SET10
B1000 MOVLW H'C5' ;LCD表示位置
CALL OUTLCD0
CALL DLY20MS
GOTO SET1000
B100 MOVLW H'C6' ;LCD表示位置
CALL OUTLCD0
CALL DLY20MS
GOTO SET100
; 温度表示************************************
SET1000 MOVF BCD1000,W ;100の位
IORLW H'30' ;ASCIIコードに
CALL OUTLCD1
CALL DLY20MS
SET100 MOVF BCD100,W ;10の位
IORLW H'30'
CALL OUTLCD1
CALL DLY20MS
SET10 MOVLW H'C7' ;LCD表示位置
CALL OUTLCD0
CALL DLY20MS
MOVF BCD10,W ;1の位
IORLW H'30'
CALL OUTLCD1
CALL DLY20MS
MOVLW '.' ;小数点
CALL OUTLCD1
CALL DLY20MS
SET1 MOVF BCD1,W ;0.1の位
IORLW H'30'
CALL OUTLCD1
CALL DLY20MS
MOVLW H'DF' ;°
CALL OUTLCD1
CALL DLY20MS
MOVLW H'43' ;C
CALL OUTLCD1
CALL DLY20MS
RETURN
;***************************************************
; BCD変換
;***************************************************
BCD16BIT
MOVLW H'33' ;BCD1
MOVWF FSR
CALL BCD_16 ;1の位
CALL BCD_16 ;10の位
CALL BCD_16 ;100の位
CALL BCD_16 ;1000の位
RETURN
BCD_16 MOVLW D'16'
MOVWF BCD_CNT
CLRF BCD_SAVE
BCD_LOOP
BCF STATUS,C
RLF BCD_BIT_L,F
RLF BCD_BIT_H,F
RLF BCD_SAVE,F
MOVLW D'246'
ADDWF BCD_SAVE,W
BTFSS STATUS,C
GOTO BCD_END
MOVWF BCD_SAVE
INCF BCD_BIT_L,F
BCD_END
DECFSZ BCD_CNT,F
GOTO BCD_LOOP
MOVF BCD_SAVE,W
MOVWF INDF ;10で割った余りをFSRのアドレスに格納
INCF FSR,F ;FSRプラス1でメモリ移動
RETURN
;***************************************************
; INIT
;***************************************************
INIT BSF STATUS,RP0 ;ページ1
MOVLW B'10001110'
MOVWF ADCON1 ;右詰、RA0アナログ、
MOVLW B'00000001' ;RA0 IN
MOVWF TRISA
MOVLW B'00000000'
MOVWF TRISB
MOVWF TRISC
BCF STATUS,RP0 ;ページを戻す
CLRF PORTA
CLRF PORTB
CLRF PORTC
RETURN
;****************************************************
; LCD_INIT
;****************************************************
INIT_LCD
CALL DLY50MS
MOVLW B'00110000'
CALL OUTLCDL
CALL DLY20MS
MOVLW B'00110000'
CALL OUTLCDL
CALL DLY20MS
MOVLW B'00110000'
CALL OUTLCDL
CALL DLY20MS
MOVLW B'00100000'
CALL OUTLCDL
CALL DLY20MS
MOVLW B'00101000'
CALL OUTLCD0
CALL DLY20MS
MOVLW B'00001100'
CALL OUTLCD0
MOVLW B'00000001'
CALL OUTLCD0
CALL DLY50MS
MOVLW B'00000110'
CALL OUTLCD0
CALL DLY50MS
RETURN
;**********************************************
; LCD CONT
;**********************************************
;***** コマンド 出力 ****************
OUTLCD0 ;CMD
MOVWF SAVE1
ANDLW 0F0H
CALL OUTLCDL
SWAPF SAVE1,W
ANDLW 0F0H
CALL OUTLCDL
RETURN
OUTLCDL
MOVWF PORTB
BCF PORTB,RW ;RW0 書き込みモード
BCF PORTB,RS ;RS0 コマンドモード
BSF PORTB,E ;E1 Hでストロープ
NOP
BCF PORTB,E ;E0
RETURN
;***** LCDへデータ出力 **********************
OUTLCD1 ;DATA
MOVWF SAVE1
ANDLW 0F0H
CALL OUTLCD
SWAPF SAVE1,W
ANDLW 0F0H
CALL OUTLCD
RETURN
OUTLCD
MOVWF PORTB
BCF PORTB,RW ;RW0 書き込みモード
BSF PORTB,RS ;RS1 データモード
BSF PORTB,E ;E1 動作信号の設定 Hでストロープ
NOP
BCF PORTB,E ;E0
RETURN
;******************************************
; TIME DELAY
;******************************************
DLY20US MOVLW D'15' ;20usec
MOVWF CNT20U
LOOP20U DECFSZ CNT20U,F
GOTO LOOP20U
RETURN
DLY1SEC MOVLW D'100' ;1SEC
MOVWF CNT1SEC
LOOP1S CALL DLY10MS
DECFSZ CNT1SEC,F
GOTO LOOP1S
RETURN
TIM04 MOVLW D'249' ;0.4MSEC
MOVWF CNT04M
LOOP04M NOP
DECFSZ CNT04M,F
GOTO LOOP04M
RETURN
DLY10MS MOVLW D'25' ;10MSEC
MOVWF CNT10M
LOOP10M CALL TIM04
DECFSZ CNT10M,F
GOTO LOOP10M
RETURN
DLY50MS MOVLW D'5'
MOVWF CNT50M ;50MSEC
LOOP50M CALL DLY10MS
DECFSZ CNT50M,F
GOTO LOOP50M
RETURN
DLY20MS MOVLW D'2'
MOVWF CNT20M ;20MSEC
LOOP20M CALL DLY10MS
DECFSZ CNT20M,F
GOTO LOOP20M
RETURN
END
|