新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于PIC16F877的四位數碼管動態顯示PROTEUS仿真

        基于PIC16F877的四位數碼管動態顯示PROTEUS仿真

        作者: 時間:2018-07-31 來源:網絡 收藏

        本文引用地址:http://www.104case.com/article/201807/384748.htm

        本文為基于PIC16F877的四位動態顯示PROTEUS仿真。

        源程序代碼說明

        ;*********************************************

        ;** 文件名:four_led.asm **

        ;** 功 能:四位動態顯示1234 **

        ;*********************************************

        LIST P=16F877,R=DEC ; 設定匯編參數為PIC16F877,默認數制為十進制

        #INCLUDE ; 將含文檔P16F877.INC包含進程序中來

        CBLOCK 0x20 ; 設定自定義寄存器從0x20單元開始存放

        ENDC ; 聲明結束

        ;

        ;-------- 定義寄存器 ------------

        CBLOCK ; 聲明以下為自定義寄存器

        DLY ; 延時變量

        DISPNUM0 ; 個位寄存器

        DISPNUM1 ; 數碼管十位寄存器

        DISPNUM2 ; 數碼管百位寄存器

        DISPNUM3 ; 數碼管千位寄存器

        ENDC ; 聲明自定義寄存器結束

        ;--------- 初始化程序 -----------

        ;

        ORG 0 ; 程序從0000H單元開始執行

        NOP ; ICD必需的空操作指令

        BANKSEL TRISB ; 選擇BANK1

        MOVLW 0 ; 將0送入W

        MOVWF TRISB ; 再送入端口方向控制寄存器TRISB,設定端口B全部為輸出

        MOVWF TRISD

        BANKSEL PORTB ; 回到BANK0

        MOVLW 0FFH ; 將十六進制數0xFF送W

        MOVWF PORTB ; 再轉到端口B數據寄存器PORTB關閉所有數碼管

        MOVLW 0 ; 預設數碼管顯示初值

        MOVWF DISPNUM3

        MOVLW 1

        MOVWF DISPNUM2

        MOVLW 2

        MOVWF DISPNUM1

        MOVLW 3

        MOVWF DISPNUM0

        ;------------- 主程序 -----------

        MAIN:

        MOVLW 0x32

        MOVWF DLY

        M0:

        CALL LEDDISP4 ; 呼叫數碼管顯示子程序顯示

        DECFSZ DLY,1 ; 重復調用數碼管顯示子程序為延時程序

        GOTO M0

        MOVF DISPNUM2,0 ; 取出數碼管百位的值到W

        MOVWF DISPNUM3 ; 再由W送到數碼管千位

        MOVF DISPNUM1,0 ; 取出數碼管十位的值到W

        MOVWF DISPNUM2 ; 再轉到數碼管百位

        MOVF DISPNUM0,0 ; 取出數碼管個位值到W

        MOVWF DISPNUM1 ; 再轉入數碼管十位

        INCF DISPNUM0,1 ; 將數碼管個位的值1,結果存回DISPNUM0

        BTFSC DISPNUM0,4 ; 判斷數碼管個位寄存器的值是否大于0x0F

        CLRF DISPNUM0 ; 是,將DISPNUM清0

        GOTO MAIN ; 循環執行

        ;----------- 主程序結束 ---------

        ;----- 四位數碼管顯示子程序 -----

        LEDDISP4:

        MOVF DISPNUM0,0 ; 取數碼管個位寄存器的值到W

        CALL CONVERT ; 查表取回數碼管顯示碼

        MOVWF PORTD ; 送端口數據寄存器PORTD顯示

        MOVLW 0xFE ; 個位數碼管顯示控制嗎0xFE送W

        MOVWF PORTB ; 送端口B點亮個位數碼管

        CALL DELAY2_5MS ; 延進2.5MS

        MOVLW 0xFF

        MOVWF PORTB

        ;

        MOVF DISPNUM1,0 ; 取數碼管個位寄存器的值到W

        CALL CONVERT ; 查表取回數碼管顯示碼

        MOVWF PORTD ; 送端口數據寄存器PORTD顯示

        MOVLW 0xFD ; 個位數碼管顯示控制嗎0xFE送W

        MOVWF PORTB ; 送端口B點亮個位數碼管

        CALL DELAY2_5MS ; 延進2.5MS

        MOVLW 0xFF

        MOVWF PORTB

        ;

        MOVF DISPNUM2,0 ; 取數碼管個位寄存器的值到W

        CALL CONVERT ; 查表取回數碼管顯示碼

        MOVWF PORTD ; 送端口數據寄存器PORTD顯示

        MOVLW 0xFB ; 個位數碼管顯示控制嗎0xFE送W

        MOVWF PORTB ; 送端口B點亮個位數碼管

        CALL DELAY2_5MS ; 延進2.5MS

        MOVLW 0xFF

        MOVWF PORTB

        ;

        MOVF DISPNUM3,0 ; 取數碼管個位寄存器的值到W

        CALL CONVERT ; 查表取回數碼管顯示碼

        MOVWF PORTD ; 送端口數據寄存器PORTD顯示

        MOVLW 0xF7 ; 個位數碼管顯示控制嗎0xFE送W

        MOVWF PORTB ; 送端口B點亮個位數碼管

        CALL DELAY2_5MS ; 延進2.5MS

        MOVLW 0xFF

        MOVWF PORTB

        ;

        RETURN ; 返回子程序呼叫處

        ;--- 四位數碼管顯示子程序結束 ---

        ;---------- 查表子程序 ----------

        CONVERT:

        ADDWF PCL ; 把W的值加到PC的低8位

        TABLE:

        RETLW H'C0' ; 0

        RETLW H'F9' ; 1

        RETLW H'A4' ; 2

        RETLW H'B0' ; 3

        RETLW H'99' ; 4

        RETLW H'92' ; 5

        RETLW H'82' ; 6

        RETLW H'F8' ; 7

        RETLW H'80' ; 8

        RETLW H'90' ; 9

        RETLW H'88' ; A

        RETLW H'83' ; b

        RETLW H'C6' ; C

        RETLW H'A1' ; d

        RETLW H'86' ; E

        RETLW H'8E' ; F

        ;-----------查表子程序結束----------;

        ;===================================

        #INCLUDE ; 將2.5MS延時子程序包含進程序中 ;

        ; 晶振16MHz時延時2.5毫秒 ;

        ;===================================

        END



        關鍵詞: 單片機 數碼管

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 贵南县| 莲花县| 镇远县| 桓仁| 宁明县| 囊谦县| 嘉祥县| 溆浦县| 商南县| 博野县| 广宗县| 乐山市| 西贡区| 高阳县| 承德县| 正宁县| 伊川县| 曲沃县| 抚松县| 双辽市| 陵川县| 桓仁| 东莞市| 廉江市| 吉安市| 大兴区| 陆丰市| 岱山县| 新竹市| 四会市| 呼和浩特市| 渝北区| 满洲里市| 通河县| 丹巴县| 乌兰县| 黑山县| 夏邑县| 利津县| 柘荣县| 鹤壁市|