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

📄 main.asm

📁 该代码是实现PIC单片机电子密码锁功能的完整代码
💻 ASM
字号:
	list p=16f877,R=DEC
	include "p16f877.inc"
A_reg	equ	32
B_reg	equ	33
C_reg	equ	34
TempFSR	equ	35
AI_reg	equ	36
BI_reg	equ	37
CI_reg	equ	38
TempD	equ	39
Count_reg	equ	40
Value_reg	equ	41
Temp	equ	42
Delay1_reg	equ	43
Delay2_reg	equ	44
IsChanging	equ	45
NumOfErr	equ	46
W_Temp	equ	47
STATUS_Temp	equ	48
Scaler	equ	49
;;;;;;;;;User Reset Vector;;;;;;;;;
		org	0x00
		nop
		goto	MainLine
;;;;;;;;;Interrupt Vector;;;;;;;;;
		org	0x04
		goto IntService
;;;;;;;;;Interrupt Server Routine;;;;;;;;;
IntService
		banksel W_Temp
		movwf 	W_Temp
		swapf	STATUS,w
		movwf	STATUS_Temp
		btfsc	PIR1,TMR1IF
		call	Timer1
		swapf	STATUS_Temp,w
		movwf	STATUS
		swapf	W_Temp,f
		swapf	W_Temp,w
		retfie
;;;;;;;;;Timer1 Subroutine;;;;;;;;;
Timer1
		banksel	PIR1
		bcf		PIR1,TMR1IF
		decf	Scaler,f
		clrf	TMR1L
		movlw	0x3c
		movwf	TMR1H
		movlw	0x50
		movwf	TMR1L
		return
;;;;;;;;;Main Program;;;;;;;;;
MainLine
		call	Initial
MainLoop
;;;light locked LED;;;
		banksel	NumOfErr
		movlw	0x05
		subwf	NumOfErr,w
		btfsc	STATUS,Z
		goto	SoundAlarm
		banksel	PORTE
		movlw	0x02
		movwf	PORTE
;;;turn	off	7SEG-LED;;;
		movlw	0xff
		movwf	PORTC
		movlw	0x0f
		movwf	PORTD
		movlw	0xff
		movwf	AI_reg
		movwf	BI_reg
		movwf	CI_reg

		call	Polling
		goto	MainLoop
;;;Sound Alarm for trying;;;
SoundAlarm
		movlw	0x00
		movwf	NumOfErr
		movlw	0xff
		movwf	Temp
LoopAlarm
		movlw	0x07
		movwf	PORTE
		call	Delay4ms
		decfsz	Temp
		goto	LoopAlarm
		goto	MainLoop
;;;;;;;;;Initial;;;;;;;;;
Initial
;;;Initialize Port Control Here;;;
		banksel	TRISB
		movlw 0xff
		movwf	TRISB
		movlw	0x00
		movwf	TRISC
		movwf	TRISD
		movwf	TRISE
;;;Initialize Register Here;;;
		banksel	AI_reg
		movlw	0xff
		movwf	AI_reg
		movwf	BI_reg
		movwf	CI_reg

		movlw	0x00
		movwf	Count_reg
		movwf	Value_reg
		movwf	Temp
		movwf	IsChanging
;;;Read Last Modified Password;if not set,Password is '8888'
		call	RDEPROM
;;;Set Number of Error to 0
		movlw	0x00
		movwf	NumOfErr
;;;Set Scaler To 200;;;
		movlw	200
		movwf	Scaler
;;;Initialze Timer1;;;;
		banksel	T1CON
		clrf	T1CON
		clrf	TMR1H
		clrf	TMR1L
		clrf	INTCON
		bsf		INTCON,PEIE
		banksel	PIE1
		clrf	PIR1
		bsf		PIE1,TMR1IE
		banksel	PIR1
		clrf	PIR1
		clrf	TMR1L
		movwf	0x3c
		movwf	TMR1H
		movlw	0x50
		movwf	TMR1L
		bsf		INTCON,GIE
		return
;;;;;;;;;RDEPROM;;;;;;;;;
RDEPROM
		banksel EEADR
		movlw	0x10
		movwf	EEADR
		banksel	EECON1
		bcf		EECON1,EEPGD
		bsf		EECON1,RD
		banksel	EEDATA
		movf	EEDATA,W
		banksel	A_reg
		movwf	A_reg
		banksel	EEADR
		movlw	0x11
		movwf	EEADR
		banksel	EECON1
		bcf		EECON1,EEPGD
		bsf		EECON1,RD
		banksel	EEDATA
		movf	EEDATA,W
		banksel	B_reg

		movwf	B_reg
		banksel	EEADR
		movlw	0x12
		movwf	EEADR
		banksel	EECON1
		bcf		EECON1,EEPGD
		bsf		EECON1,RD
		banksel	EEDATA
		movf	EEDATA,W
		banksel	C_reg
		movwf	C_reg
		return
;;;;;;;;;Polling the keyboard input;;;;;;;;;
Polling
;;;any key pressed;;;
		call	CheckKeyPressed
		btfsc	STATUS,Z
;;;Here might be an Error;;;
		goto	Polling
		call	Delay4ms
		call	CheckKeyPressed
		btfsc	STATUS,Z
		goto	Polling
		call	KeyTable
		movlw	0x0a
		subwf	Temp,w
		btfsc	STATUS,Z
		goto	SetModifyFlag
;;;Check Range;;;
		btfss	STATUS,C
		goto	SameProcess
		goto	Polling
;;;Set Flag for Changing password and Lighting the Changing LED;;;
SetModifyFlag
		banksel	PORTE
		movlw	0x04
		movwf	PORTE
		movlw	0x01
		movwf	IsChanging
;;;Input password;;;
SameProcess
		call	InputPassword
		call	Delay4ms
		call	Delay4ms
		call	Delay4ms
;;;Check Password;;;
		call	CheckPassword

;;;If Wrong;;;
		btfss	STATUS,Z
		goto	WrongPassword
		goto	RightPassword
WrongPassword
		banksel	NumOfErr
;;;;;;;;;Chesk Whether is Time out;;;;;
		movf	Scaler,f
		btfsc	STATUS,Z
		goto	EndPolling
		movlw	201
		subwf	Scaler,w
		btfsc	STATUS,C
		goto	EndPolling

		movlw	0x01
		addwf	NumOfErr,f
		movlw	0x00
		movwf	IsChanging
		goto	EndPolling
RightPassword
;;;Set Nmber Of Error to 0;;;
		banksel	NumOfErr
		movlw	0x00
		movwf	NumOfErr
;;;If Changing Password,Inputing New Password;;;
		btfss 	IsChanging,0
		goto	UnLock
;;;ligting the 1111<Debug only>;;;
		banksel	PORTC
		movlw	0x11
		movwf	PORTC
		movlw	0x01
		movwf	PORTD
		movwf	AI_reg
		movwf	BI_reg
		movwf	CI_reg
		call	InputNewPassword
		call	WriteEPROM
;;;lighting the 0000<Debug only>;;;
		banksel	PORTC
		movlw	0x99
		movwf	PORTC
		movlw	0x09
		movwf	PORTD
;;;return to default setting;;;
		banksel	IsChanging
		movlw	0x00
		movwf	IsChanging
		movwf	Count_reg
		goto	EndPolling
;;;If not Changing Paddword,lighting the unlocked LED;;;
UnLock
		banksel	PORTE
		movlw	0x01
		movwf	PORTE
		movlw	0X88
		movwf	PORTC
		movlw	0x08
		movwf	PORTD
;;;Check Whether Press Unlock key;;;
CheckUnlock
;;;any key pressed;;;
		call	CheckKeyPressed
		btfsc	STATUS,Z
;;;Here might be an Error;;;
		goto	CheckUnlock
		call	Delay4ms
		call	CheckKeyPressed
		btfsc	STATUS,Z
		goto	CheckUnlock
		call	KeyTable
		movlw	0x0b
		subwf	Temp,w
		btfsc	STATUS,Z
		goto	CheckUnlock
EndPolling
		return

;;;;;;;;;Check Key Pressed;;;;;;;;;
;;;Return Value 0(Z=1) for none pressed;;;
CheckKeyPressed
		banksel	PORTD
		movlw	0x0f
		andwf	PORTD,f

		movf	PORTB,w
		movwf	Temp
		movlw	0x0f
		andwf	Temp,f
		subwf	Temp,w
		return

;;;;;;;;;KeyTable;;;;;;;;;
;;;Return Value is in Temp ranging from 1 to16 includeing 25;;;
;;;which indicate an Error;;;
KeyTable
		banksel	Delay1_reg
		movlw	0x04
		movwf	Delay1_reg
		movlw	0x0f
		andwf	PORTD,f
		movlw	0xe0
		movwf	TempD
		iorwf	PORTD,f
KeyTablePolling
		movf	PORTB,w
		movwf	Temp
		movlw	0x04
		movwf	Delay2_reg
RowPolling
		bcf		STATUS,C
		rrf		Temp,f
		btfss	STATUS,C
		goto	EndKeyTablePolling
		decfsz	Delay2_reg
		goto	RowPolling
		bcf		STATUS,C
		rlf		TempD,f
		btfss	STATUS,C
		bcf		TempD,4
		bsf		TempD,4
		movlw	0x0f
		andwf	PORTD,f
		movf	TempD,w
		iorwf	PORTD,f
		decfsz	Delay1_reg,f
		goto	KeyTablePolling
EndKeyTablePolling
;;;Delay1_reg is Column Index,and Delay2_reg is Row Index;;;
		movlw	0x05
		movwf	Temp
		movf	Delay1_reg,w
		subwf	Temp,w
		movwf	Delay1_reg
;;;index=Delay1_reg+(Delay2_reg-1)*Delay1_reg;;;
		movlw	0x05
		movwf	Temp
		movf	Delay2_reg,w
		subwf	Temp,w
		movwf	Delay2_reg
;;;Set Temp=0;;;
		movlw	0x00
		movwf	Temp
PollingMutiply
		decfsz	Delay1_reg
		goto	DoMutiply
		goto	EndMutiply
DoMutiply
		movlw	0x04
		addwf	Temp,f
		goto	PollingMutiply
EndMutiply
;;;End Mutiplying and add Column Index;;;
		movf	Delay2_reg,w
		addwf	Temp,f
;;;for'0';;;
		movlw	0x01
		subwf	Temp,f
		return
;;;;;;;;;InputPassword;;;;;;;;;
InputPassword
		banksel	Temp
		btfss	IsChanging,0
		goto	Input
		bcf		T1CON,TMR1ON
		movlw	200
		movwf	Scaler
		bsf		T1CON,TMR1ON
InputEx
		movf	Scaler,f
		btfsc	STATUS,Z
		goto	EndInputPassword
;;;any key pressed;;;
		call	CheckKeyPressed
		btfsc	STATUS,Z
;;;Here might be an Error;;;
		goto	InputEx
		call	Delay4ms
		call	CheckKeyPressed
		btfsc	STATUS,Z
		goto	InputEx
		call	KeyTable
		movlw	0x0c
		subwf	Temp,w
		btfsc	STATUS,Z
		goto	EndInputPassword
		movlw	0x0a
		subwf	Temp,w
;;;Check Range;;;
		btfsc	STATUS,C
		goto	InputEx
Input
		bcf		T1CON,TMR1ON
		movlw	200
		movwf	Scaler
		bsf		T1CON,TMR1ON
		movwf	36
		movwf	TempFSR
		movf	TempFSR,w
		movwf	FSR
;;;Store First Input and set Count_reg;;;
		movf	Temp,w
		movwf	INDF
		movlw	0x02
		movwf	Count_reg
;;;UpdateLEDOutput;;;
		call	UpdateLEDOutput

PollingInputPassword
;;;any key pressed;;;
		movf	Scaler,f
		btfsc	STATUS,Z
		goto	EndInputPassword
		call	CheckKeyPressed
		btfsc	STATUS,Z
		goto	PollingInputPassword
		call	Delay4ms
		call	CheckKeyPressed
		btfsc	STATUS,Z
		goto	PollingInputPassword
		call	KeyTable
		movlw	0x0c
		subwf	Temp,w
		btfsc	STATUS,Z
		goto	BackSpace
		movlw	0x0a
		subwf	Temp,w
		btfsc	STATUS,C
		goto	PollingInputPassword
		bcf		T1CON,TMR1ON
		movlw	200
		movwf	Scaler
		bsf		T1CON,TMR1ON

		movf	TempFSR,w
		addlw	0x01
		movwf	TempFSR
		movwf	FSR
		movf	Temp,w
		movwf	INDF
		call	UpdateLEDOutput
		decfsz	Count_reg
		goto	PollingInputPassword
		goto	EndInputPassword
BackSpace
		bcf		T1CON,TMR1ON
		movlw	200
		movwf	Scaler
		bsf		T1CON,TMR1ON

		movlw	0x03
		subwf	Count_reg,w
		btfsc	STATUS,Z
		goto	EndInputPassword
		movf	TempFSR,w
		movwf	FSR
		movlw	0xff
		movwf	INDF
		movlw	0x01
		addwf	Count_reg,f
		movlw	0x01
		subwf	TempFSR,f
		call	UpdateLEDOutput
		goto	PollingInputPassword
EndInputPassword
		bcf		T1CON,TMR1ON
		return

;;;;;;;;;Update LED Output in terms of Keyboard Input;;;;;;;;;
UpdateLEDOutput
;;;Following For <Debug Only>;;;
		banksel	AI_reg
		movf	AI_reg,w
		andlw	0x0f
		movwf	Temp
		swapf	BI_reg
		andlw	0xf0
		iorwf	Temp,f
		movf	Temp,w
		movwf	PORTC
		movf	CI_reg,w
		movwf	Temp
		movlw	0x0f
		andwf	Temp,w
		movwf	PORTD
EndUpdate
		return

;;;;;;;;;Check Password;;;;;;;;;
CheckPassword
		banksel	A_reg
;;;Check AI_reg;;;
		movf	A_reg
		subwf	AI_reg,w
		btfss	STATUS,Z
		goto	EndCheck
;;;Check BI_reg;;;
		movf	B_reg
		subwf	BI_reg,w
		btfss	STATUS,Z
		goto	EndCheck
;;;Check CI_reg;;;
		movf	C_reg
		subwf	CI_reg,w
		btfss	STATUS,Z
		goto	EndCheck
EndCheck
		return
;;;;;;;;;Input New Password;;;;;;;;;
InputNewPassword
		banksel	Temp
		movlw	36
		movwf	TempFSR
		movf	TempFSR,w
		movwf	FSR
		movlw	0x03
		movwf	Count_reg

PollingInputNewPassword

;;;any key pressed;;;
		call	CheckKeyPressed
		btfsc	STATUS,Z
		goto	PollingInputNewPassword
		call	Delay4ms
		call	CheckKeyPressed
		btfsc	STATUS,Z
		goto	PollingInputNewPassword
		call	KeyTable

		movlw	0x0c
		subwf	Temp,w
		btfsc	STATUS,Z
		goto	BackSpaceNew

		movlw	0x0a
		subwf	Temp,w
		btfsc	STATUS,C
		goto	PollingInputNewPassword

		movf	TempFSR,w
		movwf	FSR
		movf	Temp,w
		movwf	INDF
		movf	TempFSR,w
		addlw	TempFSR
		movwf	FSR

		call	UpdateLEDOutput
		decfsz	Count_reg
		goto	PollingInputNewPassword
		goto	EndInputNewPassword
BackSpaceNew
		movlw	0x03
		subwf	Count_reg,w
		btfsc	STATUS,Z
		goto	PollingInputNewPassword
		movlw	0x01
		subwf	TempFSR,f
		movf	TempFSR,w
		movwf	FSR
		movlw	0x01
		movwf	INDF
		movlw	0x01
		addwf	Count_reg,f
		call	UpdateLEDOutput
		goto	PollingInputNewPassword
EndInputNewPassword
		return
;;;;;;;;WriteEPROM;;;;;;;;;
WriteEPROM

;;;Write AI_reg;;;
		movlw	0x10
		movwf	Temp
		movf	AI_reg,w
		movwf	A_reg
		movwf	Value_reg
		call	WriteEPROM_Parameters

;;;Write BI_reg;;;
		movlw	0x11
		movwf	Temp
		movf	BI_reg,w
		movwf	B_reg
		movwf	Value_reg
		call	WriteEPROM_Parameters

;;;Write CI_reg;;;
		movlw	0x12
		movwf	Temp
		movf	CI_reg,w
		movwf	C_reg
		movwf	Value_reg
		call	WriteEPROM_Parameters

		return

;;;;;;;;;WriteEPROM Accepts Temp and Value_reg ad a parameter;;;;;;;;;
;;;Here Temp is Address and Value_reg is Value;;;
WriteEPROM_Parameters

		banksel	Temp
		movf	Temp,w
		banksel	EEADR
		movwf	EEADR

		banksel	Value_reg
		movf	Value_reg,w
		banksel	EECON1
		bsf		EECON1,EEPGD
		bsf		EECON1,GIE
		movlw	0x55
		movwf	EECON2
		movlw	0xaa
		movwf	EECON2
		bsf		EECON1,WR
		bsf		INTCON,GIE
		banksel	PIR2
Wait_EEIF
		btfss	PIR2,EEIF
		goto	Wait_EEIF
		bcf		PIR2,EEIF
		bcf		EECON1,WREN
		banksel	Value_reg
		return
;;;;;;;;;Delay 4ms;;;;;;;;;
Delay4ms
		banksel	Delay1_reg
		movlw	0xff
		movwf	Delay1_reg
		clrf	Delay2_reg
Loop4ms
		decfsz	Delay2_reg
		goto	Loop4ms
		decfsz	Delay1_reg
		goto	Loop4ms
		return
;;;;;;;;;Main Exit;;;;;;;;;
		END

⌨️ 快捷键说明

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