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

📄 password lock programme.asm

📁 这是一个密码锁控制程序,由单片机89s51实现,已经调试好了
💻 ASM
字号:
;LP1.ASM 8051 LCD PASSWORD 4
;8051 ASM USE:KELL
;COPYRIGHT CMY 2003
;
        KA EQU 0AH
        KB EQU 0BH
        KC EQU 0CH
        KD EQU 0DH
        KE EQU 0EH
        KF EQU 0FH

;变量定义
         PASS   EQU 30H
         PASSNEW  EQU 34H

        BUF_KEY EQU 4AH
        KEY_NO  EQU 4BH
        CO      EQU  4CH
        LCDE    EQU  4DH
        X       EQU 53H

        FKEY  EQU 20H.0
        ;LCD信号引脚定义
        EN EQU P0.1
        RS EQU P0.0

        SPK   EQU P3.4
        REL   EQU P3.5
        WLED  EQU P3.7
        ;
        ORG  0H
        JMP BEGIN
        ;
        BEGIN:
          CALL INIT_PORT
          CALL LED_BL
          CALL BZ
          CALL SET_LCD
          CALL MLOOP
          JMP $
          ;
          MESS: DB "LP1.ASM 8051 PASSWORD WITH LCD"
          PASS0: DB 1,2,3,4
          ;
          ;延时子程序
          DELAY:
            MOV R6,#50
          D1: MOV R7,#100
            DJNZ R7, $
            DJNZ R6,D1
            DJNZ R5,DELAY
            RET
          ;
          LED_BL:
            MOV R4,#6
          LE1: CPL WLED
            MOV R5,#3
            CALL DELAY
            DJNZ R4,LE1
            RET
            ;
            ;键盘按键编码
            TABLE_DIG:
            DB 0FH,0BH,00H,0AH
            DB 0EH,09H,08H,07H
            DB 0DH,06H,05H,04H
            DB 0CH,03H,02H,01H
            ;
            SCAN:
              MOV R3,#0FEH
              MOV R4,#0
              MOV R1,#4
              CLR PSW.5
            ;
            L1:
             MOV A,R3
             MOV P2,A
            ;
            MOV R5,#1
            CALL DELAY

            MOV A,P2
            ANL A,#0F0H
            MOV R2,#4
            ;
            L2:
              JB ACC.4, N1
              MOV KEY_NO, R4
              SETB PSW.5
            N1:
              INC R4
              RR A
              DJNZ  R2, L2
              ;
              MOV  A, R3
              RL A
              MOV R3,A
              DJNZ R1,L1
            ;
            BACK:
              JNB PSW.5,NO_KEY
                SETB FKEY
                RET
            NO_KEY:
              CLR FKEY
              RET
            ;
            SCAN_KEY:
              CLR FKEY
              CALL SCAN
              JB FKEY,WAIT_OFF
              RET
            WAIT_OFF:
              CALL SCAN
              JB FKEY,WAIT_OFF
              RET
             ;
           ;等待按键并传回按键码
           GET_KEY:
             CLR FKEY                ;清除按键标志
             CALL SCAN
             JB FKEY,G1
             JMP GET_KEY
           G1:
             CALL SCAN
             JB FKEY,G1
             MOV A,KEY_NO
             MOV DPTR,#TABLE_DIG
             MOVC A,@A+DPTR
             RET
           ;
           LOOK:
             MOV CO,#4
             MOV R0,#PASSNEW
           LO1:
             MOV A,@R0
             INC R0
             DJNZ CO,LO1
             RET
           ;
           CHECK_PASS:
             CALL IP_PASS
             CALL LOOK
           ;
           MOV CO,#4
           MOV R0,#PASS
           MOV DPTR,#PASS0
         CH1:
           MOV A,#0
           MOVC  A,@A+DPTR
           MOV B,@R0
           CJNE A,B,CH2
           INC DPTR
           INC R0
         ;
           DJNZ CO,CH1
           CALL OK
           CALL LED_BL
           CALL LED_BL
           RET
         CH2:
           JMP COMP
         ERROR:
           CALL ERR
           CALL LED_BL
           RET
         ;
         COMP:
           MOV CO,#4
           MOV R0,#PASS
           MOV R1,#PASSNEW
         C1:
           MOV A,@R0
           MOV B,@R1
           CJNE A,B,ERROR
           INC R0
           INC R1
         ;
           DJNZ CO,C1
           CALL OK
           CALL LED_BL
           CALL LED_BL
           RET
         ;
         IP_PASS:
           MOV DPTR,#M_IP
           MOV A,#2
           CALL LCD_PRINT  ;在LCD上显示执行信息

           MOV B,#9
           MOV CO,#4
           MOV R0,#PASS
         I1:
           CALL GET_KEY
           MOV @R0,A

           ADD A,#30H
           CALL LCDP2
           INC B
           INC R0
           DJNZ CO,I1
           RET
         ;
         OK:MOV DPTR,#M_OK
           MOV A,#2
           CALL LCD_PRINT
           CALL DOOR_OPEN
           RET
         ;
         ERR: MOV DPTR,#M_ERR
           MOV A,#2
           CALL LCD_PRINT
           CALL ALARM
           RET
         ;
         SLINE2:
           MOV DPTR,#LMESS2
           MOV A,#2
           CALL LCD_PRINT
           RET
         ;
         SET_PASS:
           MOV DPTR, #M_IP_NEW
           MOV A,#2
           CALL LCD_PRINT

           MOV B,#12
           MOV CO,#4
           MOV R0, #PASSNEW
         S1:
           CALL GET_KEY
           MOV @R0,A

           ADD A,#30H
           CALL LCDP2
           INC B
           INC R0
           DJNZ CO, S1
           RET
         ;
         M_IP:  DB "I/P PASS:....",0
         M_OK:  DB "PASSWORD OK !!!",0
         M_ERR: DB "PASSWORD ERROR !",0
         M_IP_NEW: DB "I/P NEWPASS:....",0
         ;
         LOOK_PASS:
           MOV B,#0
           MOV CO,#4
           MOV R0,#PASSNEW
         LL:
           MOV A,@R0
           ADD A,#30H
           CALL LCDP2
           INC R0
           INC B
           DJNZ CO,LL

           MOV R5,#100
           CALL DELAY
           CALL SLINE2
           RET
          ;
         RET_ON:SETB REL
         RET
         ;
         REL_OFF: CLR REL

                CLR SPK
         RET
         ;
         INIT_PORT:
           CALL REL_OFF
           RET
         ;
         DOOR_OPEN:
           CALL RET_ON
           MOV R5,#200
           CALL DELAY
           CALL REL_OFF
           RET
         ;
         ALARM:
           MOV R2,#3
         AL1: CALL LED_BL
           CALL BZ
           DJNZ R2,AL1
           RET
         ;
         BZ:
         SETB SPK
         MOV R5,#100
         CALL DELAY
         CLR SPK
           RET
         ;
       ;  DEL: MOV R7,#180
        ; DE1:NOP
         ;  DJNZ R7,DE1
          ; RET
         ;
         MLOOP:
         CALL GET_KEY
           ;比较是否为A键
           CJNE A,#KA,M1
           CALL SET_PASS
           CALL SLINE2
           JMP MLOOP
           ;比较是否为B键
           M1:CJNE A,#KB,M2
           CALL CHECK_PASS
           CALL SLINE2
           JMP MLOOP
         M2:
           JMP MLOOP
           RET
         ;
         SET_LCD:
         CLR EN; en=0
         CALL INIT_LCD
         MOV R5,#10
         CALL DELAY

         MOV  DPTR,#LMESS1
         MOV A,#1
         CALL LCD_PRINT

         MOV DPTR, #LMESS2
         MOV A,#2
         CALL LCD_PRINT
         RET

         ;
         LMESS1:DB "8051 PASSWORD   ",0
         LMESS2:DB "A OR B KEY....",0

         INIT_LCD1:
           MOV A,#28H      ;双列显示,字型使用5*7
           CALL WCOM
           MOV A,#0CH          ;光标出现,不闪烁
           CALL WCOM
           MOV A,#06H           ;每次向右移动一位,显示屏不移动
           CALL WCOM
           MOV A,#01H           ;清除LCD显示屏
           CALL WCOM
           RET
          ;
          LCD_PRINT:
            CJNE A,#1,LINE2        ;判断是否为第一行
          LINE1:   MOV A,#80H
               CALL WCOM
               CALL CLR_LINE
               MOV A,#80H
               CALL WCOM
               JMP FILL

          LINE2:MOV A,#0C0H
          CALL WCOM
          CALL CLR_LINE
          MOV A,#0C0H
          CALL WCOM
          FILL:
            CLR A
            MOVC A,@A+DPTR
            CJNE A,#0,LC1
            RET
          LC1:
            CALL WDATA
            INC DPTR
            JMP FILL
            RET
          ;
          CLR_LINE:
            MOV R0,#24
          CL1:
            MOV A,#' '
            CALL WDATA
            DJNZ R0,CL1
            RET

          DE:  MOV LCDE,#100    ;短暂延时
            DJNZ LCDE,$
            RET
          ;
          EN1:
            SETB EN
            CALL DE
            CLR EN
            CALL DE
            RET
          ;
          INIT_LCD:
            MOV P0,#30H
            CALL EN1
            MOV P0,#30H
            CALL EN1
            MOV P0,#30H
            CALL EN1

            MOV P0,#20H      ;启动四位接口指令
            CALL EN1
            CALL INIT_LCD1
            RET
          ;
          WCOM:                ;以四位控制方式将命令写至LCD
            MOV P0,A
            CLR RS
            CALL EN1
            RLC A
            RLC A
            RLC A
            RLC A

            MOV P0,A
            CLR RS
            CALL EN1
            RET
          ;
          WDATA:
            MOV P0,A          ;以四位控制方式将数据写入LCD
            SETB RS
            CALL EN1
            RLC A
            RLC A
            RLC A
            RLC A
            MOV P0,A
            SETB RS
            CALL EN1
            RET
          ;
          LCDP1:
            PUSH ACC
            MOV A,B
            ADD A,#80H
            CALL WCOM
            POP ACC
            CALL WDATA
            RET
          ;
          LCDP2:
            PUSH ACC
            MOV A,B
            ADD A,#0C0H
            CALL WCOM
            POP ACC
            CALL WDATA
            RET
          ;
            END





























⌨️ 快捷键说明

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