3074|8

1

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

为什么实际结果和模拟结果不一样,汇编代码(已注释) [复制链接]

ORG 00H
START:
        MOV R4,#00H             ;保存键码待判断是否松开键
        CLR P3.7                ;第一个右边的数码管打开
L1:
        MOV R3,#0F7H            ;扫描初值(P1.3 = 0)
        MOV R1,#00H             ;记录按键位置
L2:
        MOV A,R3               
        MOV P1,A                ;将扫描值输出至P1
        MOV A,P1                ;读入P1值,判断是否有键按下
        MOV R4,A                ;保存键值,待判断是否松开键
        SETB C                  ;设置C=1
        MOV R5,#04H             ;扫描高4位键的列P1.4~P1.7
L3:
        RLC A                   ;键值左移一位
        JNC KEY                 ;有键按下C=0,跳转到KEY
        INC R1                  ;没键按下,RI自增1
        DJNZ R5,L3              ;4列扫描是否完毕
        MOV A,R3                ;扫描值载入
        SETB C                  ;C=1
        RRC A                   ;扫描低4位,右移一位,下一行
        MOV R3,A                ;保存右移一位后下一行的键值
        JC L2                   ;C=1,程序跳至L2处执行
        JMP L1                  ;C=0,则4行已扫描完毕
KEY:
        ACALL DELAY             ;消抖
D1:
        MOV A,P1                ;再读入此时的键值
        XRL A,R4                ;如果现在的值得于之前按下的值一样就没松开键
        JZ D1                   ;A!=0表示按键以松开,往下执行
        MOV A,R1                ;把记录到的键值位载入A
        ACALL DISP              ;调用显示子程序
        JMP L1                  ;返回重新开始
DISP:
        MOV DPTR,#TABLE         ;取得TABLE的内存地址
        MOVC A,@A+DPTR          ;取TABLE中的码
        MOV P0,A                ;输出
        RET                     ;返回
DELAY:                           ;消抖延时子程序
        MOV R7,#60              
DLY1:        MOV R6,#248

        DJNZ R6,$
        DJNZ R7,DLY1
        RET
TABLE:
        DB 0C0H, 0F9H, 0A4H, 0B0H
        DB 99H,  92H,  82H,  0F8H
        DB  80H,  90H,  88H,  83H
        DB  0C6H,  0A1H, 86H, 8EH
END                             ;程序结束

;P1.0~P1.3接行键盘
;P1.4~P1.7接列键盘
;P3数码管
;P0口对应数码管的ABCDEFG DP


假如我按下图中F键盘得到的键值就是11101110 = 0EEH
然后把这个值在代码中的红色的地方MOV A,P1改成MOV A,#0EEH 设置我按下的F键值
然后为什么自己模拟出来的时候结果查到的表值是3 而且这个表是跟按键位置一一对应的,我把程序烧到单片机上的时候按下F键盘,输出显示的也是表中的F
而自己模拟程序运行的时候怎么得出来的结构却是3 这是为什么呢
如果要模拟的话就需要把MOV A,P1改成 MOV A,#0EEH

D1:
        MOV A,P1               
         MOV A,#0F7H             ;和修改这里,代表松开按键,这样才可以模拟
        XRL A,R4
希望高手们能详细的讲解一下这段程序的模拟运行顺序,为什么实际的结果跟模拟的结果不一样

最新回复

不好意思 重新看了下 运行正确就OK了啊  详情 回复 发表于 2010-4-14 09:43
点赞 关注

回复
举报

1

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
看不到图片
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
没看懂怎么模拟的
感觉这程序不管那个键按下显示的都是小于3的数
好像只把R1作为取数索引有问题啊

把这一句MOV A,R1 ;把记录到的键值位载入A
改成这个试试
MOV A,4;
SUB A,R5;
MOV R5,A;
MOV A,4;
MUL A,R1;
ADD A,R5;
好久没写汇编了,不知对不对,不对的话楼主自己看看
就是索引为4*R1+(4-R1)不知对否
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

4
 
是4*R1+(4-R5)
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

5
 
是4*R1+(4-R5)
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

6
 
引用 3 楼 sytu_chyq 的回复:
没看懂怎么模拟的
感觉这程序不管那个键按下显示的都是小于3的数
好像只把R1作为取数索引有问题啊

把这一句MOV A,R1 ;把记录到的键值位载入A
改成这个试试
MOV A,4;
SUB A,R5;
MOV R5,A;
MOV A,4;
MUL A,R1;
ADD A,R5;
好久没写汇编了,不知对不对,不对的话楼主自己看看
就是索引为4*R1+(4-R1)不知对否


为什么`这样写呢`其实`这段代码直接烧到单片机上是完全正确的`
就是不知道为什么自己模拟程序的运行的时候`结果却不一样.
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

7
 
这样模拟好像没啥意义啊
MOV R3,#0F7H ;扫描初值(P1.3 = 0)
程序扫描是从P1.3 = 0开始的
所以不会马上得到
MOV A,#0EEH
前三行的扫描都被你忽略了吧
应该是这样的
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

8
 
UPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUP
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

9
 
不好意思
重新看了下
运行正确就OK了啊
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表