線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1393
推到 Plurk!
推到 Facebook!

關於bcd碼連續減1與顯示的問題!!!

答題得分者是:阿信
cls9215
一般會員


發表:18
回覆:28
積分:9
註冊:2004-12-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-06-04 18:13:01 IP:61.70.xxx.xxx 未訂閱
請教各位前輩先進:    如同之前請教阿信前輩的問題,若我有"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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-06-04 21:25:37 IP:220.134.xxx.xxx 未訂閱
看一下你的處理,好像有點麻煩...(程式我沒全看) 你可以考慮用兩個變數來存個位數與拾位數.個位數=0後,直接拾位數減一,個位 數就丟9.都等於0後兩個都丟9. 要顯示時可分開(用兩個port直接丟),或把拾位數*16,再與個位數相加丟到一個 port顯示.
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
cls9215
一般會員


發表:18
回覆:28
積分:9
註冊:2004-12-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-06-04 21:57:00 IP:61.70.xxx.xxx 未訂閱
版主大大說的是可以....但是前提就是bcd碼還是必須連續減1,而且減一後的值必須介於00h~09h之間,而我目前的程式似乎只減了1次就停住了,但是我覺得loop應該會一直run才是,但是不知道為何不行....我曾經懷疑是不是計時中斷每2ms動作的時間太快了所造成的,但是將bcd值減一的程式放進計時中斷程式裡,雖然在七段顯示器上看見數值在變動,但是似乎不是在執行減一的動作....而且delay的時間會影響七段顯示器掃描顯示的問題!!!    至於用兩個port輸出也是可以,但是目前我的系統,不只做四位數倒數的功能,還有其他部分會用到io port,所以我才會想說丟給七段顯示器的資料線限制為1個byte(port 3)......    還是感謝版主大大的建議....謝謝您!!!

版主


發表:261
回覆:2302
積分:1667
註冊:2005-01-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-06-04 22:09:26 IP:220.134.xxx.xxx 未訂閱
把計時中斷移開看看吧....中斷我不習慣這樣寫... 通常我會這樣寫:    
;==========================================
         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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-06-04 22:21:50 IP:61.70.xxx.xxx 未訂閱
可是把計時中斷移開....七段顯示器掃描顯示不就會delay的更嚴重??(隨倒數計時間格延遲時間)

版主


發表:261
回覆:2302
積分:1667
註冊:2005-01-04

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-06-04 22:42:30 IP:220.134.xxx.xxx 未訂閱
我只是叫你把它移到程式尾端ㄟ......... 看清楚我說的,ok?這樣並不影響你整個程式流程......
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
阿信
版主


發表:111
回覆:983
積分:813
註冊:2005-03-10

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-06-05 13:23:13 IP:220.228.xxx.xxx 未訂閱
有幾個問題呀!    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,a
3. 中斷程式中 沒有在用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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-06-05 13:37:33 IP:220.134.xxx.xxx 未訂閱
注意!DA指令無法直接將Acc 的值轉為BCD碼,也不能配合減法指令使用,一定要配合ADD或ADDC指令使用,否則結果會有問題!
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-06-05 22:12:35 IP:210.66.xxx.xxx 未訂閱
唉。山不轉路轉。 幹嘛硬要搞 BCD 加減勒。 你要找函數,應可以找到一堆是 數字 -> bcd 的吧。 把 數字->bcd->led 這個寫成一個函數。 你的程式。只要去計算這個數字 我管你怎麼做BCD加減。 數字加減很好做吧。 。。。。。。。。。。。
cls9215
一般會員


發表:18
回覆:28
積分:9
註冊:2004-12-21

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-06-06 10:57:17 IP:211.20.xxx.xxx 未訂閱
各位前輩先進: 我依照阿信前輩所提供的方法測試....但是組譯時會產生錯誤,我將我的程式改成如下....目前可以由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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-06-06 11:28:03 IP:211.21.xxx.xxx 未訂閱
你都沒好好看我寫的內容耶 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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-06-06 11:30:59 IP:220.129.xxx.xxx 未訂閱
只要更改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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-06-06 13:23:14 IP:211.20.xxx.xxx 未訂閱
對不起大大,事實上你說的我有詳細看過,也有修正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

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-06-06 13:57:46 IP:211.20.xxx.xxx 未訂閱
抱歉...我知道問題在於我 mov com_sel,#1,這類的指令全部刪除就可以了....謝謝前輩指導...若有疑問在請教您!!
系統時間:2024-07-01 21:09:35
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!