打印

请各位程序匠人帮我分析分析,是不是指令内部的事?

[复制链接]
1585|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jingji520|  楼主 | 2008-12-21 21:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
问题如下:
检测键盘,要求按下后,只输入一个值,直至松开才继续下一检测。
思路:以一状态标致过程,名字:key_status,当值为0时说明前面没键按下,此时如果有键按下,可以输入一个键盘值;当值为1时,说明此时正为输入值;
当值为2时说明此时键按下,但前面已输入过一次键盘的值,不再输入。

说明:键盘分布如下:
12个键,P3控制的扫描检测。 分别为:列 P3.5 P3.6 P3.7 行 P3.0 P3.1 P3.2 P3.3 

开始调试时,代码如下:
delay_time     equ 7fh
led1        equ 7eh
led2        equ    7dh
led3        equ 7ch
led4        equ    7bh
Key_number    equ 7ah
key_status    equ 79h; 00h无键按下,等待按键。01h有键按下,返回数值。02h有键按下,但已返回过数值,不再返回.

    org 0000h
    ajmp start
    org 0100h
start:
    mov led1,#01
    mov led2,#00
    mov led3,#00
    mov led4,#00
    acall  LED_Print
main:
    acall LED_Print
    mov delay_time,#01h  
    acall Delay
         acall Key_Test
    mov A,key_status
    cjne A,#01h,main    
    mov led4,led3
    mov led3,led2
    mov led2,led1       
    mov led1,key_number        
    ajmp main
Key_Test:
    mov P3,#0ffh
    clr P3.0
    mov dptr,#Key_table1
    mov A,P3
    anl A,#11100000b
    mov R0,A
    mov A,#11100000b
    subb A,R0
    rl A
    rl A
    rl A
    movc A,@A+dptr
    mov Key_number,A
    cjne A,#0ffh,key_end
    mov P3,#0ffh
    clr P3.1
    mov dptr,#Key_table2
    mov A,P3
    anl A,#11100000b
    mov R0,A
    mov A,#11100000b
    subb A,R0
    rl A
    rl A
    rl A
    movc A,@A+dptr
    mov Key_number,A
    cjne A,#0ffh,key_end
    mov P3,#0ffh
    clr P3.2
    mov dptr,#Key_table3
    mov A,P3
    anl A,#11100000b
    mov R0,A
    mov A,#11100000b
    subb A,R0
    rl A
    rl A
    rl A
    movc A,@A+dptr
    mov Key_number,A
    cjne A,#0ffh,key_end
    mov P3,#0ffh
    clr P3.3
    mov dptr,#Key_table4
    mov A,P3
    anl A,#11100000b
    mov R0,A
    mov A,#11100000b
    subb A,R0
    rl A
    rl A
    rl A
    movc A,@A+dptr
    mov Key_number,A
    cjne A,#0ffh,key_end
    mov key_status,#00h
    ret
key_end:     ;have press
    mov A,key_status
    cjne A,#00,no_return
    mov key_status,#01h
    ret
no_return:
    mov key_status,#02h
    ret

LED_Print:
    mov A,Led1
    mov DPTR,#Led_table
    movc A,@A+DPTR
    mov p3,A
    mov A,Led2
    mov DPTR,#Led_table
    movc A,@A+DPTR
    mov p2,A
    mov A,Led3
    mov DPTR,#Led_table
    movc A,@A+DPTR
    mov p1,A
    mov A,Led4
    mov DPTR,#Led_table
    movc A,@A+DPTR
    mov p0,A
    ret
Key_table1:
    db 0ffh,000h,001h,000h,002h
Key_table2:
    db 0ffh,003h,004h,000h,005h
Key_table3:
    db 0ffh,006h,007h,000h,008h
Key_table4:                         
    db 0ffh,009h,00ah,000h,00bh

Led_table:
    db 0c0h,0f9h,0A4h,0B0h,099h,092H,082h,0F8h,080h,090h,0ffh,00h   
Delay:
    mov R0,delay_time
delay_loop:
    mov R1,#0ffh
    djnz R1,$
    djnz R0,delay_loop
    ret
    END

下贴继续

相关帖子

沙发
jingji520|  楼主 | 2008-12-21 22:06 | 只看该作者

开始调试时,

开始调试时,运行正常出结果,但有一点不行:P3.0的那一行检测不显示,也就是无反应,只能检测到3~B。后来去掉
    mov A,key_status
    cjne A,#01h,main    
    mov led4,led3
    mov led3,led2
    mov led2,led1       
    mov led1,key_number        
    ajmp main
处的 cjne A,#01h,main 指令,什么键值都正常显示,只是全部有而已。反复检查代码,无果,换单片机(AT89S52)(编译用Keil uVision3),无果,将状态寄存器key_status显示出来,正常(去掉 cjne A,#01h,main指令时)。但,不去掉该指令,在其前面将状态寄存器key_status显示出来后,值为0。(这些现象都只是P3.0行的,其它正常)。郁闷N久后.....
下贴..

使用特权

评论回复
板凳
jingji520|  楼主 | 2008-12-21 22:12 | 只看该作者

后来,实在没折,不怀疑自己了,怀疑一下指令吧

然后就.....


main:
    acall LED_Print
    mov delay_time,#0ffh  
    acall Delay
         acall Key_Test
    mov A,key_status
    cjne A,#01h,main    
    mov led1,led2
    mov led2,led3   
    mov led3,led4
    mov led4,key_number     
    ajmp main

改为:
main:
    acall LED_Print        
    mov delay_time,#0ffh  
    acall Delay
    acall Key_Test
    mov A,key_status    
    dec A
    jnz main    
    mov led1,led2
    mov led2,led3   
    mov led3,led4
    mov led4,key_number       
    ajmp main

结果,,,问题解决。。。

问题解决是好事,发此贴原因,是因为不“甘心”,想知道为什么,也许有自己没弄明白的地方,也许是单片机内部的问题,但我不想以后再因为此问题而弄这么久,所以请匠人们帮我分析一下。同时大家共同探讨一下。

使用特权

评论回复
地板
程序匠人| | 2008-12-21 23:00 | 只看该作者

各位程序匠人???

使用特权

评论回复
5
zyok| | 2008-12-21 23:30 | 只看该作者

各位写程序的匠人,呵呵

使用特权

评论回复
6
John_Lee| | 2008-12-21 23:47 | 只看该作者

我帮匠人说一句:“看这么长的汇编头痛”,不知道对不对

使用特权

评论回复
7
makebetter| | 2008-12-22 00:43 | 只看该作者

呵呵,对于匠人来说,这点汇编也头痛?

使用特权

评论回复
8
奇门遁甲| | 2008-12-22 09:38 | 只看该作者

re

cjne A,#01h,main    
影响了进位位cy,
Key_Test函数里又subb A,R0,是带cy去运算了.
进位位在捣乱。

使用特权

评论回复
9
5880527| | 2008-12-22 10:24 | 只看该作者

呀,8楼的真仔细哈

使用特权

评论回复
10
jingji520|  楼主 | 2008-12-22 12:46 | 只看该作者

谢谢!!!

使用特权

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

本版积分规则

4

主题

23

帖子

0

粉丝