单片机密码锁汇编
时间: 2023-07-24 15:11:50 浏览: 148
毕业论文-源代码- 51单片机实现电子密码锁汇编(设计代码、仿真)论文字数:5296字.zip
5星 · 资源好评率100%
好的,下面是一个单片机密码锁的汇编实现,您可以参考:
```assembly
ORG 0H
MOV P2, #01H ; P2 置 1,表示初始状态
MOV DPTR, #PASSWORD ; 设置密码的地址
MOVX A, @DPTR ; 读取第一个密码字符
MOV P0, #PROMPT ; 输出提示信息
CALL DELAY ; 延时
LOOP:
MOV A, P1 ; 读取键盘状态
ANL A, #0F0H
CJNE A, #0F0H, $ ; 判断是否有按键按下,如果没有则循环
MOV A, P1 ; 读取键盘状态
ANL A, #0F0H
CJNE A, #0F0H, $ ; 判断是否有按键松开,如果没有则循环
MOV R2, #10 ; 延时计数器
JNB P1.4, $ ; 判断是否按下第一行第一列,如果是则跳转
MOV P0, #01H ; 输出 1
SJMP WAIT_RELEASE ; 等待按键松开
$:
JNB P1.5, $ ; 判断是否按下第一行第二列,如果是则跳转
MOV P0, #02H ; 输出 2
SJMP WAIT_RELEASE ; 等待按键松开
$:
JNB P1.6, $ ; 判断是否按下第一行第三列,如果是则跳转
MOV P0, #03H ; 输出 3
SJMP WAIT_RELEASE ; 等待按键松开
$:
JNB P1.7, $ ; 判断是否按下第一行第四列,如果是则跳转
MOV P0, #0AH ; 输出 A
SJMP WAIT_RELEASE ; 等待按键松开
$:
JNB P1.0, $ ; 判断是否按下第二行第一列,如果是则跳转
MOV P0, #04H ; 输出 4
SJMP WAIT_RELEASE ; 等待按键松开
$:
JNB P1.1, $ ; 判断是否按下第二行第二列,如果是则跳转
MOV P0, #05H ; 输出 5
SJMP WAIT_RELEASE ; 等待按键松开
$:
JNB P1.2, $ ; 判断是否按下第二行第三列,如果是则跳转
MOV P0, #06H ; 输出 6
SJMP WAIT_RELEASE ; 等待按键松开
$:
JNB P1.3, $ ; 判断是否按下第二行第四列,如果是则跳转
MOV P0, #0BH ; 输出 B
SJMP WAIT_RELEASE ; 等待按键松开
$:
JNB P1.4, $ ; 判断是否按下第三行第一列,如果是则跳转
MOV P0, #07H ; 输出 7
SJMP WAIT_RELEASE ; 等待按键松开
$:
JNB P1.5, $ ; 判断是否按下第三行第二列,如果是则跳转
MOV P0, #08H ; 输出 8
SJMP WAIT_RELEASE ; 等待按键松开
$:
JNB P1.6, $ ; 判断是否按下第三行第三列,如果是则跳转
MOV P0, #09H ; 输出 9
SJMP WAIT_RELEASE ; 等待按键松开
$:
JNB P1.7, $ ; 判断是否按下第三行第四列,如果是则跳转
MOV P0, #0CH ; 输出 C
SJMP WAIT_RELEASE ; 等待按键松开
$:
WAIT_RELEASE:
JNB P1.4, WAIT_RELEASE
JNB P1.5, WAIT_RELEASE
JNB P1.6, WAIT_RELEASE
JNB P1.7, WAIT_RELEASE
MOV R2, #100 ; 延时计数器
CALL DELAY ; 延时
MOV A, P0 ; 读取输出值
JB P2.0, PASSWORD_OK ; 判断是否已经输入完成,如果是则跳转到 PASSWORD_OK 标签
MOV R1, #4 ; 设置密码位数
MOV DPTR, #INPUT ; 设置输入值的地址
MOVX @DPTR, A ; 存储输入值
INC DPTR
DJNZ R1, $ ; 继续输入
MOV DPTR, #INPUT ; 设置输入值的地址
MOV R1, #4 ; 设置密码位数
CHECK:
MOVX A, @DPTR ; 读取输入的密码
MOV R0, A ; 存储到 R0 中
MOVX A, @DPTR ; 读取输入的密码
CJNE A, #PASSWORD+R1-4, CHECK_FAIL ; 判断输入的密码是否和设置的密码一致,如果不一致则跳转到 CHECK_FAIL 标签
INC DPTR
DJNZ R1, CHECK ; 继续比对
SJMP PASSWORD_OK ; 如果比对成功则跳转到 PASSWORD_OK 标签
CHECK_FAIL:
MOV P2, #FFH ; 输出 1
SJMP WAIT_RELEASE ; 等待按键松开
PASSWORD_OK:
MOV P2, #00H ; 输出 0
MOV DPTR, #INPUT ; 设置输入值的地址
MOV R1, #4 ; 设置密码位数
CLEAR_INPUT:
CLR A ; 清空输入值
MOVX @DPTR, A
INC DPTR
DJNZ R1, CLEAR_INPUT ; 继续清空
SJMP WAIT_RELEASE ; 等待按键松开
DELAY:
DELAY_LOOP:
DJNZ R2, DELAY_LOOP
RET
PASSWORD: DB "1234" ; 设置密码
INPUT: DB 4 DUP(?) ; 存储输入的密码
PROMPT: DB "Please input password:" ; 提示信息
END
```
这段代码实现了类似的功能,通过扫描键盘获取用户输入的密码,并与设置的密码进行比对,如果正确则输出 0,否则输出 1。您可以根据自己的需要进行修改,比如可以将密码存储在 EEPROM 中,以便永久保存。
阅读全文