3750|4

62

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

请高手帮我看一下我的代码的问题,谢谢~~~ [复制链接]

这段代码是检测4*4的矩阵键盘,我使用的是反转法,然后查表得到具体的key_number,当按下键盘时,LED上显示的是对应的数字(说明查表成功了),可是问题是,我一松手,LED就显示为0了,这是为什么呢??

;
; press 4*4 key and display number(0 - F) in the led
;
;
KEY_ENCOD_NUMBER  EQU     30H     ;save the encoding key number
KEY_NUMBER        EQU     31H     ;保存实际的key number(0-F)

    org     000h
    ljmp    main
   

    org     0030h

main:
    mov     sp, #50h
    mov     KEY_NUMBER,  #00h

    setb    p2.7         ;6个数码管同时显示
    mov     P0, #0f0h    ;打开所有片选
    clr     p2.7

    mov     p0, #0ffh    ;防止出现干扰

loop:

    acall   KeyProc

    acall   display
    sjmp    DELAY5

    sjmp    loop

KeyProc:
    acall   CheckKey
    cjne    a,  #0f0h, onekey
    ret

;There is one key is pressed
onekey:
    acall   DELAY5  ;delay 10ms
    acall   DELAY5

    acall   CheckKey
    cjne    a,  #0f0h, key1 ;ensure if the key is pressed
    ret
key1:
    mov     r1, a       ;保存垂直方向的数据
    mov     p3, #0fh    ;反转检查水平方向的数据
    mov     a,  p3
    anl     a,  #0fh

    cjne    a,  #0fh, key2

wait:                   ;等待key 释放后才返回
    mov     p3, #0fh
    mov     a,  p3
    cjne    a,  #0fh, wait
    ret

key2:
    orl     a,  r1      ;将两次数据合并,下面开始查表,也可以直接比较得到key number
    MOV     KEY_ENCOD_NUMBER, a

    mov     dptr, #1520h
    mov     r0, #0ffh   ;查表的偏移量

Lp:                     ;双重循环
    inc     r0
    cjne    r0, #0fh, cmp   ;循环16次
   
    ret
cmp:
    mov     a,  r0
    movc    a,  @a+dptr
    ;inc     r0
    cjne    a,  KEY_ENCOD_NUMBER, Lp
   
    mov     KEY_NUMBER, r0     ;找到对应的number,保存在31h中
    ret

;;check if a key is pressed
CheckKey:
    mov     p3, #0f0h
    mov     a,  p3
    anl     a,  #0f0h
    ret

;;display the key number
display:
    setb    p2.6        ;送段选信号
    mov     a, KEY_NUMBER
    mov     dptr, #1500h
    movc    a, @a+dptr

    mov     p0, a
    clr     p2.6
    ret


DELAY5:
    MOV     R7, #100     ;Delay1ms: 2+2*100+2*100*X+2 = 5000
D1: MOV     R6, #24
    DJNZ    R6, $
    DJNZ    R7, D1       ;Loop for 250 times
    RET

DELAY1:
    MOV     R7, #100     ;Delay1ms: 2+2*100+2*100*X+2 = 1000
D2: MOV     R6, #4
    DJNZ    R6, $
    DJNZ    R7, D2       ;Loop for 250 times
    RET

org 1500H
    DB  3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H, 7FH, 6FH
    DB  77H, 7CH, 39H, 5EH, 79H, 71H

org 1520H           ;look up in the table and find the key number
    DB  0EEH, 0DEH, 0BEH, 7EH, 0EDH, 0DDH, 0BDH, 7DH
    DB  0EBH, 0DBH, 0BBH, 7BH, 0E7H, 0D7H, 0B7H, 77H
    end   


最新回复

acall  KeyProc     acall  display     sjmp    DELAY5     sjmp    loop 问题已经找到 sjmp    DELAY5   =》 acall   DELAY5   详情 回复 发表于 2009-11-21 21:26
点赞 关注

回复
举报

63

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
你那个应该是定时扫瞄吧?

你没有建立一个你合适的更新显示的机制

现在你用的应该是扫到按键就更新,所以没按键的时候会变

你应该用的显示机制是:有按键就更新显示,无按键时不更新显示

办法先自己想
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
引用 1 楼 lbing7 的回复:
你那个应该是定时扫瞄吧?

你没有建立一个你合适的更新显示的机制

现在你用的应该是扫到按键就更新,所以没按键的时候会变

你应该用的显示机制是:有按键就更新显示,无按键时不更新显示

办法先自己想



你应该用的显示机制是:有按键就更新显示,无按键时不更新显示
我现在就是这样做的啊,但有按键的时候就更新 KEY_NUMBER 地址中的内容
无按键时就读取KEY_NUMBER 地址中的内容
我感觉我逻辑上是对的,不知道问题在哪里
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

4
 
有点长,俺习惯C.
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

5
 
acall  KeyProc

    acall  display
    sjmp    DELAY5

    sjmp    loop
问题已经找到
sjmp    DELAY5   =》 acall   DELAY5
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表