Re: [問題] 請問各位先進一個組合bit的問題
我想來騙點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
推
07/11 03:19, , 1F
07/11 03:19, 1F
※ 編輯: ruemann 來自: 219.87.156.98 (07/11 09:29)
討論串 (同標題文章)
完整討論串 (本文為第 4 之 5 篇):
ASM 近期熱門文章
PTT數位生活區 即時熱門文章