作者ruemann (此人挂网中……)
看板ASM
标题Re: [问题] 请问各位先进一个组合bit的问题
时间Wed Jul 11 02:48:24 2007
我想来骗点p币,顺便跟大家一起讨论,以下是 ck1362 寄给我的部份内容:
-----------------------------信件内容分隔线-----------------------------------
先假设有两只脚P1.0与P1.1
首先P1.0收到信号,这时计时器0开始执行上数的动作(从0000F开始)
接下来当P1.1收到信号时,执行中断程式(这里可能直接用INT0的外部中断来做)
而中断程式执行,对目前计时器0所计数出来的值作运算
也就是从接收到一个信号到另外一个信号发生为止
总共经过了多少的时间
而再将这时间给输出至七段显示器上作输出显示
所以目前的问题就是在计时器0所计时出来的东西
是分别由TH0与TL0所储存
而我现在不知道该如何将这两个数值给"合并"
如果依照十六进位转十进位的方法
可以用0000F=>16^3+16^2+16^1+16^0 这样来得到
但是我发现如果只是单纯的将两个暂存器分别乘上一个数
用MUX这指令...又会将值给分配到A跟B这两个暂存器..囧>
所以不知道有什麽方法可以解决这问题@@?
-----------------------------我的想法分隔线-----------------------------------
我认为原po只是单纯想把16bits的值给显示到LED上而已,但不知道要如何合并,
例如将 0x162E 给显示成 5678,下面给出步骤。
首先要知道的是七段显示器只能显示到9,所以一个bytes的资料最多能显示到99
然後16bits最多能显示成65535,所以必须用3个bytes来储存值
MOV DEC01, #0 ; 个位和十位
MOV DEC23, #0 ; 百位和千位
MOV DEC4, #0 ; 万位
MOV TMP1, #0
; 将 TH0 及 TL0 用三个bytes来存
MOV DEC01, TL0
MOV TMP1, TH0
CHECK_DEC01:
MOV A, DEC01
CJNE A, #100, $+3
JC CHECK_TMP1 ; 若 DEC01<=99 则检查TMP1是否有值
SUBB A, #100 ; DEC01 - 100 ( C已为0 )
MOV DEC01, A ; 余数存回DEC01以便下次检查
INC DEC23 ; 百位数+1
CHECK_DEC23_P: ; 检查是否已超过最大千位数了
MOV A, DEC23
CJNE A, #100, $+3
JC CHECK_DEC01 ; 若 DEC23<=99 则继续检查 DEC01
SUBB A, #100
MOV DEC23, A
INC DEC4
SJMP CHECK_DEC01 ; 继续检查
CHECK_TMP1:
MOV A, TMP1
JZ CHECK_FINISH ; 若TMP1==0,则结束检查
INC DEC23 ; 百千位数先+1
DEC TMP1 ; 将TH0的值扣1,并加到DEC01上
MOV A, DEC01
CLR C
ADD A, #156 ; 因为百千位数已先+1,故扣100
; 原来是写成155,脑残……
MOV DEC01, A ; 之前还忘了存回去……OTZ
SJMP CHECK_DEC01
CHECK_FINISH: ; 目前DEC01=0~99, DEC23=0~99, DEC4=0~6
; 接下来只要将DEC01, DEC23, DEC4 转成BCD就可以
; 显示了
--
测试过了,结果正确,感谢MasterChang提醒,不过我是偷用KeilC
绝对有地方可以加速的,有空再想…
--
我是路人甲
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 203.67.247.44
1F:推 MasterChang:有时候,真不知道怎麽写,就用SDCC偷跑看看... 07/11 03:19
※ 编辑: ruemann 来自: 219.87.156.98 (07/11 09:29)