⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 16c711 ok.asm

📁 pic系列单片机得控制程序 主要进行温度采集和转换控制
💻 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 + -