晶振 LCD显示 按键 2 1 5 12MHz 12864 三、软件设计
首先编程实现电子密码锁的功能,然后单独实现控制LCD的初始化和各项控制,两部分功能实现后进行相互嵌套调用即可融合在一起。
程序清单
ORG 0000H AJMP MAIN ORG 0013H AJMP INT_1 RS BIT P2.2 RW BIT P2.1 EN BIT P2.0 CS1 BIT P2.4 CS2 BIT P2.3 DAT EQU 40H COM EQU 41H PAG EQU 42H LINE EQU 43H COLUMN EQU 44H ONOFF EQU 45H SCREEN EQU 46H ORG 0100H
MAIN: MOV SP,#60H SETB IT1 SETB EA
MOV 30H,#01 ;赋初值 MOV 31H,#02 MOV 32H,#03
MOV R3,#00 ;输入密码正确数 MOV R7,#03H
L0: MOV P1,#7FH ;点亮红灯表示锁住
MOV R0,#50H ;输入的密码存放区的首地址 CLR EX1
MOV R1,#00 ;可以输入三个密码 ACALL Initlcd
ACALL Clearscreen ACALL Set_line
MOV SCREEN,#1 MOV PAG,#2 MOV COLUMN,#0 ACALL DISPLAY LJMP D3 SJMP $
SR: CJNE R1,#03,L1 ;判断是否输入三个密码 L6: JB P1.0,$ ;确定键是否按下 ACALL DEL_10MS JB P1.0,L6 JNB P1.0,$
LCALL JY ;开始校验密码
MOV P1,#0BFH ;点亮绿灯表示打开
SETB EX1 ;密码正确后开中断表示可以修改密码 ACALL Clearscreen ACALL ZQ
LCALL DEL_5S ;5秒后不打开自动关闭 CJNE R3,#02,L0 ;允许输入三次 L1:JB P1.1,L2 ;第一个按键 ACALL DEL_10MS JB P1.1,L1 JNB P1.1,$ ACALL XH LCALL PRE_1 SJMP SR
L2:JB P1.2,L3 ;第二个按键 ACALL DEL_10MS JB P1.2,L2 JNB P1.2,$ ACALL XH
LCALL PRE_2 SJMP SR
L3:JB P1.3,L1 ;第三个按键 ACALL DEL_10MS JB P1.3,L3 JNB P1.3,$ ACALL XH
LCALL PRE_3 LCALL SR
PRE_1:MOV @R0,#01 INC R0
INC R1 RET
PRE_2:MOV @R0,#02 INC R0 INC R1 RET
PRE_3:MOV @R0,#03 INC R0 INC R1 RET
JY: MOV R0,#50H ;校验密码 MOV A,@R0 CJNE A,30H,FT INC R0
MOV A,@R0 CJNE A,31H,FT INC R0
MOV A,@R0 CJNE A,32H,FT RET FT: INC R3
MOV P1,#5FH
ACALL Clearscreen ACALL CW ACALL DEL_5S CJNE R3,#03,L9 LX: MOV P1,#0FFH LCALL DEL_10MS MOV P1,#7FH LCALL DEL_10MS DJNZ R7,LX MOV P1,#0FFH
ACALL Clearscreen ACALL DBQ
ACALL Clearscreen
SJMP $ ;输入三次后锁死 L9:LCALL L0 RET
DEL_10MS:MOV TMOD,#01H ;延时10MS MOV TL0,#0F0H MOV TH0,#0D8H
SETB TR0
JNB TF0,$
MOV TL0,#0F0H MOV TH0,#0D8H CLR TF0 RET
DEL_5S: MOV R7,#5 L4: MOV R6,#100 L5: LCALL DEL_10MS DJNZ R6,L5 DJNZ R7,L4 RET
L7: MOV TMOD,#10H MOV TH1,#3CH MOV TL1,#0B0H MOV R5,#5 SETB TR1 LOOP:JNB TF0,$
MOV TH1,#3CH MOV TL1,#0B0H CLR TF1
DJNZ R5,LOOP CPL P0.0 JB P1.4,L7 JNB P1.4,$ RET
INT_1:MOV P1,#1FH ACALL Selectscreen ACALL Clearscreen ACALL XG MOV R0,#30H MOV R1,#00 MOV R3,#00
ZD_1:JB P1.1,ZD_2 ACALL DEL_10MS JB P1.1,ZD_1 JNB P1.1,$ ACALL XH LCALL ZD_4 SJMP ZD_7
ZD_2: JB P1.2,ZD_3 中断开始 ;开始重新输入第一个密码 ;第二个密码
; ACALL DEL_10MS JB P1.2,ZD_2 JNB P1.2,$ ACALL XH
LCALL ZD_5 SJMP ZD_7
ZD_3: JB P1.3,ZD_1 ;第三个密码 ACALL DEL_10MS JB P1.3,ZD_3 JNB P1.3,$ ACALL XH
LCALL ZD_6 SJMP ZD_7
ZD_4:MOV @R0,#01 ;重新赋值给30H INC R1 INC R0 RET
ZD_5:MOV @R0,#02 ;重新赋值给31H INC R1 INC R0 RET
ZD_6:MOV @R0,#03 ;重新赋值给32H INC R1 INC R0 RET
ZD_7:CJNE R1,#03,ZD_1
JB P1.0,$ ;确定键是否按下 ACALL DEL_10MS JB P1.0,$ JNB P1.0,$ MOV P1,#07FH RETI Read_busy:
MOV P0,#00H CLR RS SETB RW SETB EN L10: ANL A,P0 JB ACC.7,L10 CLR EN RET