📄 thermometer.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 + -