51单片机的LCD1602液晶屏密码锁汇编程序
;说 明:首先显示器提示输入密码,密码在12.5S内输入有效, RS BIT P2.7 RW BIT P2.6 E BIT P2.5 ENTER BIT 22H.0 OPEN BIT P3.6 SPEAK BIT P3.7 PASSBUF EQU 40H KEYNUMBER EQU 41H ;存放识别后的按键号 AJMP MAIN ORG 0003H JMP KEY_INT ORG 000BH AJMP INTT0 ORG 001BH AJMP INTT1 ORG 0030H MOV 42H,#200 ;设定报警的时间,42H单元里的数*50MS ;45H为定时器0中断次数 MOV 47H,#250 ;输入密码时间设定,50MS倍数 CLR OPEN CLR SPEAK ;初始化输出设备 CLR ENTER ;标志位初始化 MOV TMOD,#11H ;定时器工作方式2 MOV TH0,#3CH ;初值50MS MOV TL0,#0BH MOV TL1,#0BH SETB EA MOV TCON,#00000000B ;电平触发 MOV R1,#31H DJNZ R0,SS1 ;将输入密码缓冲单元清零 MOV P1,#0FH ;初始化按键口 CLR 20H ;报警标志清零 ACALL LINE1 ;在第一行显示 MOV DPTR,#MES_P ;显示请输入密码 ACALL DISPLAY JNB ENTER,KEYIN ;等待ENTER按下 CLR ENTER MOV DPTR,#PASS MOV R4,30H ;密码的长度 MOV A,#0 MOV R1,#31H MOVC A,@A+DPTR MOV PASSBUF,A ;取出系统设定的密码 MOV A,@R1 ;从31号单元开始取出输入的密码 CJNE A,PASSBUF,ERR ;比较 MOV A,R5 INC A INC R1 ;取下一位 DJNZ R4,LOOP ACALL ENABLE ;清屏,光标复位 ACALL LINE1 ;从第一行开始显示 MOV DPTR,#MES_C ACALL DISPLAY ;显示"请进" SETB OPEN ;开门 MOV R6,43H ACALL DELAY JMP START MOV R6,#03H ACALL DELAY MOV A,#01H ACALL ENABLE ACALL LINE1 MOV DPTR,#MES_E ACALL DISPLAY ;显示错误 MOV R6,#40H ACALL DELAY CJNE A,#03H,EE0 push psw acall delay10ms ;延时消抖 SETB TR1 ;启动定时器 ACALL SMKEY ;按键识别 ACALL BACK ;按键发声 MOV R3,A CJNE R3,#0BH,K1 ;ENTER是否按下 SETB ENTER AJMP KEY_RTN MOV @R1,A ;将输入的密码存入缓冲单元 INC R1 ;修改地址 ACALL WRDATA ;输入一位显示一个"*" pop acc RETI MOV A,P1 MOV P1,#0F0H NOP NOP MOV A,P1 CPL A RET
; 输入次三次错误报警10S,输入正确开门,7秒后返回初态
; 以上参数均可在主程序里设定,修改系统密码在程序的结尾
ORG 0000H
;========== 主程序开始 ==============
MAIN: MOV 30H,#07H ;输入密码为7位 最高只可设15位
MOV 43H,#250 ;设定开门时间 14的倍数(实际上液晶显示器执行指令占用了时间,开门时间会比14*250MS大)
;44H号单元存放输入错误的次数
;46H为定时器1中断次数
MOV SP,#60H
MOV TH1,#3CH
SETB ET0
SETB ET1
START: MOV R0,30H
SS1: MOV @R1,#00H
INC R1
MOV R1,#31H ;从31号单元开始存放按建输入的密码
CLR 21H ;密码超时标志
MOV 46H,#00H ;超时后对定时器中断次数清零,便于下一轮重新计时
INIT: ACALL SELLCD ;设定液晶工作方式
setb EX0 ;开中断,允许键盘输入
KEYIN: JB 21H,ERR ;超时转到错误程序
clr EX0 ;密码输入完后锁定键盘
;当使用边沿触发时用上面的指令为什么禁止不了中断???
;========== 密码判断程序 ============
COMP:
LOOP: MOV R5,A
;正确
MATCH: MOV A,#01H
ACALL LINE2
MOV DPTR,#TAB_1
ACALL DISPLAY
MOV 44H,#00H ;输入错误次数清零
CLR OPEN ;复位
;错误
ERR: ACALL BACK
ACALL BACK ;输错提示音,鸣两下
INC 44H
MOV A,44H
EE0: JC ERROUT ;输错不到三次返回
MOV 44H,#00H ;清零
ACALL WRANING ;报警
ERROUT: JMP START
;=========== 按键中断服务程序 ==========
KEY_INT:push acc
clr ex0
MOV A,KEYNUMBER ;返回按键号
clr tr1 ;按下确认后关毕定时器
mov 46h,#00h ;对中断次数清零
K1: ADD A,#30H ;将按键号转换为ASCⅡ码
KEY_RTN:pop psw
setb ex0
;=========== 按键识别程序 ==========
SMKEY:
ANL A,#0FH
WKEY: MOV B,A ;反转法查询
NOP
MOV A,P1
ANL A,#0F0H
ORL A,B
MOV P1,#0FH ;还原P1口初态
CJNE A,#0EEH,WKEY1
MOV KEYNUMBER,#00H
AJMP RETURN
WKEY1: CJNE A,#0EDH,WKEY2
MOV KEYNUMBER,#01H
AJMP RETURN
WKEY2: CJNE A,#0EBH,WKEY3
MOV KEYNUMBER,#02H
AJMP RETURN
WKEY3: CJNE A,#0E7H,WKEY4
MOV KEYNUMBER,#03H
AJMP RETURN
WKEY4: CJNE A,#0DEH,WKEY5
MOV KEYNUMBER,#04H
AJMP RETURN
WKEY5: CJNE A,#0DDH,WKEY6
MOV KEYNUMBER,#05H
AJMP RETURN
WKEY6: CJNE A,#0DBH,WKEY7
MOV KEYNUMBER,#06H
AJMP RETURN
WKEY7: CJNE A,#0D7H,WKEY8
MOV KEYNUMBER,#07H
AJMP RETURN
WKEY8: CJNE A,#0BEH,WKEY9
MOV KEYNUMBER,#08H
AJMP RETURN
WKEY9: CJNE A,#0BdH,WKEY10
MOV KEYNUMBER,#09H
AJMP RETURN
WKEY10: CJNE A,#0BbH,WKEY11
MOV KEYNUMBER,#0AH
AJMP RETURN
WKEY11: CJNE A,#0B7H,RETURN
MOV KEYNUMBER,#0BH ;判断哪个键按下,返回相应按键号码
RETURN: MOV P1,#0FH
ANL A,#0FH
JNZ RETURN ;等待按键松开

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW
或用微信扫描左侧二维码
相关文章
-
嵌入式系统 2016-11-28