📄 alarma.asm
字号:
list p=16f84
title "alarma"
#include "p16f84.inc"
__config _CP_OFF & _WDT_OFF & _XT_OSC
;****************************************************
;* DEFINE PASSWORDS *
;****************************************************
;default Password
defnum1 equ D'5'
defnum2 equ D'6'
defnum3 equ D'0'
defnum4 equ D'8'
;********************define times********************
shtime equ D'22'
drtime equ D'42'
;****************************************************
; define port
;**********************define PORTA******************
;--------------INPUTS--------------------------------
#define shock PORTA,0
#DEFINE doors PORTA,1
;--------------OUTPUTS-------------------------------
#define siren PORTA,2
#define lamp PORTA,3
#define periph PORTA,4
;**********************define PORTB******************
;--------------OUTPUTS--------------------------------
#define a tempD,1
#define b tempD,2
#define c tempD,3
;--------------INPUTS-------------------------------
#define in1 tempE,0
#define in2 tempE,1
#define in3 tempE,2
#define in4 tempE,3
;**********************define registers bits*********
#define banc STATUS,5
#define zero STATUS,2
#define globint INTCON,7
;****************************************************
; define registers and constant
;****************************************************
;*********************define constant****************
work equ D'0'
f equ D'1'
;interrupt configuration constant
begint equ B'00101000' ;TMR0 overfllow & RB port change
stbyint equ B'00010000' ;RB0/int
timeint equ B'00100000' ;TMR0 overflloow
waitint equ B'00001000' ;RB port change
;********************define registers****************
;new Password
numbegin equ H'0c'
num4 equ H'0d'
num3 equ H'0e'
num2 equ H'0f'
num1 equ H'10'
NumCount equ H'11'
DelayCount100s equ H'12'
DelayCountsec equ H'13'
numnumb equ H'16'
time equ H'17'
loopcount equ H'18'
w_temp equ H'19'
status_temp equ H'1a'
key_flag equ H'1b'
tempC equ H'1c'
tempD equ H'1d'
tempE equ H'1e'
denum4 equ H'21'
denum3 equ H'22'
denum2 equ H'23'
denum1 equ H'24'
;************define key_flag bits********************
#define timeout key_flag,0
#define correct key_flag,1
#define offal key_flag,2
#define RBch key_flag,3
#define nokey key_flag,4
#define passok key_flag,5
#define begduty key_flag,6
#define keyhit key_flag,7
;****************************************************
;* PROGRAM *
;****************************************************
org H'0'
goto start
SIR org H'4' ;INTERRUPT VECTOR
movwf w_temp
swapf STATUS,work
movwf status_temp
btfsc INTCON,T0IF
goto overint
btfsc INTCON,INTF
goto rb0int
btfsc INTCON,RBIF
goto rbifint
goto endSIR
;******************TMR0 overfllow interrupt**********
overint decfsz DelayCount100s,f
goto endSIR
movlw D'15'
movwf DelayCount100s
decfsz DelayCountsec,f
goto endSIR
bsf timeout ;yes time out
goto endSIR
;******************RB0 interrupt*********************
rb0int goto endSIR
;******************PORTB change interrupt************
rbifint bsf RBch
movf PORTB,work
endSIR bcf INTCON,T0IF
bcf INTCON,INTF
bcf INTCON,RBIF
swapf status_temp,work
movwf STATUS
movf w_temp,work
retfie
;********************Initialization******************
start bsf banc
movlw B'00000111' ;pull-up, interrupt on falling edge, internal clock
movwf OPTION_REG ;for TMR0, PS assigned to TMR0, TMR0 Rate 1:256
bcf globint
bcf banc
clrf PORTA
movlw B'00000011'
bsf banc
movwf TRISA
bcf banc
clrf PORTB
movlw B'11110001'
bsf banc
movwf TRISB
bcf banc
clrf PORTB
clrf key_flag
goto main
;****************************************************
;* SUBROUTINES *
;****************************************************
;*****program debounce (65ms-with check time)*****
debounce
btfsc timeout
goto enddeb
clrf INTCON
clrf TMR0
checkd btfss INTCON,T0IF
goto checkd
decfsz DelayCount100s,f
goto enddeb
movlw D'15'
movwf DelayCount100s
decfsz DelayCountsec,f
goto enddeb
bsf timeout ;yes time out
enddeb movlw timeint
movwf INTCON
retfie
;****************program DELAY-programable***********
delay bcf timeout
movlw timeint
movwf INTCON
bsf globint
deloop btfss timeout
goto deloop
bcf globint
return
;*****************program GetKeyValue****************
;***************determine column*********************
GetKeyValue
bcf nokey
clrf tempC
btfss a
goto rowdet
incf tempC,f
btfss b
goto rowdet
incf tempC,f
;****************determine row***********************
rowdet btfss in1
goto define
btfss in2
goto get456
btfss in3
goto get789
btfsc in4
goto endget
get10 bsf tempC,2
get789 bsf tempC,3
goto define
get456 bsf tempC,2
;*****************Get Key Value**********************
define movf tempC,work
addwf PCL,f
retlw D'1'
retlw D'2'
retlw D'3'
nop
retlw D'4'
retlw D'5'
retlw D'6'
nop
retlw D'7'
retlw D'8'
retlw D'9'
nop
retlw A'*'
retlw D'0'
retlw A'#'
endget bsf nokey
return
;*****************subroutine HITKEY******************
hitkey bcf timeout
bcf correct
movlw timeint
movwf INTCON
clrf TMR0
bsf globint
hitbeg movlw D'4'
movwf NumCount
hitloop bcf lamp
btfsc timeout
goto endkey
movlw B'11101111'
movwf tempD
nexthit movf PORTB,work
bcf INTCON,RBIF
bsf STATUS,0
rrf tempD,f
btfss tempD,0
goto hitloop
movf tempD,work
movwf PORTB
nop
nop
btfss INTCON,RBIF
goto nexthit
swapf PORTB,work
andlw B'00001111'
movwf tempE
bsf lamp
CA111 call GetKeyValue
btfsc nokey
goto hitloop
movwf numnumb
movf numbegin,work
addwf NumCount,work
movwf FSR
movf numnumb,work
movwf INDF
again call debounce
btfsc timeout
goto endkey
call debounce
btfsc timeout
goto endkey
comf PORTB,work
andlw B'11110000'
btfss zero
goto again
call debounce
btfsc timeout
goto endkey
call debounce
btfsc timeout
goto endkey
comf PORTB,work
andlw B'11110000'
btfss zero
goto again
decfsz NumCount,f
goto hitloop
corect bcf globint
bsf correct
return
endkey bcf globint
return
;******************program CHECKPASSWORD************
checkpassword
bcf passok
movf num1,work
xorwf denum1,work
btfss zero
goto endch
movf num2,work
xorwf denum2,work
btfss zero
goto endch
movf num3,work
xorwf denum3,work
btfss zero
goto endch
movf num4,work
xorwf denum4,work
btfsc zero
bsf passok
endch return
;********************program DUTY********************
duty btfss shock
goto alarmonsh
btfsc doors
goto duty
movlw D'15'
movwf DelayCount100s
movlw D'9'
movwf DelayCountsec
movlw H'20'
movwf numbegin
dutylp call hitkey
btfss correct
goto alarmondr
bsf globint
call checkpassword
btfsc passok
goto alarmoff
btfss timeout
goto dutylp
bcf globint
alarmonsh
movlw shtime
movwf loopcount
call alarm
goto stat
alarmondr
movlw drtime
movwf loopcount
call alarm
stat btfsc begduty
goto duty
alarmoff
return
;*****************program ALARM**********************
alarm bcf begduty
er1 movlw B'00011100'
movwf PORTA
call delayal
btfss keyhit
goto lp1
call deblock
btfsc offal
goto endst
goto er1
lp1 movlw B'00010100'
movwf PORTA
call delayal
btfss keyhit
goto lp2
call deblock
btfsc offal
goto endst
goto lp1
lp2 decfsz loopcount,f
goto alarm
movlw B'00010000'
movwf PORTA
btfss shock
goto begal
btfsc doors
goto endalar
movlw drtime
movwf loopcount
goto alarm
begal movlw shtime
movwf loopcount
goto alarm
endalar bsf begduty
endst return
;*****************program DEBLOCK********************
deblock bcf offal
bsf lamp
movlw B'11111101'
movwf PORTB
nop
nop
comf PORTB,work
andlw B'11110000'
xorlw B'10000000'
btfss zero
goto enddeb11
debag comf PORTB,work
andlw B'11110000'
btfss zero
goto debag
movlw D'15'
movwf DelayCount100s
movlw D'5'
movwf DelayCountsec
movlw H'20'
movwf numbegin
call hitkey
btfss correct
goto enddeb1
call checkpassword
btfsc passok
bsf offal
goto enddeb1
enddeb11
bsf lamp
clrf PORTB
nop
nop
comf PORTB,work
andlw B'11110000'
btfss zero
goto enddeb11
enddeb1 bcf lamp
return
;*******************program DELAYAL******************
delayal bcf timeout
bcf RBch
bcf keyhit
clrf TMR0
movlw D'11'
movwf DelayCount100s
movlw D'1'
movwf DelayCountsec
movlw H'ff'
movwf PORTB
movf PORTB,work
movlw begint
movwf INTCON
bsf globint
clrf PORTB
dla btfsc timeout
goto enddal
btfss RBch
goto dla
bsf keyhit
enddal bcf globint
return
;****************************************************
;* MAIN PROGRAM *
;****************************************************
main clrf key_flag
movlw D'15'
movwf DelayCount100s
movlw D'60'
movwf DelayCountsec
mainbeg movlw H'0c'
movwf numbegin
call hitkey
clrf PORTA
btfsc correct
goto standby1
;***************enter default password***************
defpass movlw defnum1
movwf num1
movlw defnum2
movwf num2
movlw defnum3
movwf num3
movlw defnum4
movwf num4
goto defstby
;***************default password is entered**********
standby1
movlw D'4'
movwf DelayCount100s
movlw D'1'
movwf DelayCountsec
bsf siren
bsf lamp
call delay
bcf siren
movlw D'11'
movwf DelayCount100s
movlw D'1'
movwf DelayCountsec
call delay
defstby1
clrf PORTA
movlw D'15'
movwf DelayCount100s
movlw D'1'
movwf DelayCountsec
call delay
defstby movlw D'4'
movwf DelayCount100s
movlw D'1'
movwf DelayCountsec
bsf siren
bsf lamp
call delay
bcf siren
movlw D'11'
movwf DelayCount100s
movlw D'1'
movwf DelayCountsec
call delay
clrf PORTA
;*******************prepare to sleep*****************
slpag clrf PORTB
comf PORTB,work
andlw B'11110000'
btfss zero
goto slpag
movf PORTB,work
movlw waitint
movwf INTCON
sleep
nop
clrf INTCON
movlw D'15'
movwf DelayCount100s
movlw D'3'
movwf DelayCountsec
call delay
comf PORTB,work
andlw B'11110000'
btfsc zero
goto slpag
;********************prepare to work*****************
standby movlw D'4'
movwf DelayCount100s
movlw D'1'
movwf DelayCountsec
bsf siren
bsf lamp
call delay
bcf siren
movlw D'11'
movwf DelayCount100s
movlw D'1'
movwf DelayCountsec
call delay
bcf lamp
movlw D'15'
movwf DelayCount100s
movlw D'1'
movwf DelayCountsec
call delay
bsf lamp
movlw D'11'
movwf DelayCount100s
movlw D'1'
movwf DelayCountsec
call delay
bcf lamp
;************************get DUTY********************
movlw D'15'
movwf DelayCount100s
movlw D'5'
movwf DelayCountsec
movlw H'20'
movwf numbegin
lpagain call hitkey
btfss correct
goto cadt
bsf globint
call checkpassword
btfsc passok
goto defstby
btfss timeout
goto lpagain
bcf globint
cadt bsf periph
movlw D'15'
movwf DelayCount100s
movlw D'3'
movwf DelayCountsec
call duty
clrf PORTA
movlw D'11'
movwf DelayCount100s
movlw D'1'
movwf DelayCountsec
call delay
goto defstby1
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -