看板 ASM 關於我們 聯絡資訊
最近開始在學習8051,現在有一些疑惑 希望有人可以幫我解答 感謝 前提 我的PORT一直在讀取一個變數 現在要輸出到LCD上 這個我都已經寫好了 但是怕誤差我想加上一個平均的寫法 假設15次平均後在輸出一次 問題一 考慮到溢位 我是想說把第一次的先存起來丟旁邊 再利用第二次輸入的與第一次輸入相減 第三次輸入的與第一次輸入相減...最後累加差值/15 在與第一次相加 可得平均數 可是我看了一下減法的程式跑法 SUBB 如果是負號他是利用CY來標記 那如果我把他們的差值移動到其他地方會不會系統就搞混?(是失真嗎?意思是差值變了 就是差值得正負在移動後會不會亂掉 我同學說會可是我感覺應該不會才對@@" 問題二 ADD,ADDC有人可以具體的描述他們的差異嗎 有方法可以讓我直接把數值拆開然後累加嗎 可是我考慮到累積15次...還是會有溢位的可能性 所以有人有更好的方法嗎? 能看到這行..真的感謝各位的幫忙.. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.125.93.19
odahawk:問題二。用兩個記憶區,加一次判斷是否大於某值就進位 03/21 22:34
eternal1879:判斷如果C的話我知道用if寫 組合語言判斷溢位 有好的 03/21 22:43
eternal1879:寫法嗎? 03/21 22:43
mepass:你可以先判斷大小 大的放一邊 小的放一邊 03/22 00:00
mepass:要加減的時候再統一取正負 03/22 00:00
mepass:比如說 i2>i1就取i2-i1放到正的暫存器 03/22 00:01
mepass: i3<i1就取i1-i3放到負的暫存器 03/22 00:02
mepass:這邊說的正負 是指後面相加減的時候你取的正負號 03/22 00:02
mepass:add addc差別是一個溢位後會有旗標 簡單講就是表示進位 03/22 00:05
mepass:就好比兩個個位數相加超過十會進一位一樣 03/22 00:06
mepass:如果要把兩個8bit暫存器合起來變成一個16bit暫存器 03/22 00:06
mepass:你就需要那個進位旗標 詳細作法應該書上都會有 03/22 00:07
mepass:8051的書找不到就去找8086的看看 03/22 00:07
stool100:問題一. 你可以把(新值*14+舊值)/15 放入舊值 03/22 01:45
ksmrt0123:你會用8-bit指令做出16-bit加法嗎? 03/22 13:59
ksmrt0123:平均還是累加後再除比較好做, 最好取2的冪次方個再平均 03/22 14:01
ksmrt0123:如除16可用右移4 bit完成 03/22 14:02
感謝大家給我的想法 目前是利用 時脈一直讀取 A B C D E...一直跑N個 讀取A之後先存到一邊 B判斷 B>A B-A 得差值存到一邊(正) B<A A-B 得差值存到一邊(數值為正,但意義上應該是負) C D E..等等同B的計算方法 差值正的累加得到X 差值負的累加得到Y 再次判斷差值X>Y (X-Y)/N+A X<Y A-(Y-X)/N 比大小是利用SUBB看CY是1或0來跑 利用JC決定放哪邊 有關2的N次方我之前有想過 可是我不會16BIT的加減法 有人要教我一下嗎 感覺利用16BIT的寫法會比較快一點 之前我是想說如果取2的一次方的數量 RR1次 2的二次方的數量 RR2次 2的三次方的數量 RR3次來計算平均 可是我只知道用ADD來計算 可是這樣會使A溢位 也想過利用類似邏設的半加法的方法..可是這樣要寫很多迴圈 16BIT是利用這樣寫嗎..? 應該不是吧... ※ 編輯: eternal1879 來自: 59.125.93.19 (03/22 16:09)
kissy:印象中溢不溢位用組語來寫的話,可以靠STATUS來判斷 ? 03/22 17:16
joy830:你讀取的是什麼東西? 如果是A/D 03/23 01:56
joy830:已經自動平均了 只要把讀取頻率調低 自然會平均多一點 03/23 01:56