用单片机编写的键盘扫描程序怎样编写它的求键号程序?

p1.0~p1.3接行输入,p1.4~P1.7接列输出,没接显示

用线反转法扫描矩阵键盘示例程序:
t1:mov p1,#0fh ;p1接口高4位为0,低4位输入
mov a,p1 ;读p1
anl a,#0fh ;屏蔽高4位
cjne a,#0fh,t2 ;有键按下转t2
sjmp t1 ;无键按下转回
t2:lcall delay10;延时10ms,去抖
mov a,p1 ;重新扫描p1口
anl a,#0fh
mov b,a ;行线状态在b的低4位
cjne a,#0fh,t3 ;确认有键按下,转判哪一键按下
sjmp t1 ;是抖动,转回
t3:mov p1,#0f0h ;置p1口高4位输入,低4位为0
mov a,p1 ;读p1列状态
anl a,#0f0h ;屏蔽高4位
orl a,b ;列线状态在高4位,与行线状态合成与a
...... ;键处理

键处理必须得知道键号,所以
我想问下怎样编写键号处理的程序,要求能用<公式:键号=所在行号*键盘列数+列号>求出按键时所对应的键号
请高手指点下

要不要我帮你写一段,你后面没扫描,当然无法获取键值
t1:mov p1,#0fh ;p1接口高4位为0,低4位输入
mov a,p1 ;读p1
anl a,#0fh ;屏蔽高4位
cjne a,#0fh,t2 ;有键按下转t2
sjmp t1 ;无键按下转回
t2:lcall delay10;延时10ms,去抖
mov a,p1 ;重新扫描p1口
anl a,#0fh
cjne a,#0fh,t3
sjmp t1
t3:mov r0,#00 ;行计数值
mov r1,#00 ;列计数值
mov r3,#0efh ;扫描初值
t4:mov a,r3
mov p1,a;输出行扫描字
mov a,p1
mov r1,a
anl a,#0fh
cjne a,#0fh,t5 ;该行有键按下
inc r0 ;行计数器加1 ,扫下一行
MOV A,R3
RLC A
MOV R3,A
MOV A,R0
CJAE A,#04H,t4 ;扫到最后一行?
t6: ret ;结束
t5:mov a,r1
jnb acc.0,t7
jnb acc.1,t8
jnb acc.2,t9
jnb acc.3,t10
sjmp t6
t7: mov r2,#00 ;0列号
sjmp t11
t8:mov r2,#01 ;1列号
sjmp t11
t9:mov r2,#02 ;2列号
sjmp t11
t10:mov r2,#03 ;3列号
t11:mov a,r0
mov b,#04
mul ab ;行号乘4
add a,r2 ;键值在A中
ret
温馨提示:内容为网友见解,仅供参考
无其他回答

单片机键盘扫描程序
2*3的键盘,太简单了,不值得用循环,特别是双重循环。最简明、高效的程序如下:sbit P10 = P1^0;sbit P11 = P1^1;sbit P12 = P1^2;sbit P13 = P1^3;sbit P14 = P1^4;char scan_key(void){ P13 = 0;if (!P10) return 0;if (!P11) return 1;if (!P12) return ...

C51矩阵键盘扫描 请解释一下程序 特别是关键步骤 急!!!
1、首先判断整个键盘有无按下键,只要行扫描线输入不为全1,(1111)即有键按下;P1 = 0xf0;if((P1&0xf0)!=0xf0) 如果无按键按下,全1,则返回return -1;如果有键按下则延时,再次判断有无按键按下,Delay();if((P1&0xf0)!=0xf0)如果无按键按下则返回return -1。有键按下则继续,...

单片机4*4键盘扫描程序
这这个循环4次的程序段就是发送扫描码,再分别检测按键情况的。扫描码就是k_out,分别是0xfe;0xfd;0xfb,0xf7;这几个数是靠k_out=crol_(k_out,1);来实现的。键盘扫描,你要理解是“扫描”也就是一行一行的发送扫描码,再检测每“列”的值,这个值就是键值。

单片机按键扫描程序
原程序中,分支时,是以20H单元为按键的“序号”,0,1,2,...7;而按键检测程序在20H单元给出的是按键的“编码”,FE,FD,FB,...7F。龙宇防盗监控的回答将“编码”转换成了“序号”,程序是正确的,但是太长,我的回答是利用位操作指令来编写程序,是最简明、最高效的。

单片机扫键盘程序代码
do { P1=0x0f; \/*扫描P1口之前赋值*\/ delay(3); \/*延时,消抖*\/ if(P1!=0x0f) \/* 检测看是否有按键按下 如果按下则需要检测一次*\/ { key=Keyboard();} } while(1)...\/ 名称 : Keyboard()功能 : 按键检测函数 说明 : 4*4键盘 0-9 \/ uchar Keyboard(){ uchar i,j,pc;uch...

单片机行列式键盘扫描原理?
单片机行列式键盘扫描原理如下:1、行线P10~P13为输出线,列线P14~P17为输入线。一开始单片机将行线(P10~P13)全部输出低电平,此时读入列线数据,若列线全为高电平则没有键按下,当列线有出现低电平时调用延时程序以此来去除按键抖动。2、延时完成后再判断是否有低电平,如果此时读入列线数据还是有...

单片机汇编矩阵键盘实验(扫描法)
这样我们可以先识别K01、K02、K03、K04、K05,若没有按键按下然后再和思路四的设计一样去识别其他按键。但这样存在一个问题,如果IO1配置为0,IO5读到0,那么怎么知道是K51按下还是K05按下呢,这里只需要在程序里做下判断,先判断下是不是K05按下,若不是就是K51,因为按键K01、K02、K03、K04、...

单片机4×4矩阵键盘扫描编程问题(里面详细,欢迎高手)
扫描第一行,就是将第一行电平置为低电平,其他的都为高,扫描哪一行就让哪一行的电平置零,其他行为高电平。这就是第一个问题。在没有键按下的时候,列线全部是高电平,有第一行的键按下的时候,相应的列线就为低电平了,n=P1;n&=0xf0;if(n!=0xf0)这几句就是判断有没有键按下。在第...

单片机矩阵键盘按键行列逐级扫描法
unsigned char KeyScan(void) \/\/键盘扫描函数,使用行列逐级扫描法{ unsigned char Val; KeyPort=0xf0;\/\/这句其实就是整体看看是否有键按下,四行全送0,有键按下,高四位肯定不为全1 if(KeyPort!=0xf0)\/\/表示有按键按下 { DelayMs(10); \/\/去抖if(KeyPort!=0xf0) { \/\/表示有...

5.4.2 按键扫描(单片机最简洁的键盘扫描程序详解)
在单片机训练营的键盘扫描课程中,为初学者详尽解答了基础问题,课程内容包括Proteus原理图的制作、C语言代码编写和图形化编程步骤。课程关键点包括:理解按键值的二进制表示:五个按键对应0x01到0x10,这是因为它们是按键状态的二进制位表示,便于程序处理。运用全局变量:图形化代码虽然初始值为空,但实际...

相似回答
大家正在搜