; 振荡器 1MHz R/C
; 命令时钟 250kHz
include
page1 macro
bsf STATUS,RP0 ; page1
endm
page0 macro
bcf STATUS,RP0 ; page0
endm
cbLOCk 0ch
time1, temp
lo_val, hi_val, msn, lsn
digit1, digit2
count, read
ssave, wsave
flags
endc
;==================================
org 00
goto init
org 04
btfss INTCON,T0IF
goto end_int
MOVwf wsave
swapf STATUS,w
MOVwf ssave ;中断保护
decf count,f
decfsz read,f
goto int2
call adconv ; A/D
MOVlw .16 ;
MOVwf read
int2 MOVf count,0
btfsc STATUS,Z
bsf flags,0 ; eot
bcf INTCON,T0IF
end_int swapf ssave,w
MOVwf STATUS ;
swapf wsave,f ;
swapf wsave,w
retfie ;
;========== 查表 ===============
table addwf PCL ; port b
retlw b’01110111’ ; 0
retlw b’00010100’ ; 1
retlw b’00111011’ ; 2
retlw b’00111110’ ; 3
retlw b’01011100’ ; 4
retlw b’01101110’ ; 5
retlw b’01101111’ ; 6
retlw b’00110100’ ; 7
retlw b’01111111’ ; 8
retlw b’01111100’ ; 9
retlw 0
retlw 0
retlw 0
retlw 0
retlw 0
retlw 0
retlw 0
; ********************* 温度 转变******************
lookup addwf PCL
retlw .99 ; 00
retlw .99 ; 01
retlw .99 ; 02
retlw .99 ; 03
retlw .91 ; 04
retlw .81 ; 05
retlw .73 ; 06
retlw .66 ; 07
retlw .59 ; 08
retlw .52 ; 09
retlw .45 ; 0A
retlw .39 ; 0B
retlw .31 ; 0C
retlw .23 ; 0D
retlw .13 ; 0E
retlw .0 ; 0F
retlw .0 ; catch for >f0h
; ========== a/d转变 值存到 temp ==========
interp MOVf lsn,0 ; 初值
swapf lsn,w ; swap & save
MOVwf msn ; into w
MOVlw 0fh
andwf lsn,f ; strip off upper rubbish
andwf msn,f ; strip off upper rubbish
MOVf msn,0 ; reload
call lookup ; get value
MOVwf lo_val ; save it
incf msn,w ; increment pointer
call lookup ; get next value
subwf lo_val,w ; get difference & save
MOVwf hi_val
mult addwf hi_val,f ; add to current
decfsz lsn,f ; count down on multiply loop
goto mult
swapf hi_val,w ; divide by 16
andlw 0fh ; extract upper nibble
subwf lo_val,w ; add lo value to lo value to get result
return
adconv bsf ADCON0,GO ; start conversion
MOVlw .5 ; wait delay 10uS
MOVwf temp
decfsz temp,f ; loop for a while
goto $-1
btfsc ADCON0,GO ; test for end of conversion
goto $-1
retlw 0
bin_bcd MOVwf digit1 ; first digit
clrf digit2 ; second digit
tenlop MOVlw .10
subwf digit1,w ; find out how many 10’s
btfsc STATUS,C
incf digit2,f
btfsc STATUS,C
MOVwf digit1 ; remainder 1’s left
btfsc STATUS,C
goto tenlop
return
; =======================================
init clrf PORTB
clrf PORTA
clrf ADCON0
clrf flags
page1
MOVlw b’11110011’
MOVwf TRISA
MOVlw b’10000000’ ;
MOVwf TRISB ; set up port b
MOVlw b’00000100’ ; /32
MOVwf OPTION_REG
MOVlw b’00000010’
MOVwf ADCON1
page0
MOVlw b’00001000’ ; set up change of state on portb
MOVwf INTCON ; to wake up
sleep ; shut down
MOVlw b’11000001’ ; set a/d internal rc clock
; channel 0, a/d running
MOVwf ADCON0 ; do it
MOVlw .153 ; timeout value
MOVwf count
MOVlw .16 ; interval timer reload
MOVwf read
MOVlw b’10100000’ ; set up change of state on portb
MOVwf INTCON ; to wake up
call adconv ; perform A/D conversion
; ================== main ====================
main btfsc flags,0 ; test for timeout
goto init ; yes so shut down
MOVf ADRES,0 ; load value
MOVwf lsn ; store for conversion
call interp ; using interpolation method
call bin_bcd ; convert into 2 digits
MOVf digit1,0 ; load msb
call table ; convert into 7 segment format
MOVwf PORTB ; send to display
bsf PORTA,2 ; enable character
btfss TMR0,6 ; test bit
goto $-1 ; loop
bcf PORTA,2
MOVf digit2,0 ; load lsb
call table ; convert into 7 segment format
MOVwf PORTB ; send to display
bsf PORTA,3 ; enable character
btfsc TMR0,6 ; test bit
goto $-1 ; loop
bcf PORTA,3
goto main
end
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』