痞酷網_PIGOO

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

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

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

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

謝謝!
查看: 3670|回復: 3

以查表的方式寫七段顯視器測試程式

[複製鏈接]
發表於 2012-7-6 17:14:31 | 顯示全部樓層 |閱讀模式
本帖最後由 fatzeros 於 2012-7-6 05:17 PM 編輯

先感謝各位先進的指導,
上一篇最基礎的方式寫七段顯視器測試程序,求精簡!
這一次參考了實驗板的程式,
修改出來這一次的實驗程式,
一樣可以使用MCU 8051 IDE模擬,
這一次使用查表的方式來對七段顯視器下顯視的指令,以下為組合語言原始碼:

;/*----------------------------------------------------------------------------------------------
;  名稱:STC_15F204EA七段顯示器測試程序
;  編寫:沈大胖
;  日期:2012/07/06_V2
;  修改:
;  內容:使用STC_15F204EA測試共陽七段顯示器,
;        使用P2,I/O口為七段之A~DP
;        使用P3.1為共陽控制腳
;        使用查表方式顯示
;        模擬前,請先LOAD STC_15F204EA_7SEG_LED_20120706_V2.vhc, VirtualHW->load->STC_15F204EA_7SEG_LED_20120706_V2.vhc
;        按「F2」啟動模擬,按「F6」開始模擬
;-----------------------------------------------------------------------------------------------*/

;腳位功能定義

        SMG_LED EQU P3.1        ;定義七段顯視器控制腳為P3.1

;程序開始
START:
ORG 0000H
AJMP MAIN

;數據段
ORG 0100H
TABLE:                                                                ;定義七段顯視器顯的方式
        DB 0feH,0fdH,0fbH,0f7H,0efH,0dfH,0bfH,07fH                ;A,B,C,D,E,F,G,DP
        DB 040h,0f9h,0a4h,0b0h,099h,092h,082h,0f8h,080h,090h        ;0DP,1,2,3,4,5,6,7,8,9

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

;循環功能段
CYCLE:
        MOV R7,#18        ;初始暫存器R7為X,表示使用TABLE表之前X項之數值
        MOV DPTR,#TABLE        ;初始DPTR為數據段之數值

DISPLAY:
        CLR A                ;清除累加器
        MOVC A,@A+DPTR        ;指定累加器為累加器加上循環功能段之DPTR(TABLE表內之數值,由第一個開始)
        MOV P2,A        ;指定P2_I/O腳位為累加器之數值,即七段顯視器依TABLE表內之數值遞增顯視
        ACALL DELAY        ;呼叫延遲程序,使七段顯視器顯視時間加長
        INC DPTR        ;遞增DPTR的顯視TABLE表內之數值
        DJNZ R7,DISPLAY        ;遞減暫存器R7的值,如不為0則跳至DISPLAY段
        AJMP CYCLE        ;遞減暫存器R7的值,如為0則跳至CYCLE段

;使用遞減暫存器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,如不為0時則跳至D2段
        DJNZ R4,D1                 ;遞減暫存器R4初始值A,如不為0時則跳至D1段
        RET                          ;回呼叫點
END

附上專案檔:
STC_15F204EA_七段顯示器測試.zip (27.33 KB, 下載次數: 62)
謝謝大家收看!

以下是心得:
學程式語言,真的是要自己一個字一個字KEY,才有FU啊!
另外,再一次感謝先進們不吝指導!
發表於 2012-7-6 23:33:17 | 顯示全部樓層
本帖最後由 cnpan 於 2012-7-6 10:48 PM 編輯

也可以改成

DISPLAY:
        ; CLR A                清除累加器
        MOV A,R17                  ;指定累加器為TABLE 元素指標
        MOVC A,@A+DPTR        ;指定累加器為累加器加上循環功能段之DPTR(TABLE表內之數值,由最後一個開始)
        
       ;INC DPTR        遞增DPTR的顯視TABLE表內之數值

可以少一行程式

評分

1

查看全部評分

發表於 2012-7-13 12:09:08 | 顯示全部樓層
;數據段
ORG 0100H
TABLE:                                                                ;定義七段顯視器顯的方式
        DB 0feH,0fdH,0fbH,0f7H,0efH,0dfH,0bfH,07fH                ;A,B,C,D,E,F,G,DP
        DB 040h,0f9h,0a4h,0b0h,099h,092h,082h,0f8h,080h,090h,0FFH        ;0DP,1,2,3,4,5,6,7,8,9

;中間略過

;循環功能段
CYCLE:
;        MOV R7,#18        ;初始暫存器R7為X,表示使用TABLE表之前X項之數值
        MOV DPTR,#TABLE        ;初始DPTR為數據段之數值

DISPLAY:
        CLR A                ;清除累加器
        MOVC A,@A+DPTR        ;指定累加器為累加器加上循環功能段之DPTR(TABLE表內之數值,由第一個開始)
       CJNE A,#FFH,DISP1
       JMP CYCLE
DISP1:

       MOV P2,A        ;指定P2_I/O腳位為累加器之數值,即七段顯視器依TABLE表內之數值遞增顯視
        ACALL DELAY        ;呼叫延遲程序,使七段顯視器顯視時間加長
        INC DPTR        ;遞增DPTR的顯視TABLE表內之數值
        JMP DISPLAY
;       DJNZ R7,DISPLAY        ;遞減暫存器R7的值,如不為0則跳至DISPLAY段
;       AJMP CYCLE        ;遞減暫存器R7的值,如為0則跳至CYCLE段
這樣可以不用計算要顯示多少個
只要判斷是不是結束碼
結束碼可自訂

評分

1

查看全部評分

發表於 2012-7-13 12:10:58 | 顯示全部樓層
也可以改成

DISPLAY:
        ; CLR A                清除累加器
        MOV A,R17                  ;指定累加器為TABLE 元素指標
        MOVC A,@A+DPTR        ;指定累加器為累加器加上循環功能段之DPTR(TABLE表內之數值,由最後一個開始)
        
       ;INC DPTR        遞增DPTR的顯視TABLE表內之數值

可以少一行程式

這樣顯示的順序會倒過來
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

關閉

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

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

GMT+8, 2024-4-26 08:30 PM , Processed in 0.153752 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.