關於bcd碼連續減1與顯示的問題!!! |
答題得分者是:阿信
|
cls9215
一般會員 發表:18 回覆:28 積分:9 註冊:2004-12-21 發送簡訊給我 |
請教各位前輩先進: 如同之前請教阿信前輩的問題,若我有"10011001"(99)這樣的bcd碼設值,應該如何連續減1,然後將減1的結果顯示於七段顯示器上呢?? 我有利用阿信所教導的方式(bcd+99h)的方式來完成減1的程式.....如下程式所示,但是當程式執行時,只能顯示"xxx8"(我目前先試個位數值的減一結果),就停在那了,無法繼續減1,我如果將數值改成"10010111"(97),程式執行時也是顯示"xxx6"就停了....不知道問題發生在哪?? 我也試過將將bcd-1的程式放到計時中斷裡run,雖然值會變動,但是似乎只有顯示單數("xxx7">>"xxxx5">>"xxx1">>"xxx0"),而且會影響七段顯示器的顯示(閃爍).....我真的好困惑!! ,能煩請前輩先進指點一下嗎??感激不進!! < class="code">
com1 reg p1.4 ;掃描線1
com2 reg p1.5 ;掃描線2
com3 reg p1.6 ;掃描線3
com4 reg p1.7 ;掃描線4
dorbuf equ 31h ;解碼器數值暫存器
dig1 equ 20h ;七段顯示器第一個位元資料暫存器
dig2 equ 21h ;七段顯示器第二個位元資料暫存器
dig3 equ 22h ;七段顯示器第三個位元資料暫存器
dig4 equ 23h ;七段顯示器第四個位元資料暫存器
result equ 24h ;解碼器副程式轉換結果資料暫存器
;==========================================
org 0000h
ajmp main
;======================
org 000bh ;計時中斷0
mov th0,#0f8h ;2ms中斷
mov tl0,#30h
call display ;每2ms將dig1~dig4的資料顯示於四位數七段顯示器
reti
;=======================
main:
setb com1 ;關閉所有掃描線
setb com2
setb com3
setb com4
mov tmod,#00000001b ;設定計時器工作於模式0
mov th0,#0f8h ;2ms計時
mov tl0,#30h
setb ea ;全域中斷致能
setb et0 ;計時器0中斷致能
setb tr0 ;啟動計時器0
mov dig1,#0c0h ;設定七段顯示器顯示"0000"
mov dig2,#0c0h
mov dig3,#0c0h
mov dig4,#0c0h
;============================
mov r0,#10011001b ;表示為"99"的bcd碼
loop mov a,r0 ;將bcd碼值-1
mov r1,a
mov r2,#99h
mov a,r1
add a,r2
clr c
mov r0,a
da a
anl a,#0fh ;遮沒高4bit
mov dorbuf,a
call d_or ;將減1後的bcd碼丟入解碼器副程式
mov dig4,result ;將轉換後的字型碼送至dig4,使七段顯示器顯示
call delay2
mov a,dig4 ;判斷dig4是否顯示"0"
cjne a,#0c0h,ok
ok2 mov r0,#10011001b ;使r0回復至"99"(bcd)
ok ajmp loop
;====================================== ;==========================================
;資料顯示副程式
;==========================================
display:
clr com1
setb com2
setb com3
setb com4
mov p3,dig1
call delay
setb com1
clr com2
setb com3
setb com4
mov p3,dig2
call delay
setb com1
setb com2
clr com3
setb com4
mov p3,dig3
call delay
setb com1
setb com2
setb com3
clr com4
mov p3,dig4
call delay
ret
;==========================================
;解碼器副程式
;==========================================
d_or mov a,dorbuf
cjne a,#00h,d0
mov result,#0c0h
ajmp d9
d0 cjne a,#01h,d1
mov result,#0f9h
ajmp d9
d1 cjne a,#02h,d2
mov result,#0a4h
ajmp d9
d2 cjne a,#03h,d3
mov result,#0b0h
ajmp d9
d3 cjne a,#04h,d4
mov result,#99h
ajmp d9
d4 cjne a,#05h,d5
mov result,#92h
ajmp d9
d5 cjne a,#06h,d6
mov result,#82h
ajmp d9
d6 cjne a,#07h,d7
mov result,#0f8h
ajmp d9
d7 cjne a,#08h,d8
mov result,#80h
ajmp d9
d8 cjne a,#09h,d9
mov result,#90h
d9 ret
;==========================================
delay mov r6,#5
dl12 mov r7,#200
dl22 djnz r7,dl22
djnz r6,dl12
ret
delay2 mov r6,#250
dl122 mov r7,#250
dl222 djnz r7,dl222
djnz r6,dl122
ret
end
|
㊣
版主 發表:261 回覆:2302 積分:1667 註冊:2005-01-04 發送簡訊給我 |
看一下你的處理,好像有點麻煩...(程式我沒全看)
你可以考慮用兩個變數來存個位數與拾位數.個位數=0後,直接拾位數減一,個位
數就丟9.都等於0後兩個都丟9. 要顯示時可分開(用兩個port直接丟),或把拾位數*16,再與個位數相加丟到一個
port顯示.
------
------------------------------------------------------------------------- 走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!? |
cls9215
一般會員 發表:18 回覆:28 積分:9 註冊:2004-12-21 發送簡訊給我 |
版主大大說的是可以....但是前提就是bcd碼還是必須連續減1,而且減一後的值必須介於00h~09h之間,而我目前的程式似乎只減了1次就停住了,但是我覺得loop應該會一直run才是,但是不知道為何不行....我曾經懷疑是不是計時中斷每2ms動作的時間太快了所造成的,但是將bcd值減一的程式放進計時中斷程式裡,雖然在七段顯示器上看見數值在變動,但是似乎不是在執行減一的動作....而且delay的時間會影響七段顯示器掃描顯示的問題!!! 至於用兩個port輸出也是可以,但是目前我的系統,不只做四位數倒數的功能,還有其他部分會用到io port,所以我才會想說丟給七段顯示器的資料線限制為1個byte(port 3)...... 還是感謝版主大大的建議....謝謝您!!!
|
㊣
版主 發表:261 回覆:2302 積分:1667 註冊:2005-01-04 發送簡訊給我 |
把計時中斷移開看看吧....中斷我不習慣這樣寫...
通常我會這樣寫:
;========================================== org 0000h ajmp main ;========================================== org 000bh ;計時中斷0 jmp t0_inv ;======================= org 0030h main: jmp main t0_inv: reti end
------
------------------------------------------------------------------------- 走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!? |
cls9215
一般會員 發表:18 回覆:28 積分:9 註冊:2004-12-21 發送簡訊給我 |
|
㊣
版主 發表:261 回覆:2302 積分:1667 註冊:2005-01-04 發送簡訊給我 |
|
阿信
版主 發表:111 回覆:983 積分:813 註冊:2005-03-10 發送簡訊給我 |
有幾個問題呀! 1.
mov r0,a da a這兩行 你不覺得有什麼問題嗎! 順序! 先da a 再mov r0,a 這樣 知道嗎! 2. BCD減1寫成這樣比較好 mov a,r0 ;BCD減1 add a,#99h da a mov r0,a3. 中斷程式中 沒有在用Delay的啦! 而且你還Delay了2mS 共4次合計8mS 主程式無法執行了! 所以你才會看到只減1次 4. 人眼的視覺暫留約1/16秒 所以 2mS一次有點快 20mS會是個好選擇 有4條掃描線 每5mS掃一條就夠了 加下面這行 com_sel equ 25h ;掃描線選擇改5mS中斷一次 mov th0,#0ECh ;5ms中斷 mov tl0,#078h中斷中 避免使用call 中斷改成這樣 org 000bh ;計時中斷0 ajmp t0_int org 0030h ------------------------------- t0_int: mov th0,#0ECh ;5ms中斷 mov tl0,#078h cjne com_sel,1,$ 2 ;依com_sel的值 jmp t0_int_com1 ;決定那條掃描線 cjne com_sel,2,$ 2 jmp t0_int_com2 cjne com_sel,3,t0_int_com4 jmp t0_int_com3 t0_int_com1: clr com1 setb com2 setb com3 setb com4 mov p3,dig1 mov com_sel,#2 reti t0_int_com2: setb com1 clr com2 setb com3 setb com4 mov p3,dig2 mov com_sel,#3 reti t0_int_com3: setb com1 setb com2 clr com3 setb com4 mov p3,dig3 mov com_sel,#4 reti t0_int_com4: setb com1 setb com2 setb com3 clr com4 mov p4,dig4 mov com_sel,#1 reti一路寫下來 感覺有點亂 你把它整理之後 修改程式碼 再po上來 並看看程式的執行 ------------------- 美好的事物 稍縱即逝 發表人 - 阿信 於 2005/06/05 18:29:28 |
㊣
版主 發表:261 回覆:2302 積分:1667 註冊:2005-01-04 發送簡訊給我 |
|
暗黑破壞神
版主 發表:9 回覆:2301 積分:1627 註冊:2004-10-04 發送簡訊給我 |
|
cls9215
一般會員 發表:18 回覆:28 積分:9 註冊:2004-12-21 發送簡訊給我 |
各位前輩先進:
我依照阿信前輩所提供的方法測試....但是組譯時會產生錯誤,我將我的程式改成如下....目前可以由8>>7>>6>>5>>4>>3>>2>>1>>0倒數....但是只有七段顯示器的最後一位數顯示,其他三位數都不會點亮....我覺得問題應該是display副程式delay的問題....但是加上delay又會和之前一樣程式停在"xxx8"....不加上delay又只會顯示第四個位數....請教前輩,應該如何修正這個問題??
com1 reg p1.4 ;掃描線1 com2 reg p1.5 ;掃描線2 com3 reg p1.6 ;掃描線3 com4 reg p1.7 ;掃描線4 dorbuf equ 31h dig1 equ 20h dig2 equ 21h dig3 equ 22h dig4 equ 23h result equ 24h ;========================================== org 0000h ajmp main ;====================== org 000bh ;計時中斷0 mov th0,#0ech ;5ms中斷 mov tl0,#078h call display reti ;======================= main: mov p1,#00001111b ;初始狀態設定 setb com1 ;關閉所有掃描線 setb com2 setb com3 setb com4 mov tmod,#00000001b ;設定計時器工作於模式0 mov th0,#0ech ;5ms中斷 mov tl0,#078h setb ea ;全域中斷致能 setb et0 ;計時器0中斷致能 setb tr0 ;啟動計時器0 mov dig1,#0c0h mov dig2,#0c0h mov dig3,#0c0h mov dig4,#0c0h mov r0,#10011001b loop mov a,r0 ;BCD減1 add a,#99h da a mov r0,a anl a,#0fh mov dorbuf,a call d_or mov dig4,result call delay2 mov a,dig4 cjne a,#0c0h,ok ajmp ok2 ok ajmp ty ok2 mov r0,#10011001b ty ajmp loop ;====================================== ;========================================== display: clr com1 setb com2 setb com3 setb com4 mov p3,dig1 setb com1 clr com2 setb com3 setb com4 mov p3,dig2 setb com1 setb com2 clr com3 setb com4 mov p3,dig3 setb com1 setb com2 setb com3 clr com4 mov p3,dig4 ret ;========================================== d_or mov a,dorbuf cjne a,#00h,d0 mov result,#0c0h ajmp d9 d0 cjne a,#01h,d1 mov result,#0f9h ajmp d9 d1 cjne a,#02h,d2 mov result,#0a4h ajmp d9 d2 cjne a,#03h,d3 mov result,#0b0h ajmp d9 d3 cjne a,#04h,d4 mov result,#99h ajmp d9 d4 cjne a,#05h,d5 mov result,#92h ajmp d9 d5 cjne a,#06h,d6 mov result,#82h ajmp d9 d6 cjne a,#07h,d7 mov result,#0f8h ajmp d9 d7 cjne a,#08h,d8 mov result,#80h ajmp d9 d8 cjne a,#09h,d9 mov result,#90h d9 ret ;========================================== delay mov r6,#5 dl12 mov r7,#200 dl22 djnz r7,dl22 djnz r6,dl12 ret delay2 mov r5,#10 fg mov r6,#250 dl122 mov r7,#250 dl222 djnz r7,dl222 djnz r6,dl122 djnz r5,fg ret end |
阿信
版主 發表:111 回覆:983 積分:813 註冊:2005-03-10 發送簡訊給我 |
你都沒好好看我寫的內容耶 XD
cjne的部分有誤要修改 1.請加這行 好嗎!
com_sel equ 25h ;掃描線選擇2.display副程式請改成下面這樣! display: push acc mov a,com_sel cjne a,1,$ 2 ;依com_sel的值 jmp t0_int_com1 ;決定那條掃描線 cjne a,2,$ 2 jmp t0_int_com2 cjne a,3,t0_int_com4 jmp t0_int_com3 t0_int_com1: clr com1 setb com2 setb com3 setb com4 mov p3,dig1 mov com_sel,#2 pop acc ret t0_int_com2: setb com1 clr com2 setb com3 setb com4 mov p3,dig2 mov com_sel,#3 pop acc ret t0_int_com3: setb com1 setb com2 clr com3 setb com4 mov p3,dig3 mov com_sel,#4 pop acc ret t0_int_com4: setb com1 setb com2 setb com3 clr com4 mov p4,dig4 mov com_sel,#1 pop acc ret------------------- 美好的事物 稍縱即逝 發表人 - 阿信 於 2005/06/06 11:43:15 |
foreman
高階會員 發表:3 回覆:124 積分:190 註冊:2004-09-10 發送簡訊給我 |
只要更改display副程式及可
nshow equ 25H display: push acc mov p3,#0 mov a,nshow anl a,#3 cjne a,#0,display1 clr com1 setb com2 setb com3 setb com4 mov p3,dig1 jmp display4 dsiplay1: cjne a,#1,display2 setb com1 clr com2 setb com3 setb com4 mov p3,dig2 jmp display4 dsiplay2: cjne a,#2,display3 setb com1 setb com2 clr com3 setb com4 mov p3,dig3 jmp display4 dsiplay3: setb com1 setb com2 setb com3 clr com4 mov p3,dig4 dsiplay4: inc nshow POP ACC ret |
cls9215
一般會員 發表:18 回覆:28 積分:9 註冊:2004-12-21 發送簡訊給我 |
對不起大大,事實上你說的我有詳細看過,也有修正cjne錯誤的的地方...只是組譯時會有錯誤,目前我將程式改成前輩說的那樣....如下程式所示,但是只有第一個位數的七段顯示器會亮,其他三個都不會動作,我想會不會是程式又卡在主程式??
com1 reg p1.4 ;掃描線1 com2 reg p1.5 ;掃描線2 com3 reg p1.6 ;掃描線3 com4 reg p1.7 ;掃描線4 dorbuf equ 31h dig1 equ 20h dig2 equ 21h dig3 equ 22h dig4 equ 23h result equ 24h com_sel equ 25h ;========================================== org 0000h ajmp main ;====================== org 000bh ;計時中斷0 mov th0,#0ech ;20ms中斷 mov tl0,#078h call display reti ;======================= main: mov p1,#00001111b ;初始狀態設定 setb com1 ;關閉所有掃描線 setb com2 setb com3 setb com4 mov tmod,#00000001b ;設定計時器工作於模式0 mov th0,#0ech ;20ms中斷 mov tl0,#078h setb ea ;全域中斷致能 setb et0 ;計時器0中斷致能 setb tr0 ;啟動計時器0 mov dig1,#0c0h mov dig2,#0c0h mov dig3,#0c0h mov dig4,#0c0h mov r0,#10011001b loop mov com_sel,#1 mov dig1,#0c0h mov com_sel,#2 mov dig2,#0c0h mov com_sel,#3 mov dig3,#0c0h mov a,r0 ;BCD減1 add a,#99h da a mov r0,a anl a,#0fh mov dorbuf,a call d_or mov com_sel,#4 mov dig4,result call delay2 mov a,dig4 cjne a,#0c0h,ok ajmp ok2 ok ajmp ty ok2 mov r0,#10011001b ty ajmp loop ;====================================== ;========================================== display: push acc mov a,com_sel cjne a,#1,$ 2 ;依com_sel的值 jmp t0_int_com1 ;決定那條掃描線 cjne a,#2,$ 2 jmp t0_int_com2 cjne a,#3,t0_int_com4 jmp t0_int_com3 t0_int_com1: clr com1 setb com2 setb com3 setb com4 mov p3,dig1 mov com_sel,#2 pop acc ret t0_int_com2: setb com1 clr com2 setb com3 setb com4 mov p3,dig2 mov com_sel,#3 pop acc ret t0_int_com3: setb com1 setb com2 clr com3 setb com4 mov p3,dig3 mov com_sel,#4 pop acc ret t0_int_com4: setb com1 setb com2 setb com3 clr com4 mov p3,dig4 mov com_sel,#1 pop acc ret ;========================================== d_or mov a,dorbuf cjne a,#00h,d0 mov result,#0c0h ajmp d9 d0 cjne a,#01h,d1 mov result,#0f9h ajmp d9 d1 cjne a,#02h,d2 mov result,#0a4h ajmp d9 d2 cjne a,#03h,d3 mov result,#0b0h ajmp d9 d3 cjne a,#04h,d4 mov result,#99h ajmp d9 d4 cjne a,#05h,d5 mov result,#92h ajmp d9 d5 cjne a,#06h,d6 mov result,#82h ajmp d9 d6 cjne a,#07h,d7 mov result,#0f8h ajmp d9 d7 cjne a,#08h,d8 mov result,#80h ajmp d9 d8 cjne a,#09h,d9 mov result,#90h d9 ret ;========================================== delay mov r6,#5 dl12 mov r7,#200 dl22 djnz r7,dl22 djnz r6,dl12 ret delay2 mov r5,#10 fg mov r6,#250 dl122 mov r7,#250 dl222 djnz r7,dl222 djnz r6,dl122 djnz r5,fg ret end |
cls9215
一般會員 發表:18 回覆:28 積分:9 註冊:2004-12-21 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |