單片機(jī)處理密碼的簡單方法
以下是本人用單片機(jī)對鍵盤輸入密碼與處理的一些小看法。鍵盤是4*4=16鍵的小鍵盤,接在P2口,四行四列分別接P2
口的高位和低位。P1口接8個LED
保存輸入的密碼主要思想是“先進(jìn)先出”。
主要程序段如下:
*****先進(jìn)行初始化
mov 20h,#00h;存當(dāng)前輸入密碼
mov 21h,#00h
mov 22h,#12;存原始密碼
mov 23h,#34
........(使用20H,21H保存輸入的兩位密碼,保存多位也是一樣的道理)
mov 2ah,#00h;是否保存開始保存密碼
;*************讀鍵盤程序段*****************
READKEY: PUSH B
PUSH 1
MOV P2,#0F0H
MOV A,P2
CJNE A,#0F0H,RK_HIT0
LJMP RK_EXIT
RK_HIT0: LCALL DELAY ;延時消抖
MOV P2,#0F0H
MOV A,P2
CJNE A,#0F0H,RK_KIT1
LJMP RK_EXIT
RK_KIT1: ORL A,#0FH
MOV P2,A
MOV A,P2
MOV B,A
MOV R1,#0FFH
MOV DPTR,#KCODTAB
RK_NONE: CLR A ;判斷按的是哪號鍵
MOVC A,@A+DPTR
INC DPTR
INC R1
CJNE A,B,RK_NONE ;將鍵號存R1中
SKEY: MOV P2,#0F0H ;判斷是否釋放了鍵
NOP
MOV A,P2
CJNE A,#0F0H,SKEY
*****鍵操作功能
key15: cjne r1,#15,save_mm
mov 20h,#00H ;開始輸入密碼之前先原來保存的密碼清除
mov 21h,#00H
mov a,2ah ;作用是按一下可以輸入密碼,如果再按一下則是取消輸入
cjne a,#00h,set15
mov 2ah,#0ffh
ajmp rk_exit
set15: mov 2ah,#00h
ajmp rk_exit
save_mm: mov a,2ah ;密碼是否保存
cjne a,#0ffh,key1 ;如果值為00H則不是要輸入密碼,轉(zhuǎn)向正常的功能鍵
mov 21h,20h ;先將20H里的數(shù)據(jù)存入21H
mov 20h,r1 ; 把剛輸入的密碼放入20H中
key14: cjne r1,#14,key1 ;比較密碼是否正確
mov a,2ah
cjne a,#0ffh,rk_exit
mov 2ah,#00h ;將2ah清零,不再允許輸入密碼了(即沒有按開始鍵k15將不允許輸入密碼)
;開始比較密碼是否正確了,比較之后將20H,21H清零,源密碼存放在22H中
mov a,20h
cjne a,22h,error
mov a,21h
cjne a,23h,error
;密碼對了,執(zhí)行相應(yīng)的操作
setb p1.0 ;密碼對了,一號燈亮
;...................
ajmp rk_exit
error: ;密碼錯了,執(zhí)行相應(yīng)的操作
setb p1.2 ;密碼錯了,三號燈亮
;...................
ajmp rk_exit
key1: ;其它功能鍵
key2: ;*******
rk_exit: ret ;按鍵判斷完成,退出讀鍵盤程序
;*****************以下為延時程序段**********************
DELAY: MOV R6,#20
DELAY1: MOV R7,#50
DJNZ R7,$ ;2US X 50 = 100 US, 12MHZ
DJNZ R6,DELAY1
RET
;**********存放鍵值的表格****************
KCODTAB: DB 11100111B,11101011B,11101101B,11101110B
DB 11010111B,11011011B,11011101B,11011110B
DB 10110111B,10111011B,10111101B,10111110B
DB 01110111B,01111011B,01111101B,01111110B





