📄 key.asm
字号:
;This is "THE DIGITAL CODE LOCK" Program which takes a 4-digit password
;from the user and compares it with the already saved password.
;If the password entered is correct then the LED GLOWS!!!!
;$ THE DOOR OPENS!!!!
;Otherwise if the password entered is incorrect then the message - "INCORRECT CODE"
;is displayed on the screen of the LCD.
;PIN P0.7 an LED is attached which glows as the lock opens!!!
MAIN : CLR P0.6
DB0 EQU P1.0
DB1 EQU P1.1
DB2 EQU P1.2
DB3 EQU P1.3
DB4 EQU P1.4
DB5 EQU P1.5
DB6 EQU P1.6
DB7 EQU P1.7
EN EQU P3.0
RS EQU P3.1
RW EQU P3.2
TEXT EQU P1
ACALL LCD_START
ACALL DELAY_3
ACALL LCD_DISPLAY
ACALL DELAY_3
MOV R1,#0H
MOV R3,#46 ;Use 46 instead of 2 in real program.
MOV TMOD,#10H
MOV TL1,#0H
MOV TH1,#0H
SETB TR1
CLR TF1
ACALL LOOP_START
LOOP_START:DEC R3
MOV TL1,#0H
MOV TH1,#0H
SETB TR1
CLR TF1
LOOP1: ACALL KEY ;Store value of digit at R1
SJMP GOTO
GOTO : JNB P0.1,KEY_DISPLAY
JNB TF1,LOOP1
CLR TF1
;SET TRO
;CALL LOOP_START
INC R3
DJNZ R3,LOOP_START
ACALL EXIT
KEY_DISPLAY:INC R1
MOV A,#1
CLR CY
SUBB A,R1
JZ DISPLAY1
;MOV R2,#46
;ACALL LOOP_START
MOV A,#2
CLR CY
SUBB A,R1
JZ DISPLAY2
;MOV R2,#46
;ACALL LOOP_START
MOV A,#3
CLR CY
SUBB A,R1
JZ DISPLAY3
;MOV R2,#46
;ACALL LOOP_START
MOV A,#4
CLR CY
SUBB A,R1
JZ DISPLAY4
;ACALL EXIT Control of EXIT is done by DISPLAY$
DISPLAY1:CLR P0.6
LCALL INIT_LCD
CLR RS ;PUT CURSOR AT THE STARTING OF THE SECOND LINE
MOV TEXT,#0C0h
SETB EN
CLR EN
LCALL WAIT_LCD
MOV A,R6
LCALL WRITE_TEXT
CJNE R6,#0EEH,DISPLAY22
;JNB P0.6,GOTO1
MOV R3,#46 ;Use 46 instead of 2 in real program.
ACALL LOOP_START
;RET
;GOTO1: CLR P0.6;ACALL LOOP
RET
DISPLAY22:SETB P0.6 ;To check if digit entered is wrong
;ACALL LOOP
MOV R3,#46 ;Use 46 instead of 2 in real program.
ACALL LOOP_START
RET
DISPLAY2:;MOV DPTR,
LCALL INIT_LCD
CLR RS ;PUT CURSOR AT THE STARTING OF THE SECOND LINE
MOV TEXT,#0C1h
SETB EN
CLR EN
LCALL WAIT_LCD
MOV A,R6
LCALL WRITE_TEXT
CJNE R6,#0EEH,DISPLAY33
;ACALL LOOP
;JNB P0.6,GOTO2
MOV R3,#46 ;Use 46 instead of 2 in real program.
ACALL LOOP_START
;RET
;GOTO2: CLR P0.6
RET
DISPLAY33:SETB P0.6
MOV R3,#46 ;Use 46 instead of 2 in real program.
ACALL LOOP_START
;ACALL LOOP
RET
DISPLAY3:LCALL INIT_LCD
CLR RS ;PUT CURSOR AT THE STARTING OF THE SECOND LINE
MOV TEXT,#0C2h
SETB EN
CLR EN
LCALL WAIT_LCD
MOV A,R6
LCALL WRITE_TEXT
CJNE R6,#0EEH,DISPLAY44
;ACALL LOOP
;JNB P0.6,GOTO3
MOV R3,#46 ;Use 46 instead of 2 in real program.
ACALL LOOP_START
RET
;GOTO3: CLR P0.6
; RET
DISPLAY44:SETB P0.6
MOV R3,#46 ;Use 46 instead of 2 in real program.
ACALL LOOP_START
;ACALL LOOP
RET
DISPLAY4:LCALL INIT_LCD
CLR RS ;PUT CURSOR AT THE STARTING OF THE SECOND LINE
MOV TEXT,#0C3h
SETB EN
CLR EN
LCALL WAIT_LCD
MOV A,R6
LCALL WRITE_TEXT
CJNE R6,#0EEH,DISPLAY55
;JNB P0.6,GOTO4
;RET
;GOTO4: CLR P0.6
ACALL CHECK
DISPLAY55:SETB P0.6
ACALL CHECK
CHECK:JNB P0.6,CORRECT
ACALL WRONG
CORRECT:CLR P0.7 ;CODE ENTERED ISCORRECT ....LED GLOWS....LOCK OPENS
LCALL INIT_LCD
LCALL CLEAR_LCD
MOV A,#'C'
LCALL WRITE_TEXT
MOV A,#'O'
LCALL WRITE_TEXT
MOV A,#'R'
LCALL WRITE_TEXT
MOV A,#'R'
LCALL WRITE_TEXT
MOV A,#'E'
LCALL WRITE_TEXT
MOV A,#'C'
LCALL WRITE_TEXT
MOV A,#'T'
LCALL WRITE_TEXT
MOV A,#' '
LCALL WRITE_TEXT
MOV A,#' '
LCALL WRITE_TEXT
MOV A,#'C'
LCALL WRITE_TEXT
MOV A,#'O'
LCALL WRITE_TEXT
MOV A,#'D'
LCALL WRITE_TEXT
MOV A,#'E'
LCALL WRITE_TEXT
CLR RS ;PUT CURSOR AT THE STARTING OF THE SECOND LINE
MOV TEXT,#0C0h
SETB EN
CLR EN
LCALL WAIT_LCD
LCALL INIT_LCD
MOV A,#'D'
LCALL WRITE_TEXT
MOV A,#'O'
LCALL WRITE_TEXT
MOV A,#'O'
LCALL WRITE_TEXT
MOV A,#'R'
LCALL WRITE_TEXT
MOV A,#' '
LCALL WRITE_TEXT
MOV A,#' '
LCALL WRITE_TEXT
MOV A,#'O'
LCALL WRITE_TEXT
MOV A,#'P'
LCALL WRITE_TEXT
MOV A,#'E'
LCALL WRITE_TEXT
MOV A,#'N'
LCALL WRITE_TEXT
MOV A,#'S'
LCALL WRITE_TEXT
ACALL DELAY_3
ACALL EXIT
WRONG:;Code entered is incorrest
LCALL INIT_LCD
LCALL CLEAR_LCD
MOV A,#'I'
LCALL WRITE_TEXT
MOV A,#'N'
LCALL WRITE_TEXT
MOV A,#'C'
LCALL WRITE_TEXT
MOV A,#'O'
LCALL WRITE_TEXT
MOV A,#'R'
LCALL WRITE_TEXT
MOV A,#'R'
LCALL WRITE_TEXT
MOV A,#'E'
LCALL WRITE_TEXT
MOV A,#'C'
LCALL WRITE_TEXT
MOV A,#'T'
LCALL WRITE_TEXT
MOV A,#' '
LCALL WRITE_TEXT
MOV A,#' '
LCALL WRITE_TEXT
MOV A,#'C'
LCALL WRITE_TEXT
MOV A,#'O'
LCALL WRITE_TEXT
MOV A,#'D'
LCALL WRITE_TEXT
MOV A,#'E'
LCALL WRITE_TEXT
ACALL DELAY_3
ACALL EXIT
RET
LCD_START:LCALL INIT_LCD
LCALL CLEAR_LCD
MOV A,#'D'
LCALL WRITE_TEXT
MOV A,#'I'
LCALL WRITE_TEXT
MOV A,#'G'
LCALL WRITE_TEXT
MOV A,#'I'
LCALL WRITE_TEXT
MOV A,#'T'
LCALL WRITE_TEXT
MOV A,#'A'
LCALL WRITE_TEXT
MOV A,#'L'
LCALL WRITE_TEXT
MOV A,#' '
LCALL WRITE_TEXT
MOV A,#' '
LCALL WRITE_TEXT
MOV A,#'L'
LCALL WRITE_TEXT
MOV A,#'O'
LCALL WRITE_TEXT
MOV A,#'C'
LCALL WRITE_TEXT
MOV A,#'K'
LCALL WRITE_TEXT
RET
LCD_DISPLAY:LCALL INIT_LCD
LCALL CLEAR_LCD
MOV A,#'E'
LCALL WRITE_TEXT
MOV A,#'N'
LCALL WRITE_TEXT
MOV A,#'T'
LCALL WRITE_TEXT
MOV A,#'E'
LCALL WRITE_TEXT
MOV A,#'R'
LCALL WRITE_TEXT
MOV A,#' '
LCALL WRITE_TEXT
MOV A,#' '
LCALL WRITE_TEXT
MOV A,#'C'
LCALL WRITE_TEXT
MOV A,#'O'
LCALL WRITE_TEXT
MOV A,#'D'
LCALL WRITE_TEXT
MOV A,#'E'
LCALL WRITE_TEXT
MOV A,#' '
LCALL WRITE_TEXT
MOV A,#':'
LCALL WRITE_TEXT
MOV A,#' '
LCALL WRITE_TEXT
CLR RS ;PUT CURSOR AT THE STARTING OF THE SECOND LINE
MOV TEXT,#0C0h
SETB EN
CLR EN
LCALL WAIT_LCD
MOV A,#'*'
LCALL WRITE_TEXT
MOV A,#'*'
LCALL WRITE_TEXT
MOV A,#'*'
LCALL WRITE_TEXT
MOV A,#'*'
LCALL WRITE_TEXT
;CLR RS ;PUT CURSOR AT THE STARTING OF THE SECOND LINE
;MOV TEXT,#0CAh
;SETB EN
;CLR EN
;LCALL WAIT_LCD
RET
;CJNE R0,#4H,LOOP
;ACALL CHECK
DELAY_3:MOV R4,#46
;MOV R4,#5 ;This statement is for test only.Correct statement is the previous one.
ACALL DELAY_
RET
DELAY_ :MOV TMOD,#01H
MOV TL0,#0H
MOV TH0,#0H
SETB TR0
CLR TF0
JNB TF0,$
DJNZ R4,DELAY_
RET
INIT_LCD: CLR RS
MOV TEXT,#38h
SETB EN
CLR EN
LCALL WAIT_LCD
CLR RS
MOV TEXT,#0Eh
SETB EN
CLR EN
LCALL WAIT_LCD
CLR RS
MOV TEXT,#06h
SETB EN
CLR EN
LCALL WAIT_LCD
RET
CLEAR_LCD:CLR RS
MOV TEXT,#01h
SETB EN
CLR EN
LCALL WAIT_LCD
RET
WAIT_LCD:CLR EN ;Start LCD command
CLR RS ;It's a command
SETB RW ;It's a read command
MOV TEXT,#0FFh ;Set all pins to FF initially
SETB EN ;Clock out command to LCD
MOV A,TEXT ;Read the return value
;CLR ACC.7 ;TEST Statement Remove for main prog.
JB ACC.7,WAIT_LCD ;If bit 7 high, LCD still busy
CLR EN ;Finish the command
CLR RW ;Turn off RW for future commands
RET
WRITE_TEXT:SETB RS
MOV TEXT,A
SETB EN
CLR EN
LCALL WAIT_LCD
RET
KEY: CLR P0.1
;CLR P0.0
MOV R7,#50 ;It should be 50 instead of 2 in real program.
ACALL SCANKEYPAD
RET
SCANKEYPAD:MOV R0,#07FH
MOV R4,#0H
;MOV R6,R0
SETB P0.1
SCAN:SETB P0.1
MOV A,R0
RL A
MOV R2,P2
MOV R5,P2
MOV R0,A
ANL A,R5
CLR CY
SUBB A,R5
JZ DEBOUNCE
INC R4
CJNE R4,#4,SCAN
ACALL NOKEYPRESSED
RET
DEBOUNCE:DEC R7
CJNE R7,#49,CHK ;It should be 49 instead of 1 for real prog.
SETB P0.0
INC R7
MOV A,R5
MOV R6,A
DJNZ R7,SCANKEYPAD
ACALL KEYPRESSED
RET
CHK: MOV A,R6
CLR cy
SUBB A,R2
JZ SCANKEY
ACALL NOKEYPRESSED
RET
SCANKEY:INC R7
DJNZ R7,SCANKEYPAD
ACALL KEYPRESSED
RET
KEYPRESSED:;MOV P2,R5
CLR P0.1
ACALL EXIT1
RET
NOKEYPRESSED:NOP
CLR P0.2
ACALL EXIT1
RET
EXIT1:NOP
;ACALL GOT0
RET
EXIT:NOP
LCALL INIT_LCD
LCALL CLEAR_LCD
MOV A,#'E'
LCALL WRITE_TEXT
MOV A,#'N'
LCALL WRITE_TEXT
MOV A,#'D'
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -