痞酷網_PIGOO

 找回密碼
 立即註冊
!!! [系統偵測到廣告阻擋軟體] !!!

如果您覺得痞酷網對您有些許幫助,或者您認同痞酷網的理想,

那麼希望您將痞酷網設定為白名單.

並請在上論壇的時候,動動您的手指,用行動支持我們.

謝謝!
查看: 7464|回復: 11

最基礎的方式寫七段顯視器測試程序,求精簡!

[複製鏈接]
發表於 2012-7-5 13:27:36 | 顯示全部樓層 |閱讀模式
本帖最後由 fatzeros 於 2012-7-5 01:28 PM 編輯

以最基礎的方式寫七段顯視器測試程序,
基本上是以我上次介紹的學習單片機的進階工具:MCU 8051 IDE來完成的,
使用的是組合語言,以下是程序:

;/*----------------------------------------------------------------------------------------------
;  名稱:STC_15F204EA七段顯示器測試程序
;  編寫:沈大胖
;  日期:2012/07/04
;  修改:
;  內容:使用STC_15F204EA測試共陽七段顯示器,
;        使用P3.6,P3.7,P2.5,P2.4,P2.3,P2.2,P2.1,P2.1為七段之A~G
;        使用P3.1為共陽控制腳
;        模擬前,請先LOAD STC_15F204EA_7SEG_LED.vhc, VirtualHW->load->STC_15F204EA_7SEG_LED.vhc
;        按「F2」啟動模擬,按「F6」開始模擬
;-----------------------------------------------------------------------------------------------*/

;腳位功能定義

        SMG_LED EQU P3.1        ;定義七段顯視器控制腳為P3.1
        LED_A        BIT P2.1
        LED_B        BIT P3.6
        LED_C        BIT P2.0
        LED_D        BIT P2.2
        LED_E        BIT P2.4
        LED_F        BIT P2.3
        LED_G        BIT P2.5
        LED_H        BIT P3.7
        ;LED        DATA LED_A,LED_B,LED_C,LED_D,LED_E,LED_F,LED_G,LED_H

;程序開始
ORG 0000H
AJMP MAIN

ORG 0100H
MAIN:        CLR SMG_LED        ;主程序段,初始七段顯視器,使SMG_LED為低電位導通

SEG_A:        CLR LED_A         ;點亮LED_A,使LED_A為低電位點亮
        ACALL DELAY               ;呼叫延時程序
        CPL LED_A                       ;關閉LED_A,使LED_A為高電位
       
SEG_B:        CLR LED_B
        ACALL DELAY
        CPL LED_B

SEG_C:        CLR LED_C
        ACALL DELAY
        CPL LED_C

SEG_D:        CLR LED_D
        ACALL DELAY
        CPL LED_D

SEG_E:        CLR LED_E
        ACALL DELAY
        CPL LED_E

SEG_F:        CLR LED_F
        ACALL DELAY
        CPL LED_F

SEG_G:        CLR LED_G
        ACALL DELAY
        CPL LED_G

SEG_H:        CLR LED_H
        ACALL DELAY
        CPL LED_H
       
SEG_ALL:        CLR LED_A
                CLR LED_B
                CLR LED_C
                CLR LED_D
                CLR LED_E
                CLR LED_F
                CLR LED_G
                CLR LED_H
                ACALL DELAY
                CPL LED_A
                CPL LED_B
                CPL LED_C
                CPL LED_D
                CPL LED_E
                CPL LED_F
                CPL LED_G
                CPL LED_H

        DJNZ R7,SEG_A
        AJMP MAIN

;使用遞減暫存器R5及R6達成延時效果,暫存器R4為遞減循環次數
DELAY:        MOV R4,#1                  ;暫存器R4,循環A次
D1:        MOV R5,#1                          ;D1段,暫存器R5指定初始值為B,最大至255
D2:        MOV R6,#1                          ;D2段,暫存器R6指定初始值為C,最大至255
        DJNZ R6,$                          ;遞減暫存器R6初始值C
        DJNZ R5,$                          ;遞減暫存器R5初始值B
        DJNZ R4,D1                          ;遞減暫存器R4初始值A,如不為0時則跳至D1段
        RET                                  ;回主程序
END

我想問的是有沒有辦法把不同組的IO腳,當成是同一組來用,
或是這個程序有沒有辦法再簡化一點,

附上MCU 8051 IDE的專案檔,可直接套入並模擬。
STC_15F204EA_七段顯示器測試.zip (24.17 KB, 下載次數: 73)

評分

1

查看全部評分

發表於 2012-7-5 19:34:04 | 顯示全部樓層
遇到組合語言我就投降了!!
發表於 2012-7-5 19:57:07 | 顯示全部樓層
是蠻奇怪的,同一組七段顯示為什麼會有p3和p2交混使用
除非還有別的條件使用或是有預設其他控制在里面
因後段沒有直接定址使用,所以可以直接改成,
        LED_A        BIT P2.1
        LED_B        BIT P2.6  <-p3.6
        LED_C        BIT P2.0
        LED_D        BIT P2.2
        LED_E        BIT P2.4
        LED_F        BIT P2.3
        LED_G        BIT P2.5
        LED_H        BIT P2.7 <-p3.7
把另2腳在硬體接線上也要換位置,這並沒有太大的問題
至於簡化應該也沒太太必要,程式很小沒多少byte簡化是沒必要的
發表於 2012-7-6 06:01:07 | 顯示全部樓層
本帖最後由 cnpan 於 2012-7-6 05:11 AM 編輯

同時使用不同port bit會造成程式的複雜度,8bits組合語言無法同時處理在不同Byte的bit.
沒有必要就不要用.

如果全部用同一組port 2,用直接字組運算,
可以減少全部閃爍的位元運算 (-14行)減少bit設定8行.

MOV P2, #00H: clear p2
CALL DELAY
MOV P2, #FFH: set  p2 111111111

使用旋轉運算指令及條件運算,將port 各bit左移或右移(-14行)
MOV A, #FEH: set  A 011111111
SHIFT: MOV R4,#8H                  ;設定循環次數8次,暫存器R4 設為8
RL A
MOV P2,A
CALL DELAY
DJNZ R4,SHIFT                          ;遞減暫存器R4(初始值8),如不為0時則跳至SHIFT段


另外若DELAY 時間太長,使用使用計時器再用TIMER中斷可以增強運算不同PORT的能力,
 樓主| 發表於 2012-7-6 09:35:00 | 顯示全部樓層
本帖最後由 fatzeros 於 2012-7-6 09:51 AM 編輯

為什麼要使用不同的port,
主要是小弟異想天開的想把電路都接在同一邊上,
可以參考STC_15F204EA的腳位圖,
15F204EA_管腳圖.PNG
既然這樣作不是那麼的好,那麼就是從硬體上來改電路了,感謝legion兄,
這樣程序就簡單多了,可以使用查表的方式來作,實驗板附的程序有可以參考的,
還有我第一次看到可以使用shift的方式來達到流水燈的功能,感謝cnpan的指導,
我再來學中斷和timer的應用。

另外,由於延時段的程序是參考實驗板的程序修改的,
但是後面的注釋是我自己加的,
不知道我這樣的解釋對不對,謝謝謝謝!

;使用遞減暫存器R5及R6達成延時效果,暫存器R4為遞減循環次數
DELAY:        MOV R4,#1                  ;暫存器R4,循環A次
D1:        MOV R5,#1                          ;D1段,暫存器R5指定初始值為B,最大至255
D2:        MOV R6,#1                          ;D2段,暫存器R6指定初始值為C,最大至255
        DJNZ R6,$                          ;遞減暫存器R6初始值C
        DJNZ R5,$                          ;遞減暫存器R5初始值B
        DJNZ R4,D1                          ;遞減暫存器R4初始值A,如不為0時則跳至D1段
        RET                                  ;回主程序
 樓主| 發表於 2012-7-6 09:41:31 | 顯示全部樓層
antlu 發表於 2012-7-5 07:34 PM static/image/common/back.gif
遇到組合語言我就投降了!!

阿乾兄,
我介紹的這一套可以玩玩看喔,
學習單片機的進階工具:MCU 8051 IDE
可以看到程式在SRAM中是怎麼運作的,
還可以模擬簡單的硬體,
我個人覺得還不錯的啦!
發表於 2012-7-6 09:43:35 | 顯示全部樓層
使用遞減暫存器R5及R6達成延時效果,暫存器R4為遞減循環次數
DELAY:      
            MOV R4,#1                  ;暫存器R4,循環A次
D1:   
            MOV R5,#1                          ;D1段,暫存器R5指定初始值為B,最大至255
D2:   
            MOV R6,#1                          ;D2段,暫存器R6指定初始值為C,最大至255
           DJNZ R6,$                          ;遞減暫存器R6初始值C
           DJNZ R5,D2                         ;遞減暫存器R5初始值B
           DJNZ R4,D1                          ;遞減暫存器R4初始值A,如不為0時則跳至D1段
           RET                                  ;回主程序

這樣才是一般的循環動作
 樓主| 發表於 2012-7-6 09:51:06 | 顯示全部樓層
legion 發表於 2012-7-6 09:43 AM static/image/common/back.gif
使用遞減暫存器R5及R6達成延時效果,暫存器R4為遞減循環次數
DELAY:      
            MOV R4,#1          ...

感謝legion兄,
這樣寫比較容易看得懂多了。
發表於 2012-7-6 10:09:27 | 顯示全部樓層
其實不管那種語言,組合語言或C語言,有時在編輯時稍作排列整齊一下
就會在後面作DEBUG時方便很多也比較容易看的懂
而一般系統如果真的作大時,可能就必需考慮使用ICE會比較好使用
MCU 8051 IDE是比較方便的軟體,不過就應該沒支援使用ICE的功能
這一點在KEIL C上就有比較多的支援,而且現在一般簡易型的51系列ICE也都很便宜
如果MCU 8051 IDE能玩的順手,相信也能作出不少的東西,加油吧
發表於 2012-7-6 19:00:06 | 顯示全部樓層
legion 發表於 2012-7-6 10:09 AM static/image/common/back.gif
其實不管那種語言,組合語言或C語言,有時在編輯時稍作排列整齊一下
就會在後面作DEBUG時方便很多也比較容易 ...

LEGION大:
   可以介紹幾款 51的 ICE 產品嗎?  感謝!!
發表於 2012-7-6 21:39:09 | 顯示全部樓層
antlu 發表於 2012-7-6 07:00 PM static/image/common/back.gif
LEGION大:
   可以介紹幾款 51的 ICE 產品嗎?  感謝!!

antlu大,這也是可以參考參考
手上有用過一些東西
早期還在dos時期使用的ICE還蠻貴的就不談了,

從改用KEIL C後,便找了能完全支援KEILC的,看了便宜就先買了下面這款
http://goods.ruten.com.tw/item/show?11080607721968
使用了半年也蠻順手的,但一直卡在一個地方,就是RS232部份不能作線上DEBUG
要用RS232時就只能直接跑,資料傳輸時會讓人在資料上作確認時會有無力感

有一次忘了什麼情形,看了網購的資料也不錯就買了下列這款 ICE52B
http://goods.ruten.com.tw/item/show?21010087661686
好處是RS232端能完全使用而且能作DEBUG
這點在串列傳輸上算是蠻好用的,
DOS時期也是因為能完全使用MCU這點大家才會花錢去買ICE的
標準的8051上都能完全執行使用,算是目前一直在用的
不過這是標準12T的8051使用,

去年因考慮使用有內建ADC的MPC82G516,又是1T的MCU,所以除了買一些MCU外順便買了這張小巧的ICE
http://goods.ruten.com.tw/item/qa?21103242690820#qna
除了掛上KEIL C作下載測試外倒是因為忙所以一直沒去動到他
暫時放著沒空使用
現在的簡易型ICE除了便宜外,一般如果只寫一些3,5千行內的小程式
在使用上應該是沒什麼大問題,其實只要順手的話,也沒有規定要用ICE來使用
ICE的目地大部份都是較大的程式要作DEBUG才會方便的
參考看看

評分

1

查看全部評分

發表於 2012-7-7 01:15:51 | 顯示全部樓層
LEGION大:
  感謝您的說明,第三項對於初學者的我好像還蠻合適的.
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

關閉

站長小叮嚀上一條 /1 下一條

禁閉室|手機版|連繫我們|痞酷網電子技術論壇

GMT+8, 2024-11-23 12:54 PM , Processed in 0.312322 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.