- ;《单片机矩阵式键盘接口技术及编程》
- ;键盘扫描程序:
- ;从以上分析得到单片机键盘扫描程序的流程图如图2所示。程序如下
- SCAN: MOV P1,#0FH ;一个端口(如P1口)就能组成4*4=16个按钮 P1.0-P1.3设置为输入线,行线P1.4-P.17设置为输出线
- MOV A,P1 ; 检测当前是否有键被按下。检测的办法是P1.4-P1.7输出全“0”,读取P1.0-P1.3的状态,
- ANL A,#0FH ; 若P1.0-P1.3为全“1”,则无键闭合,不然有键闭合。
- CJNE A,#0FH,NEXT1 ; 有键闭合,转移去除键抖动延时
- SJMP NEXT3 ; 无键闭合,转移
- NEXT1: ACALL D20MS ; 延时20毫秒去除键抖动
- MOV A,#0EFH ; 若有键被按下,应识别出是哪一个键闭合
- NEXT2: MOV R1,A
- MOV P1,A
- MOV A,P1
- ANL A,#0FH ; A里面的值和0F按位进行与运算!结果保存到A
- CJNE A,#0FH,KCODE ; 意思就是 2个数相比较 不 相等 则跳转
- MOV A,R1
- SETB C ; 使CY=1 (进位标志置位指令) 把寄存器C置为1
- RLC A ; 即将A的内容左移一位,将进位位C中的值移到累加器A的最低位,A的最高位移到C里。 #0DFH #0BFH #07FH
- JC NEXT2 ; 如果进位C位为1 ,转移
- NEXT3: MOV R0,#00H ; 无效标志值
- RET ; 返回
- KCODE: MOV B,#0FBH ;,然后可采用计算法将闭合键的行值和列值转换成所定义的键值
- NEXT4: RRC A ;指令就是带进位累加器循环右移 A的最低位移给C,并且C原来的值移给A的最高位。
- INC B
- JC NEXT4
- MOV A,R1
- SWAP A ;这条指令,将累加器A的高、低4位数据交换,也就是低4位数据进入高4位,高4位数据进入低4位。
- NEXT5: RRC A
- INC B
- INC B
- INC B
- INC B
- JC NEXT5
- NEXT6: MOV A,P1 ; 为了保证键每闭合一次CPU 仅作一次处理,必须却除键释放时的抖动。
- ANL A,#0FH
- CJNE A,#0FH,NEXT6
- MOV R0,#0FFH ;有效标志值
- RET ;返回
复制代码 |