?? 16c711 ok.asm
字號:
;http://www.bluebird-electronics.co.uk
; 振蕩器 1MHz R/C
; 命令時鐘 250kHz
include<p16c711.inc>
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
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -