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

📄 alarma.asm

📁 example for alarm devise with PIC16F84
💻 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 + -