第一个问题:双周期指令,第二周期读的是操作数,只有在第一周期读操作码的,而有几条指令是单字节的,也需要两个周期,这不是浪费时间,是因一个周期是不能完成的,这不是你想像的那样。
第二个问题:要做计时,不管是倒计时还是正常计时,用延迟函数来做,这种方法计时是不准确的,只有用定时器才比较准确。
第三个问题:你不要求计时准确,就想用延迟函数来做也可以,那为什么两位会一闪一闪的,是因为在调用延迟函数时不能完成显示的,也就是不能同时调用显示函数了,所以,就不显示了,而等到延时到了才能再调显示子函数,这样,显示的间隔长了,就会闪烁了。
第四个问题:是很好解决的,其实在调用显示子函数时也是等于在延迟,因为显示一位一般要延时1ms的,显示两位就延时2ms,可以写一个延时1ms的函数。这样,就不用另外调用其它的延时函数了。反复调用显示函数,调用一次就延时2ms,然后对调用显示函数计数,调用500次就是1秒了,这是大约的时间,因不准确。有了1秒的时间,剩下的问题你会解决了吧。
时间,是故意浪费的。
双周期指令,都是针对片外RAM(或IO接口)的。
当年,它们的工作速度,明显跟不上 CPU 的速度。
如果 CPU 没有在这里《等待》一下,就必须在电路上,增加一个部分,强迫单片机,停顿一下。
你去看看 80x86 CPU 的等待周期,是怎么插入的,就知道了。--都是用外接电路,来完成的。
-----------
两位的只能用定时器,中断去做...
你的程序呢?
其实单片机编程 没有那么要考虑得这么复杂,
用延迟函数做数码管显示 & 定时器中断做数码管显示 都一样,
只是 要使 数码管显示 不一闪一闪,只要 每个数码管 在 一秒钟内显示 大于 50 次
用中断显示参考 汇编在追问里
http://zhidao.baidu.com/question/541524005.html#answer-1368058655
用延时
ORG 00H
SJMP STAR
ORG 1BH
SJMP TIS; 转T1中断服务程序
ORG 30H
STAR:MOV R2,#60H; 倒计时初值
MOV R4,#100; 定时中断溢出计数器
STA1:ACALL DIS; 调用显示子程序
SJMP STA1
SEG7:INC A; A的值加一
MOVC A,@A+PC; 取显示断段
RET
DB 0C0H,0F9H,0A4H,0B0H; 0至3的共阳型显示码
DB 99H,92H,82H,0F8H; 4至7的共阳型显示码
DB 80H,90H,88H,83H; 8至B的共阳型显示码
DB 0C6H,0A1H,86H,8EH; C至F的共阳型显示码
DIS: MOV A,R2; 单字节十六进制数转为十进制数
ANL A,#0FH
ACALL SEG7
SETB P2.0
CPL A
MOV P1,A; 显示十位
CLR P2.1
ACALL DLY0
MOV A,R2
SWAP A
ANL A,#0FH
ACALL SEG7
SETB P2.1
CPL A
MOV P1,A; 显示个位
CLR P2.0
ACALL DLY0
RET; 子程序返回
DLY0:MOV R6,#20 ; 10 mS 12MHz
DLY1:MOV R5,#250 ; 延时
DJNZ R5,$
DJNZ R6,DLY1
DJNZ R4,DLY8; 定时1S到否
MOV R4,#100; 到1S,重置R4=100
MOV A,R2
ADD A,#99H ; 倒计时递减
DA A
MOV R2, A
DLY8:RET; 子程序返回
END