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

📄 key.asm

📁 Library for the 8051 microcontroller. such as math routine, hexBCD, LCD, Keyboard, I2C, Remote, Ke
💻 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 + -