|
为什么实际结果和模拟结果不一样,汇编代码(已注释)
[复制链接]
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
希望高手们能详细的讲解一下这段程序的模拟运行顺序,为什么实际的结果跟模拟的结果不一样
|
|