| 单片机处理密码的简单方法 以下是本人用单片机对键盘输入密码与处理的一些小看法。键盘是4*4=16键的小键盘,接在P2口,四行四列分别接P2 口的高位和低位。P1口接8个LED 保存输入的密码主要思想是“先进先出”。 主要程序段如下: *****先进行初始化 mov 20h,#00h;存当前输入密码 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则不是要输入密码,转向正常的功能键 mov 21h,20h ;先将20H里的数据存入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 ;密码对了,执行相应的操作 setb p1.0 ;密码对了,一号灯亮 ;................... ajmp rk_exit error: ;密码错了,执行相应的操作 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
|