单片机源程序如下:
- ;R3——输入错误次数
- ;R4——密码个数
- ;R7——输入密码暂存
- ;R2——键值暂存
- ;R6——延时参数
- ORG 00H
- SJMP START
- ORG 0BH
- START:
- ;设置初始密码
- PASSWORD:
- MOV R4,#08H ;密码个数8个
- MOV R0,#40H ;密码暂存区
- MOV A,#00H ;初始密码0,1,2,3,4,5,6,7
- PASSNEXT:
- MOV @R0,A
- INC R0
- INC A
- DJNZ R4,PASSNEXT
- MLOOP:
- CLR P3.0 ;锁合
- SETB P3.1 ;锁开
- SETB P3.2 ;键有效
- SETB P3.3 ;错误
- SETB P3.4 ;报警
- MOV R3,#03H ;错误次数3次
- ;输入密码
- GETPW: MOV R4,#08H ;密码个数
- MOV R0,#30H ;输入密码暂存区
- AGAIN: ACALL KEY ;输入密码
- CJNE A,#0AH,CONTIUE ;按确认键无效
- SJMP AGAIN
- CONTIUE:
- MOV @R0,A
- ACALL DISPLED ;按键有效显示
- INC R0
- DJNZ R4,AGAIN
- AGAIN1: ACALL KEY ;按确认键
- CJNE A,#0AH,AGAIN1
- ACALL DISPLED ;按确认键有效显示
- ACALL COMP ;比较密码
- SETB P3.0 ;息锁合
- CLR P3.1 ;开锁
- WAIT: MOV C,P3.5 ;是否重新上锁
- JNC MLOOP ;主循环
- ACALL TestKey ;是否有键按下,是否修改密码
- JZ WAIT ;累加器的内容为0,则转移;否则执行下一条指令
- ACALL CHPSW ;修改密码子程序
- SJMP WAIT
- COMP: MOV R4,#08H
- MOV R0,#30H
- AGAI: MOV 50H,@R0 ;取输入密码到50H
- MOV A,R0
- ADD A,#010H ;40H
- MOV R0,A
- MOV A,@R0 ;取密码
- MOV B,A
- MOV A,R0
- SUBB A,#010H ;30H
- MOV R0,A
- MOV A,B
- CJNE A,50H,ONCEMORE ;比较
- INC R0
- DJNZ R4,AGAI
- RET ;正确返回
- ONCEMORE:
- CLR P3.3 ;输入错误
- MOV R6,#0FFH
- ACALL DELAY
- MOV R6,#0FFH
- ACALL DELAY
- SETB P3.3
- DJNZ R3,GETPW ;3次错误输入
- CLR P3.4 ;声报警
- CLR P3.3 ;光报警
- W: SJMP W
- ;修改密码子程序
- CHPSW: MOV R4,#07H
- MOV R0,#48H
- ACALL KEY
- CJNE A,#0AH,CONTIUE2 ;按确认键无效
- LJMP WAIT ;返回
- CONTIUE2:
- MOV @R0,A
- INC R0
- ACALL DISPLED ;按键有效显示
- ANOTHER:
- ACALL KEY
- CJNE A,#0AH,CONTIUE3 ;按确认键无效
- SJMP ANOTHER
- CONTIUE3:
- MOV @R0,A
- INC R0
- ACALL DISPLED ;按键有效显示
- DJNZ R4,ANOTHER
- AGAIN2: ACALL KEY ;按确认键
- CJNE A,#0AH,AGAIN2
- ACALL DISPLED ;按确认键有效显示
- MOV R4,#08H
- MOV R0,#40H
- MOV R1,#48H
- CHANGE: ;确认后修改密码
- MOV A,@R1
- MOV @R0,A
- INC R0
- INC R1
- DJNZ R4,CHANGE
- RET
- ;按键有效显示
- DISPLED:
- CLR P3.2 ;按键有效显示
- MOV R6,#80H
- ACALL DELAY
- SETB P3.2
- RET
- TestKey:MOV P1,#0FH
- MOV A,P1 ;读入键状态
- CPL A ;累加器取
- ANL A,#0F0H
- RET
- ;取键值子程序,阵列式键盘
- KEY: MOV P1,#0F0H
- MOV A,P1
- CJNE A,#0F0H,K11
- K10: AJMP KEY
- K11: MOV R6,#02H
- ACALL DELAY
- MOV P1,#0F0H
- MOV A,P1
- CJNE A,0F0H,K12
- SJMP K10
- K12: MOV B,A
- MOV P1,#0FH
- MOV A,P1
- CJNE A,#0FH,K122
- K121: AJMP KEY
- K122: MOV R6,#02H
- ACALL DELAY
- MOV P1,#0FH
- MOV A,P1
- CJNE A,0FH,K13
- AJMP K10
- K13:
- ANL A,B
- MOV B,A
- MOV R1,#11
- MOV R2,#0
- MOV DPTR,#K1TAB
- K14: MOV A,R2
- MOVC A,@A+DPTR
- CJNE A,B,K16
- MOV P1,#0FH
- K15: MOV A,P1
- CJNE A,#0FH,K15
- MOV R6,#02H
- ACALL DELAY
- MOV A,R2
- RET
- K16: INC R2
- DJNZ R1,K14
- AJMP K10
- ;键码表
- K1TAB: DB 81H,41H,21H,11H
- DB 82H,42H,22H,12H
- DB 84H,44H,24H
- ;延时子程序
- DELAY: MOV R6,#80H
- AA1: MOV R5,#0F8H
- AA: NOP
- NOP
- DJNZ R5,AA
- DJNZ R6,AA1
- RET
- END
复制代码
所有资料51hei提供下载:
222222.rar
(41.37 KB, 下载次数: 54)
|