;*************************************************************************** ;* sxj1974@163.com (51c51 test web) www.8951.com
* ;* Create by :石学军 www.51c51.com 更多例程请登陆网站
* ;***************************************************************************
;本程序实现扫描按键显示功能. ;分别按16个键盘显示分别显示数字123A456B789C*0#D ;键盘口P1,数码管显示第一位p21, 数码管段位p0口 org0000h ajmpmain org0030h main: movdptr,#tab;将表头放入DPTR lcallkey;调用键盘扫描程序 movca,@a+dptr ;查表后将键值送入ACC movp0,a ;将Acc值送入P0口 CLR P2.1 ;开显示 ljmpmain ;返回调用子程序反复循环显示 KEY: LCALL KS ;调用检测按键子程序 JNZ K1 ;有键按下继续 LCALL DELAY2 ;无键按下调用延时去抖动程序 AJMP KEY ;返回继续检测有无按键按下 K1: LCALL DELAY2 LCALL DELAY2 ;有键按下继续延时去抖动 LCALL KS ;再一次调用检测按键程序 JNZ K2 ;确认有按下进行下一步 AJMP KEY ;无键按下返回继续检测 K2:MOV R2,#0EFH ;将扫描值送入 R2暂存 MOV R4,#00H ;将第一列的列值00H送入R4暂存,R4用于存放列值。 K3:MOV P1,R2 ;将R2的值送入P1口 L6:JB P1.0,L1 ;P1.0等于1跳转到L1 MOV A,#00H ;将第一行的行值00H送入ACC AJMP LK ;跳转到键值处理程序 L1:JB P1.1,L2 ;P1.1等于1跳转到L2 MOV A,#04H ;将第二行的行值送入ACC AJMP LK ;跳转到键值理程序进行键值处理 L2: JB P1.2,L3 ;P1.2等于1跳转到L3 MOV A,#08H ;将第三行的行值送入ACC AJMP LK ;跳转到键值处理程序 L3:JB P1.3,NEXT ;P1.3等于1跳转到NEXT处 MOV A,#0cH ;将第四行的行值送入ACC LK:ADD A,R4 ;行值与列值相加后的键值送入A PUSH ACC ;将A中的值送入堆栈暂存 K4: LCALL DELAY2 ;调用延时去抖动程序 LCALL KS ;调用按键检测程序 JNZ K4 ;按键没有松开继续返回检测 POP ACC ;将堆栈的值送入ACC RET
NEXT: INC R4 ;将列值加一 MOV A,R2 ;将R2的值送入A JNB ACC.7,KEY ;扫描完成跳至KEY处进行下一回合的扫描 RL A ;扫描未完成将A中的值右移一位进行下一列的扫描 MOV R2,A ;将ACC的值送入R2暂存 AJMP K3 ;跳转到K3继续 KS:MOV P1,#0FH ;将P1口高四位置0低四位值1 MOV A,P1 ;读P1口 XRL A,#0FH ;将A中的值与A中的值相异或 RET ;子程序返回 DELAY2: ;40ms延时去抖动子程序8*FA*2=40ms MOV R5,#08H L7:MOV R6,#0FAH L8:DJNZ R6,L8 DJNZ R5,L7 RET
tab:
db 28h,34h,28h,34h,0a9h,60h,20h,7ah,20h,21h,61h,74h,30h,62h,0a2h,7eh ;0h0hc9878654a321 轮流显示键盘因为无法表达*# 就用H表示,B用8表示 end
hex格式文件下载(点右键,目标另存为hex即可直接烧写)
|