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

📄 mima.asm

📁 51加24c02 4*4矩阵键盘 密码锁
💻 ASM
字号:
//51密码锁源码测试通过 沈建 2008
org 0000h
ajmp mian

mian:
     acall lbaa
     mov mrd,#40h     ;读密码送显示
      mov numbyt,#6
      mov ad24c01,#0
      acall  RDNBYT
     acall lbaa
     acall rpass
     mov 30h,#0
     mov 31h,#0
     mov 3fh,#6
     mov 33h,#40h
 abc01:
       acall keytest1
       cjne a,#0eh,mmsr
       mov 30h,#1
       ajmp abc01
 mmsr:cjne a,#0fh,mmsr1
      mov a,30h           ;是否修改密码
      cjne a,#3,mmxd2
        acall wpass        ;写密码
        mov 41h,#0fh         ;写密码显示2位显示f
        mov 30h,#0
        ajmp abc01
  mmxd2:mov r0,#40h
      mov r1,#46h
      mov r7,#6
  mmxd:mov a,@r0
       mov b,@r1
       inc r0
       inc r1
       cjne a,b,mmerr
       djnz r7,mmxd
       acall lbaa
       mov a,30h
       cjne a,#1,mmxd1   ;
       mov 30h,#3
       ajmp abc01
   mmxd1:cjne a,#0,abc01  ;密码正确
         mov 43h,#0fh     ;密码开锁3位显示f
          ajmp abc01
 mmsr1:mov r0,33h
       mov @r0,a
       djnz 3fh,mmsr2
       mov 3fh,#6
       mov 33h,#40h
       ajmp abc01
  mmsr2:inc 33h
       ajmp abc01
mmerr:acall lbaa
      acall lbaa
      acall lbaa
      acall lbaa
      acall lbaa
      mov 40h,#0eh
      mov 41h,#0eh
      ajmp abc01        
keytest1:acall display   ;读取键盘输入
         acall keytest
         mov a,key
         cjne a,#0ffh,keytest1f
         ajmp keytest1             
  keytest1f:ret
  
  
wpass:mov mtd,#40h     ;写密码
      mov numbyt,#6
      mov ad24c01,#0
      acall WRNBYT
      ret



rpass:mov mrd,#46h     ;读密码
      mov numbyt,#6
      mov ad24c01,#0
      acall  RDNBYT
      ret
       



;         |-s6--e--|     |--s7--7--|  |--s8--4--|   |--s9--1--|
;px.0  ---+--------------+------------+-------------+         |
;                  |               |            |             |
;         |-s10-0--|     |--s11-8--|  |--s12-5--|   |--s13-2--|
;px.1 ----+--------------+------------+-------------+         |
;                  |               |            |             |
;         |-s14-f--|     |--s15-9--|  |--s16-6--|   |--s17-3--|
;px.2-----+--------------+------------+-------------+         |
;                  |               |            |             |
;         |-s18-d--|     |--s19-c--|  |--s20-b--|   |--s21-a--|
;px.3-----+--------------+------------+-------------+         |
;                  |               |            |             |
;px.4--------------+               |            |             |
;                                  |            |             |
;px.5------------------------------+            |             |
;                                               |             |
;px.6-------------------------------------------+             |
;                                                             |
;px.7---------------------------------------------------------+
;aoke51 4*4键盘扫描程序
  key equ 3bh   ;键盘返回键值
  keyp equ p3   ;键盘端口定义
  keytest: mov keyp,#0fh
       mov a,keyp
       cjne a,#0fh,keynx   ;判断是否有键按下
       mov key,#0ffh
       ret
   keynx:acall keyys   ;延时程序
       mov a,keyp
       cjne a,#0fh,keynx1       ;判断是否误动作
       ret
   keynx1:mov key,#0ffh
          mov keyp,#7fh
          mov a,keyp
          anl a,#0fh
          cjne a,#0fh,key1
          mov keyp,#0bfh
          mov a,keyp
          anl a,#0fh
          cjne a,#0fh,key2
          mov keyp,#0dfh
          mov a,keyp
          anl a,#0fh
          cjne a,#0fh,key3
          mov keyp,#0efh
          mov a,keyp
          anl a,#0fh
          cjne a,#0fh,key4

    keyerr:mov key,#0ffh
          ret
          key1: cjne a,#0eh,kye12
                mov key,#1
                ajmp keysf
            kye12:cjne a,#0dh,key13
                  mov key,#2
                  ajmp keysf
            key13:cjne a,#0bh,key14
                  mov key,#3
                  ajmp keysf
            key14:cjne a,#07h,keyerr
                  mov key,#0ah
                  ajmp keysf
           key2: cjne a,#0eh,kye22
                mov key,#4
                ajmp keysf
            kye22:cjne a,#0dh,key23
                  mov key,#5
                  ajmp keysf
            key23:cjne a,#0bh,key24
                  mov key,#6
                  ajmp keysf
            key24:cjne a,#07h,keyerr
                  mov key,#0bh
                  ajmp keysf
           key3:cjne a,#0eh,kye32
                mov key,#7
                ajmp keysf
            kye32:cjne a,#0dh,key33
                  mov key,#8
                  ajmp keysf
            key33:cjne a,#0bh,key34
                  mov key,#9
                  ajmp keysf
            key34:cjne a,#07h,keyerr
                  mov key,#0ch
                  ajmp keysf
            key4:cjne a,#0eh,kye42
                mov key,#0eh
                ajmp keysf
            kye42:cjne a,#0dh,key43
                  mov key,#0
                  ajmp keysf
            key43:cjne a,#0bh,key44
                  mov key,#0fh
                  ajmp keysf
            key44:cjne a,#07h,keyerr
                  mov key,#0dh
                  ajmp keysf
         keysf:   mov keyp,#0fh
                 mov a,keyp
                 anl a,#0fh
                 cjne a,#0fh,keysfn
             lbaa:mov r6,#255  ;喇叭
             bbb:mov r7,#255
             bba:djnz r7,bba
                 cpl p2.3
                 djnz r6,bbb
                 setb p2.3
                 ret
          keysfn:acall display
                 ajmp keysf
 keyys:mov r7,#9
 keyys02:      mov r6,#255
 keyys01:djnz r6,keyys01
         djnz r7,keyys02
         ret


sda bit  p2.0    ; 数据线定义
scl bit  p2.1    ; 时钟线定义
SLAW  equ  0a0h  ;
slar  equ  0a1h  ;
MRD   equ 3eh    ; 读数据首地址
MTD   equ 3dh    ; 写数据首地址
NUMBYT equ 3ch   ; 读写数据位数
ad24c01 equ 3fh  ;储存器地址


;<<<<<<<<<<<<<<<<<<<<<<<<<I2C 软件包

;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<START
STA:SETB    SDA
    SETB    SCL
    NOP
    NOP
    CLR     SDA
    NOP
    NOP
    CLR     SCL
    RET
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<STOP
     STOP:CLR     SDA
          SETB    SCL
          NOP
          NOP
          SETB    SDA
          NOP
          NOP
          CLR     SCL
          RET
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<MACK
      MACK:CLR     SDA
           SETB    SCL
           NOP
           NOP
           CLR     SCL
           SETB    SDA
       RET
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<MNACK
     MNACK:SETB    SDA
           SETB    SCL
           NOP
           NOP
           CLR     SCL
           CLR     SDA
        reT
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<CACK
      CACK:SETB    SDA
           SETB    SCL
           CLR     F0
           MOV     C,SDA
           JNC     CEND
           SETB    F0
     CEND:CLR     SCL
          NOP
          RET

;*************************************************************************
;*
;* 名称:WRBYT
;* 功能:写一个字节到IIC ,不包括START,STOP操作
;* 调用函数:
;* 输入:A=要写的值
;*      输出:
;* 使用寄存器:R7,A,C
;*
;*************************************************************************

      WRBYT:MOV     R7, #08H
            WLP:    RLC     A
            MOV     SDA, C
            SETB    SCL
            NOP
            NOP
            NOP
            CLR  SCL
            DJNZ    R7, WLP
         RET
;*************************************************************************
;*
;* 名称:WRNBYT
;* 功能:写N个数到IIC
;* 调用函数:WRBYT,STA,CACK,STOP
;* 输入:NUMBYT=输出数个数,AD24C01=24C01的片内地址,MTD的值;
;*  输出:输出数在从MTD开始的缓冲区中
;* 使用寄存器:R7,A,C,R1,R0
;*
;*************************************************************************

WRNBYT:LCALL   STA
       MOV     R0,NUMBYT
       MOV     A,#SLAW
       LCALL   WRBYT
       LCALL   CACK
       JB      F0, WRNBYT
       MOV     A,AD24C01
       LCALL   WRBYT
       LCALL   CACK
       JB      F0,     WRNBYT
       MOV     R1, MTD
   WRDA: MOV     A, @R1
       LCALL   WRBYT
       LCALL   CACK
       JB      F0, WRNBYT
       INC     R1
       DJNZ    R0, WRDA
       LCALL   STOP
      RET
;*************************************************************************
;*
;* 名称:RDBYT
;* 功能:从IIC中读一个字节到单片机中
;* 调用函数:
;* 输入:
;*      输出:A=要读的值
;* 使用寄存器:R7,A,C
;*
;*************************************************************************
    RDBYT:MOV     R7, #08H
    RLP:SETB    SDA
        SETB    SCL
        NOP
        NOP
        MOV     C,       SDA
        RLC     A
        CLR     SCL
        NOP
        NOP
        DJNZ    R7, RLP
        RET
;*************************************************************************
;*
;* 名称:RDNBYT
;* 功能:从IIC中读N个数到单片机中
;* 调用函数:WRBYT,STA,CACK,STOP
;* 输入:NUMBYT=从IIC中读出数个数,AD24C01=24C01的片内地址, MRD的值;
;*  输出:读入数在从#MRD开始的缓冲区中
;* 使用寄存器:R7,A,C,R1,R0
;*
;*************************************************************************
     RDNBYT:LCALL   STA
            MOV     R0,     NUMBYT
            MOV     A,      #SLAW
            LCALL   WRBYT
            LCALL   CACK
            JB      F0, RDNBYT
            MOV     A,AD24C01
            LCALL   WRBYT
            LCALL   CACK
            JB      F0,     RDNBYT
          LCALL   STA
          MOV     A,#SLAR
          LCALL   WRBYT
          LCALL   CACK
          JB      F0,    RDNBYT
          MOV     R1,      MRD
 RDDA:LCALL   RDBYT
      MOV     @R1,    A
      DJNZ    R0,     ACK
      LCALL   MNACK
      LCALL   STOP
       RET
  ACK:LCALL   MACK
      INC     R1
      SJMP    RDDA
      ret



;AOKE51 led显示程序 显示数据40h-46h
dula bit P2.6;led显示器数据锁存
wela bit P2.7;led显示器位数锁存


delayxms:mov r4,#4         ;r4,r5,r6用于延时  r6为参数x  延时1*x ms
delaya: mov r5,#40
        nop
        nop
        djnz r5,$
        djnz r4,delaya
        djnz r6,delayxms
        ret ;延时返回

display: mov r2,#06h  ;显示程序
         mov r1,#40h
         mov b,#0feh
         MOV DPTR,#TABLE
    dispnx:clr dula;
         mov a,@r1
         MOVC a,@A+DPTR
         mov p0,a ;
         setb dula;
         clr dula;

         clr wela;
         mov P0,b;
         setb wela;
         clr wela;
         mov r6,#5h
         call delayxms
         mov a,b
         rl a       ;显示位数移动一位
         mov b,a
         inc r1      ;显示地址加1
         djnz  r2,dispnx
         ret         ;六位显示完成返回
table:db   3fh,06h,5bh,4fh,66h,6dh,7dh,07h,
      db   7fh,6fh,77h,7ch,39h,5eh,79h,71h

⌨️ 快捷键说明

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