打印

哪位高手帮帮我?矩阵式键盘输入---为什么会这样?

[复制链接]
2094|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
AnsenZhang|  楼主 | 2007-9-29 22:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用8951做了个3×4矩阵式键盘输入,8字数码管显示输出的电路,即根据按键显示相应数字的小程序.但问题是输出显示的只是1×4矩阵的效果.哎!无奈!我看了网上的几个自称调试成功的程序,但copy过来也是一样的效果.难道没办法很好的使用吗?
以下是我的程序,望高手们指点一二.
(电路部分p1.0-p1.3口控制键盘的四行,p1.4-p1.6控制键盘的三列.p2口控制8字数码管输出.)
org 00h
jmp star
org 30h
star:
mov r1,#00h;
mov r0,#0efh;
call main;
call dis;
jmp star;
main:
mov p1,#0fh;
mov a,p1;
xrl a,#0fh;
jnz k2;
jmp main;
k2:
call delay;
mov p1,#0fh;
mov a,p1;
xrl a,#0fh;
jnz k3;
jmp main;
k3:
mov p1,r0;
mov a,p1;
jb p1.0,xx1;
mov a,r1;
jmp dis;
xx1:jb p1.1,xx2;
inc r1;
mov a,r1;
jmp dis;
xx2:jb p1.2,xx3;
inc r1;
mov a,r1;
jmp dis;
xx3:jb p1.3,xx4;
inc r1;
mov a,r1;
jmp dis;
xx4:
mov a,r0
rl a;
mov r0,a;
inc r1;
cjne r0,#7fh,k3;
jmp star;
ret;
dis:mov dptr,#tab;
movc a,@a+dptr;
mov p2,a;
push acc;
mov p1,#0fh;
mov a,p1;
anl a,#0fh;
cjne a,#0fh,dis;
pop acc;
ret;
DELAY: ;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
end

相关帖子

沙发
zusen| | 2007-9-29 22:19 | 只看该作者

楼主学编程

建议先学好编程的规范

使用特权

评论回复
板凳
ansenzhang| | 2007-10-2 10:28 | 只看该作者

啊?不是吧.我一直都挺注意编程规范问题的.感觉,好象还可以

啊?不是吧.我一直都挺注意编程规范问题的.感觉,好象还可以吧.
既然高手指出这个问题,愿听指教,请多多赐教!

使用特权

评论回复
地板
OneMillion| | 2007-10-2 14:31 | 只看该作者

让人无语的菜鸟

,,。。。。。
哎!无奈!我看了网上的几个自称调试成功的程序,但copy过来也是一样的效果.难道没办法很好的使用吗?
。。。。。。。。。

使用特权

评论回复
5
nyqiao| | 2007-10-3 11:07 | 只看该作者

楼主学编程

把MAIN程序下面的JMP MAIN改为RET,注意你调用子程序后一定要返回,如果改后不行话,把你后面的那些JMP MAIN也都换过来

使用特权

评论回复
6
hotpower| | 2007-10-3 11:13 | 只看该作者

吾人子弟呀~~~

使用特权

评论回复
7
icecut| | 2007-10-3 12:47 | 只看该作者

。。

你确定你的硬件没问题?
我没看你汇编,不确定你是否有错误,你可以用KEIL仿真调试一下

使用特权

评论回复
8
ansenzhang| | 2007-10-3 22:33 | 只看该作者

回复各位高手

五楼指出的方法我已经做过了,但还是不行.这里顺便说一下,我是用keil+proteus做的仿真.至于七楼说的硬件问题,可以说是不存在的.
我肯定:软件编程有问题,但关键是找不出问题出在什么哪儿.郁闷!

使用特权

评论回复
9
ayb_ice| | 2007-10-4 16:43 | 只看该作者

GOOGLE

使用特权

评论回复
10
123654789| | 2007-10-4 16:45 | 只看该作者

楼上的回答 很 yes

www.baidu.com

使用特权

评论回复
11
lsqdesign| | 2007-10-5 09:56 | 只看该作者

文档和规范化的编程远比技巧重要

  程序可读性差且没有注释无法维护,而且编写不够规范。如果想做商业应用还的多在规范上花点功夫。个人感觉程序复杂后尤其是几个人合作的项目,文档和规范化的编程远比技巧重要。

使用特权

评论回复
12
AnsenZhang|  楼主 | 2007-10-5 16:07 | 只看该作者

感谢各位的热心帮助,问题我基本上已经搞定

感谢各位的热心帮助,问题我基本上已经搞定了(各种矩阵键盘的编程都看了,辛苦啊!)   得出个结论:就是编程流程  检测是否有按键按下→没有,返回继续检测/有,调用去抖动延时程序,再检测是否有按键按下→没有,返回继续检测/有,调用扫描按键程序.调用扫描按键程序之前的部分,即对是否有键按下的编写很关键,有两种方式,第(1)种:检测整个键盘是否有键按下,如果有,再调用扫描按键程序.第(2)种:一列一列的检测,该列是否有按键按下,如果有,再调用该列的扫描按键程序. 以上两种方式,第一种实际运行起来,列根本不扫描,所以即便你是m×n的键盘,到时候也就相当于1×n的键盘.第二种方法是可以的.(这里指明,在keilC下软调试,第一、二种方法都是可以的;但在proteus下仿真,第一种方法就不行了.当然我试过使第一种方法运行起来,结果,在我删除上面指出的"检测整个键盘是否有键按下"的程序后,就ok了,但这样是不行的,因为在实际键盘中,肯定需要有去抖动,确认按键按下的程序部分.因此说第二种方法是行不通的.)
以上是我的编程总结,如有不正确,望各位多多批评指正,提前谢过.

使用特权

评论回复
13
ayb_ice| | 2007-10-5 16:33 | 只看该作者

人始终要靠自己的。。。

使用特权

评论回复
14
zhaoyu2005| | 2007-10-6 11:38 | 只看该作者

两种方法都行

是你自己编的程序有问题,其实第一种和第二种一原理上一样样,只是第一种效率高一点,因为先判断了一下是否有键按下再决定是否行列扫描,但是第二种不管有没有键按下都扫描

使用特权

评论回复
15
太阳之母| | 2007-10-6 12:50 | 只看该作者

嘿嘿

前面有说到书写规范的,这样写出来,是不是看起来更舒服一些呢?
        org  00h
        jmp  star

        org  30h
star:   mov  r1, #00h;
        mov  r0, #0efh;
        call main;
        call dis;
        jmp  star;

main:   mov  p1, #0fh;
        mov  a, p1;
        xrl  a, #0fh;
        jnz  k2;
        jmp  main;
k2:     call delay;
        mov  p1, #0fh;
        mov  a, p1;
        xrl  a, #0fh;
jnz k3; jmp  main;
k3:     mov  p1, r0;
        mov  a, p1;
        jb   p1.0, xx1;
        mov  a, r1;
        jmp  dis;
xx1:    jb   p1.1, xx2;
        inc  r1;
        mov  a, r1;
        jmp  dis;
xx2:    jb   p1.2, xx3;
        inc  r1;
        mov  a, r1;
        jmp  dis;
xx3:    jb   p1.3, xx4;
        inc  r1;
        mov  a, r1;
        jmp  dis;
xx4:    mov  a, r0
        rl   a;
        mov  r0, a;
        inc  r1;
        cjne r0, #7fh, k3;
        jmp  star;
        ret;

dis:    mov  dptr, #tab;
        movc a, @a+dptr;
        mov  p2, a;
        push acc;
        mov  p1, #0fh;
        mov  a, p1;
        anl  a, #0fh;
        cjne a, #0fh, dis;
        pop  acc;
        ret;

;****************40ms延时去抖动子程序8*FA*2=40ms
DELAY:  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
        db   20h, 21h, 61h, 74h, 30h,  62h, 0a2h, 7eh
end

使用特权

评论回复
16
太阳之母| | 2007-10-6 12:52 | 只看该作者

嘿嘿

实际上程序里有很多错误啊!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

18

帖子

1

粉丝