51单片机矩形键盘输入,用汇编写的,程序如下 45

按键设定为0-F,我看了很久也不知道哪里错了,每1行只能输入2个有效数字,意思就是有些数字显示不出来,求高手帮忙看看ORG0000HLJMPSTARTORG0030HST... 按键设定为0-F,我看了很久也不知道哪里错了,每1行只能输入2个有效数字,意思就是有些数字显示不出来,求高手帮忙看看

ORG 0000H
LJMP START
ORG 0030H

START:MOV DPTR,#TABLE
MOV A,#00H
MOVC A,@A+DPTR
MOV P0,A

MAIN:ACALL KEY ;调用扫描程序 判断是否有键按下
JNZ KS1 ;若此时A的值不为0跳KS1,为0返回MAIN,初步确定没按键按下
LJMP MAIN

KS1:ACALL T12MS ;延时12ms去抖动
ACALL KEY ;再次扫描,确定是否有键按下
JNZ L1 ;若此时A的值不为0跳LOOP,为0返回MAIN,最终确定没按键按下
LJMP MAIN

KEY:MOV P2,#0FH ;给P2口初始值,列为1,行为0
MOV A,P2 ;读入当前P2口值
ANL A,#0FH ;屏蔽当前行的值,只比较列
CPL A ;A内容取反
RET

L1:JB P2.0,L2 ;扫描P2.0状态,如果P2.0为低电平确定按键所在列为第1列,为高电平跳L2扫描第2行
MOV P2,#0F0H
JB P2.4,H11 ;扫描P2.5状态,如果P2.4为高电平跳 ,确定按键位置为1列1行
JB P2.5,H12
JB P2.6,H13
LJMP H14

L2:JB P2.1,L3 ;扫描P2.1状态,为高电平跳L3扫描第3行
MOV P2,#0F0H
JB P2.4,H21
JB P2.5,H22
JB P2.6,H23
LJMP H24

L3:JB P2.2,L4 ;扫描P2.2状态,为高电平跳L4扫描第4行
MOV P2,#0F0H
JB P2.4,H31
JB P2.5,H32
JB P2.6,H33
LJMP H34

L4: MOV P2,#0F0H
JB P2.4,H41
JB P2.5,H42
JB P2.6,H43
LJMP H44

H11:MOV A,#00H ;1行1列对应按键为数字7

LJMP DC

H12:MOV A,#01H

LJMP DC

H13:MOV A,#02H

LJMP DC

H14:MOV A,#03H

LJMP DC

H21:MOV A,#04H

LJMP DC

H22:MOV A,#05H

LJMP DC

H23:MOV A,#06H

LJMP DC

H24:MOV A,#07H

LJMP DC

H31:MOV A,#08H

LJMP DC

H32:MOV A,#09H

LJMP DC

H33:MOV A,#0AH

LJMP DC

H34:MOV A,#0BH

LJMP DC

H41:MOV A,#0CH

LJMP DC

H42:MOV A,#0DH

LJMP DC

H43:MOV A,#0EH

LJMP DC

H44:MOV A,#0FH

LJMP DC

DC:MOVC A,@A+DPTR
MOV P0,A
LJMP MAIN

T12MS:MOV R7,#18H ;12ms延时程序
TM:MOV R6,#0FFH
TM6:DJNZ R6,TM6
DJNZ R7,TM
RET

TABLE:DB 0C0H,0F9H,0A4H,0B0H,99H ;字符表
DB 92H,82H,0F8H,80H,90H
DB 88H,83H,0C6H,0A1H,86H
DB 8EH

END
展开
 我来答
w微凉的手指z
2012-06-10 · 超过27用户采纳过TA的回答
知道答主
回答量:238
采纳率:0%
帮助的人:103万
展开全部
键盘的值应该是行值加列值,你计算的都不对,而且扫描方式也不对啊,显示上也有点问题,在显示下个值的时候要对上次显示的值进行处理要关显示的
更多追问追答
追问
一定要用行进入列的子程序,然后加起来赋值吗?如果要赋的值没有规律这个方法不就是不行,请问有没有能1个程序给1个键赋值的,因为还有的键还有做成功能键,比如加减乘除
追答
呵呵 兄弟你别这么单独的对某个按键的功能进行分配,你要整体的对所有的按键整体来处理,首先要做的是按键的识别,然后才会有相应按键的功能去执行,而且执行完这个按键的程序后还要回到主程序对所有按键进行检测,以防止程序进入死循环,如果需要的话我这里有现成的程序c和汇编都有,祝你成功,我的qq是991011040
做而论道
高能答主

2012-06-12 · 把复杂的事情简单说给你听
知道大有可为答主
回答量:3.1万
采纳率:82%
帮助的人:8431万
展开全部
4×4的键盘,不需要这么长的程序。
即使是使用汇编语言,十几行,也就够了。
夜长梦多。

到我的百度空间看看吧。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2012-06-08
展开全部
单个数据不能一一显示吗? 位控制P1口 那段程序在哪?
追问
P1目前还不需要控制,只要能对应输出0-F就行了 我看了很久 只有第1列的按键是可以的,同1行上的234列按键输出一样
追答
L1:JB P2.0,L2      
MOV P2,#0F0H //这行是不是应该 MOV P2,#0FH ?

你的第一列显示应该也不是矩阵里对应的值吧,第二列的值和第一列的值反了,2,3,4列出来的是矩阵第一列的值。大概是这样,睡觉去了,如果不是自己在找找原因
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式