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

📄 thermometer.asm

📁 This program reads from an sensor the temperature and display it on three leds-segment. It uses mic
💻 ASM
字号:
	processor 16F876

		LIST	P=16F876
		
		INCLUDE	<P16f876.inc>

		__config 3932
		

PDel0		EQU	0x21
PDel1		EQU	0x22

ASCII_H		EQU	0x25
ASCII_M		EQU	0x26                 
ASCII_L		EQU	0x27 
HEXADECIMAL	EQU	0x28

Temp1		equ	0x29
Temp2		equ	0x2A
temp		equ	0x2B

INNER		equ	0x2C
OUTER		equ	0x2D
INNER2		equ	0x2E
stdel		equ	0x2F
stdel1		equ	0x30

;----------------------------------------------------------------------------

		org 	0x00		;RESET VECTOR
		goto 	INIT

		org 	0x05		;INTERRUPT VECTOR		


;INITIALIZE
INIT		bcf	STATUS,RP0	;bank 0
		bcf	STATUS,RP1
		
		clrf	PORTA
		bsf	STATUS,RP0	;banK 1
			
		clrf	TRISB
		clrf	TRISC
		
		bcf	STATUS,RP0	;bank 0
		
		clrf	PORTA
		clrf	PORTB
		clrf	PORTC

				
START           call    LCD_INI         ;??????p???s? LCD                
START_1         movlw   0x01		;Clear screen,cursor at home position          
                call    LCD_REG                                     
                movlw   0x06		;Cursor move right                           
                call    LCD_REG                                     
                movlw   0x0C		;LCD On,cursor Off         
                call    LCD_REG                                     
                movlw   0x80            ;???t?? ?a?a?t??a? ??????
                call    LCD_REG                           

;####Config analog conversion####

CFGADC		bsf	STATUS,RP0	;Bank 1
		bcf	STATUS,RP1
		
		movlw	b'10001111'	;Right justified,type of conv
		movwf	ADCON1
		movlw	b'11111111'
		movwf	TRISA		;PORTA=input
		
		bcf	STATUS,RP0	;Bank 0
		movlw	b'01000001'	;Fosc/8,Input:AN0,A/D on
		movwf	ADCON0
		bcf	PIR1,ADIF	;Clear A/D converter interrupt flag bit
			
;---------------------------------------------------------------------------
startmsg	
		movlw	0x84		;Cursor at 84
		call	LCD_REG
		movlw	'M'
		call    LCD_DATA
		movlw	'A'
		call    LCD_DATA
		movlw	'D'
		call    LCD_DATA
		movlw	'E'
		call    LCD_DATA
		movlw	0x20
		call    LCD_DATA
		movlw	'B'
		call    LCD_DATA
		movlw	'Y'
		call    LCD_DATA
		movlw	':'
		call    LCD_DATA
		movlw	0xC0
		call	LCD_REG
		movlw	'C'
		call    LCD_DATA
		movlw	'h'
		call    LCD_DATA
		movlw	'r'
		call    LCD_DATA
		movlw	'i'
		call    LCD_DATA
		movlw	's'
		call    LCD_DATA
		movlw	0x20
		call    LCD_DATA
		movlw	'a'
		call    LCD_DATA
		movlw	'n'
		call    LCD_DATA
		movlw	'd'
		call    LCD_DATA
		movlw	0x20
		call    LCD_DATA
		movlw	'K'
		call    LCD_DATA
		movlw	'o'
		call    LCD_DATA
		movlw	's'
		call    LCD_DATA
		movlw	't'
		call    LCD_DATA
		movlw	'a'
		call    LCD_DATA
		movlw	's'
		call    LCD_DATA

		movlw	d'200'
		movwf	stdel
		movlw	d'3'
		movwf	stdel1
		
stdel_0
		call    DELAY_5MS
stdel_1
		decfsz	stdel,F
		goto	stdel_0
stdel_2
		decfsz	stdel1,F
		goto	stdel_0

		call    LCD_INI         ;Initialise LCD                
		movlw   0x01		;Clear screen,cursor at home position          
                call    LCD_REG                                     
                movlw   0x06		;Cursor move right                           
                call    LCD_REG                                     
                movlw   0x0C		;LCD On,cursor Off         
                call    LCD_REG                                     
                movlw   0x80            ;Cursor at 80
                call    LCD_REG

msg		call	RUN_ADC
		movlw	0x80
		call	LCD_REG
		movlw	'T'
		call    LCD_DATA
		movlw	'e'
		call    LCD_DATA
		movlw	'm'
		call    LCD_DATA
		movlw	'p'
		call    LCD_DATA
		movlw	'e'
		call    LCD_DATA
		movlw	'r'
		call    LCD_DATA
		movlw	'a'
		call    LCD_DATA
		movlw	't'
		call    LCD_DATA
		movlw	'u'
		call    LCD_DATA
		movlw	'r'
		call    LCD_DATA
		movlw	'e'
		call    LCD_DATA
		movlw	0x20
		call    LCD_DATA
		movlw	'C'
		call    LCD_DATA

		movlw	d'5'
		call	delay

beep
		movlw	d'40'
		subwf	temp,w
		btfss	STATUS,C
      		goto    no_beep
		movlw	d'200'
		movwf	stdel
beep0
		bsf	PORTC,4
		call	del_42mics
		bcf	PORTC,4
		call	del_42mics
		decfsz	stdel,F
		goto	beep0
		
no_beep
		goto 	msg
		
;---------------------------------------------------------------------------

RUN_ADC
		clrf	temp		
		clrf	Temp1
		bsf	STATUS,RP0
		clrf	Temp2
		
		bcf	STATUS,RP0	;Bank 0
		bcf	STATUS,RP1
		movlw	b'01000001'
		movwf	ADCON0
		bcf	PIR1,ADIF	;Clear flag(conv not complete)
		bsF	INTCON,PEIE
		bsf	INTCON,GIE
		bcf	STATUS,RP0		
		
GO_ADC		
		bsf	ADCON0,GO_DONE	;Init conversion
		call    DELAY_5MS
		call    DELAY_5MS
		call    DELAY_5MS
		call    DELAY_5MS

wait_ADC	
		btfsc	ADCON0,GO_DONE	;Wait for end of conversion
		goto	wait_ADC
		bcf	ADCON0,ADON
		bsf	STATUS,RP0
		bcf	PIE1,ADIE
		bcf	STATUS,RP0
		
metatropi				;Conversion result in ADRESH:ADRESL
		movf	ADRESH,w
		movwf	Temp1
		bsf	STATUS,RP0	;Bank1
		bcf	STATUS,RP1
		movf	ADRESL,w
		movwf	Temp2
		bcf	STATUS,RP0
		btfsc	Temp1,1
		call	Adder9
		btfsc	Temp1,0
		call	Adder8
		bsf	STATUS,RP0
		btfsc	Temp2,7
		call	Adder7
		bsf	STATUS,RP0
		btfsc	Temp2,6
		call	Adder6
		bsf	STATUS,RP0
		btfsc	Temp2,5
		call	Adder5
		bsf	STATUS,RP0
		btfsc	Temp2,4
		call	Adder4
		bsf	STATUS,RP0
		btfsc	Temp2,3
		call	Adder3
		bsf	STATUS,RP0
		btfsc	Temp2,2
		call	Adder2
		bsf	STATUS,RP0
		btfsc	Temp2,1
		call	Adder1
		bsf	STATUS,RP0
		btfsc	Temp2,0
		call	Adder0
		goto	telos
Adder9
		movlw	D'248'
		movwf	temp
		return
Adder8
		movlw	D'124'
		addwf	temp,f
		return
Adder7
		bcf	STATUS,RP0
		movlw	D'62'
		addwf	temp,f
		return
Adder6
		bcf	STATUS,RP0
		movlw	D'31'
		addwf	temp,f
		return
Adder5
		bcf	STATUS,RP0
		movlw	D'15'
		addwf	temp,f
		return
Adder4
		bcf	STATUS,RP0
		movlw	D'8'
		addwf	temp,f
		return
Adder3
		bcf	STATUS,RP0
		movlw	D'4'
		addwf	temp,f
		return
Adder2
		bcf	STATUS,RP0
		movlw	D'3'
		addwf	temp,f
		return
Adder1
		bcf	STATUS,RP0
		movlw	D'2'
		addwf	temp,f
		return
Adder0
		bcf	STATUS,RP0
		movlw	D'1'
		addwf	temp,f
		return
telos
		bcf	STATUS,RP0

;####Show in lcd####	
inLCD		
		movf	temp,w
		call 	Hex_Ascii
		bcf	STATUS,RP0	;bank 0
		bcf	STATUS,RP1
		bcf	STATUS,Z
		movf	ASCII_H,w
                xorlw   0x30
                btfsc   STATUS,Z		
                goto	zero
		movlw	0xC8
		call	LCD_REG
		movf	ASCII_H,W
                call    LCD_DATA	;Show character
zero  		
		movlw	0xC9
		call	LCD_REG
		movf	ASCII_M,W
                iorlw   0x00
                btfss   STATUS,Z
		call    LCD_DATA
		movlw	0xCA
		call	LCD_REG
                movf	ASCII_L,W
		call    LCD_DATA
		call	DELAY_5MS
		call	DELAY_5MS

		
		return

Hex_Ascii				;Metatropi
		movf	temp,w
		movwf	HEXADECIMAL
      		clrf    ASCII_H
      		clrf    ASCII_M
      		clrf    ASCII_L
EKATO
      		movlw  	D'100'          ;W=D'100' -> W
      		subwf   HEXADECIMAL,W   ;HEXADECIMAL - D'100' -> W
      		btfss	STATUS,C        ;If W < 0 iparxei ekatontada 
      		goto    DEKA		;a W >= 0 pigaine stis dekades
      		movwf   HEXADECIMAL     ;
      		incf    ASCII_H,F       ;ekatontades
      		goto    EKATO		;
DEKA
      		movlw   D'10'
      		subwf   HEXADECIMAL,W
      		btfss	STATUS,C
      		goto	ENA
      		movwf   HEXADECIMAL
      		incf    ASCII_M,F
      		goto    DEKA
ENA
      		movf    HEXADECIMAL,W
      		movwf   ASCII_L
      		clrf    HEXADECIMAL

Bcd_To_Ascii
      		movlw 	H'30'           ;metatropi BCD se ASCII
      		iorwf   ASCII_L,F
      		iorwf   ASCII_M,F
      		movf    ASCII_H,F       ;ASCII_H -> F
      		btfsc   STATUS,Z        ;ASCII_H = 0?
      		goto    KENO
      		movlw   H'30'           ;H'30' -> W
      		iorwf   ASCII_H,F       ;metatropi BCD se ASCII
      		return
KENO
		movlw   '0'
		movwf   ASCII_H
		return


;####Commands for LCD####
LCD_E           
		bsf     PORTC,2         ;E=1
                nop
                nop
                nop
                bcf     PORTC,2         ;E=0
                return
LCD_BUSY        
		bsf     PORTC,1         ;R/W=1(read)
                bsf     STATUS,RP0      ;Bank 1
                movlw   0xFF  
                movwf   TRISB
                bcf     STATUS,RP0      ;Bank 0
                bsf     PORTC,2         ;E=1
                nop
L_BUSY          
		btfsc   PORTB,7         ;Check busy flag
                goto    L_BUSY          ;If 1 check again
                bcf     PORTC,2         ;E=0
                bsf     STATUS,RP0      ;Bank 1
                clrf    TRISB           ;Port B=output
                bcf     STATUS,RP0      ;Bank 0
                bcf     PORTC,1         ;R/W=0(write)
                return        
                              
LCD_REG         
		bcf     PORTC,0         ;RS=0(command)
                movwf   PORTB
                call    LCD_BUSY
                goto    LCD_E           ;Generate pulse in E
                              
LCD_DATA	
		bcf     PORTC,0         ;RS=0
                movwf   PORTB
                call    LCD_BUSY
                bsf     PORTC,0         ;RS=1
                goto    LCD_E           ;Generate pulse in E
                              
LCD_INI         
		movlw   0x038
                call    LCD_REG
                call    DELAY_5MS
                movlw   0x038
                call    LCD_REG
                call    DELAY_5MS
                movlw   0x038
                call    LCD_REG
                call    DELAY_5MS
                return
                              
;--------------------------------------------------------------------------
                                        
DELAY_5MS  	movlw   .6        	; 1 set number of repetitions (B)
        	movwf   PDel0     	; 1 |
PLoop1  	movlw   .207      	; 1 set number of repetitions (A)
       	 	movwf   PDel1     	; 1 |
PLoop2 		nop              	; 1 clear watchdog
        	decfsz  PDel1, 1  	; 1 + (1) is the time over? (A)
        	goto    PLoop2    	; 2 no, loop
        	decfsz  PDel0,  1 	; 1 + (1) is the time over? (B)
        	goto    PLoop1    	; 2 no, loop
PDelL1  	goto	PDelL2      	; 2 cycles delay
PDelL2  	nop              	; 1 cycle delay
        	return              	; 2+2 Done

;---------------------------------------------------------------------------

del_1ms		movlw	d'199'		;delay 1mS
		movwf	INNER
in_lp		nop
		nop
		decfsz	INNER,F
		goto	in_lp
		return

;---------------------------------------------------------------------------

delay		movwf	OUTER		;1mS
out_lp		call	del_1ms
		decfsz	OUTER,F
		goto	out_lp
		return

;---------------------------------------------------------------------------		
del_42mics	movlw	d'6'		;delay 42micS
		movwf	INNER2
in_lp42		nop
		nop
		decfsz	INNER2,F
		goto	in_lp42
		return

		END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -