實驗02_Proteus模擬數位管顯示代碼

来源:https://www.cnblogs.com/bzxf/archive/2022/09/29/16740440.html
-Advertisement-
Play Games

一、原理總結 利用兩個寄存器R4和R5來存儲兩個數位管的顯示效果,R4是前一個數位管顯示所需,而R5是後一個數位管顯示所需,利用左移操作RLC來使之每一位被依次輸入到C中,然後將C輸入到LED中(當LED每位都有數據時,數位管才會顯示),利用停頓函數使數位管上數字停留一段時間。 二、程式分析 以下為 ...


一、原理總結

  • 利用兩個寄存器R4和R5來存儲兩個數位管的顯示效果,R4是前一個數位管顯示所需,而R5是後一個數位管顯示所需,利用左移操作RLC來使之每一位被依次輸入到C中,然後將C輸入到LED中(當LED每位都有數據時,數位管才會顯示),利用停頓函數使數位管上數字停留一段時間。

二、程式分析

  • 以下為全部代碼,之後會進行具體分析

總體代碼

    ;====================================================================
    ; Main.asm file generated by New Project wizard
    ;
    ; Created:   周一 九月 19 2022
    ; Processor: AT89C51
    ; Compiler:  ASEM-51 (Proteus)
    ;====================================================================

    $NOMOD51
    $INCLUDE (8051.MCU)

    ;====================================================================
    ; DEFINITIONS
    ;====================================================================

    ;====================================================================
    ; VARIABLES
    ;====================================================================

    ;====================================================================
    ; RESET and INTERRUPT VECTORS
    ;====================================================================

        ; Reset Vector
        org   0000h
        jmp   Start

    ;====================================================================
    ; CODE SEGMENT
    ;====================================================================

        org   0100h
    TAB : DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H

    PAUSE: ;停頓函數
            MOV R1,#255	;R1是第一層嵌套迴圈
    D1:		MOV R2,#255	;R2是第二層嵌套迴圈
    D2:		DJNZ R2,D2	;當R2不為0時跳轉,為0時不跳轉,執行DJNZ R1,D1使得R1- -
            DJNZ R1,D1	;當R1不為0時跳轉,為0時不跳轉
    RET

    LED:
            MOV R0,#8   ;將8賦值給R0,8位左移
            MOV A,R5    ;R5代表右邊的LED的數
            MOVC A,@A+DPTR  ;A是偏移地址,是從DPTR中定址
            
    LOOP1:	
            RLC A       ;A左移
            CLR P1.4
            MOV P1.5,C
            SETB P1.4
            DJNZ R0,LOOP1
            
            MOV R0,#8
            MOV A,R4
            MOVC A,@A+DPTR
            
    LOOP2:	
            RLC A
            CLR P1.4
            MOV P1.5,C
            SETB P1.4
            DJNZ R0,LOOP2
            
            MOV R6,#0
    S1:		LCALL PAUSE
            INC R6
            CJNE R6,#10,S1

    RET
            
    START:	MOV A,#00H
            MOV p0,A
            
            MOV DPTR,#TAB
            MOV R4,#0
            MOV R5,#0
            
    A1:		MOV C,P1.0
            JC XUNHUAN
            MOV C,9
            JC FUWEI
            INC R5
            CJNE R5,#15,XUNHUAN
            MOV R5,#0
            INC R4
            CJNE R4,#15,XUNHUAN
            JMP FUWEI
            
    XUNHUAN:	
            LCALL LED
            JMP A1
            
    FUWEI:	
            MOV R4,#0
            MOV R5,#0
            JMP A1
            
            
    JMP START	
    ;====================================================================
        END

數組存值:

  • TAB 是用來存儲0-15這16個數據,之後使用A來定址
TAB : DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H

停頓函數:

  • R1是第一層嵌套迴圈,R2是第二層嵌套迴圈,當R2不為0時跳轉,為0時不跳轉,執行DJNZ R1,D1使得R1- -,當R1不為0時跳轉,為0時不跳轉。
    PAUSE: ;停頓函數
                MOV R1,#255	;R1是第一層嵌套迴圈
        D1:		MOV R2,#255	;R2是第二層嵌套迴圈
        D2:		DJNZ R2,D2	;當R2不為0時跳轉,為0時不跳轉,執行DJNZ R1,D1使得R1- -
                DJNZ R1,D1	;當R1不為0時跳轉,為0時不跳轉
    RET

數位管亮燈函數

  • LED中的內容:
    1. 將8賦值給R0,使用R0來實現8位右移
    2. 將R5賦值給A,而R5代表的是右邊的數位管,R5共八位,使用R0來使之每位被傳輸到數位管中。
    3. MOVC A,@A+DPTR 是將A在DPTR中定址,之後回賦值給A。
    LED:
        MOV R0,#8   ;將8賦值給R0,8位右移
        MOV A,R5    ;R5代表右邊的LED的數
        MOVC A,@A+DPTR  ;A是偏移地址,是從DPTR中定址
  • LOOP1中的內容:
      • RLC 是帶進位的迴圈左移,RLC A 即將A的內容左移一位,將進位位C中的值移到累加器A的最低位,A的最高位移到C里。若有A=01000001,C=1,則執行 RLC的話:A=10000011,C=0(A的最高位移到C,C原值移到A最低位)。
      • RL 是帶進位的迴圈左移,RL A 即將A的內容左移一位,將進位位C中的值移到累加器A的最低位,A的最高位不移到C里,若有A=01000001,C=1,則執行RL的話:A=10000010,C=1(A所有位左移一位,最低位補零,C不參加移位操作,保持原值不變)
    1. RLC之後三行是將數據放入數位管中的操作,不過多贅述
    2. DJNZ R0,LOOP0 是將 R0-- 過後看是否為0,若不為零則跳轉,若為0則執行下麵的操作

C=1,A=55H,RLC A後則為:C=0 A=ABH,即:1 01010101變為:0 10101011

    LOOP1:	
            RLC A       ;A左移
            CLR P1.4    ;下麵三行是對LED進行輸入
            MOV P1.5,C
            SETB P1.4
            DJNZ R0,LOOP1
            
            MOV R0,#8
            MOV A,R4
            MOVC A,@A+DPTR
    LED:
            MOV R0,#8   ;將8賦值給R0,8位右移
            MOV A,R5    ;R5代表右邊的LED的數
            MOVC A,@A+DPTR  ;A是偏移地址,是從DPTR中定址
            
    LOOP1:	
            RLC A       ;A左移
            CLR P1.4    ;下麵三行是對LED進行輸入
            MOV P1.5,C
            SETB P1.4
            DJNZ R0,LOOP1
            
            MOV R0,#8
            MOV A,R4
            MOVC A,@A+DPTR
            
    LOOP2:	
            RLC A
            CLR P1.4
            MOV P1.5,C
            SETB P1.4
            DJNZ R0,LOOP2
            
            MOV R6,#0
    S1:		LCALL PAUSE
            INC R6
            CJNE R6,#10,S1

    RET

START 部分:

  • 首先對圖中上面的數位管進行歸0處理,然後 MOV DPTR,#TAB 將TAB這個數組的首地址給予DPTR,後續定址使用,將R4R5 進行初始化,賦值為0,
  • C中一開始存儲的是 p1.0 (其中存儲的是開關數值,為1的話進行累加,為0的話保持不變)如C為1則直接執MOV C,9,若C為0的話跳轉XUNHUAN,保持當前數字
  • 之後C中存儲的是9號埠傳入的數據,9號段口控制複位(9號埠為1時執行之後指令,為0時執行FUWEI)
  • 之後正式執行,R5從0開始累加,累加夠16使R4加一,當R5小於等於15時執行數位管顯示函數,大於15時執行R4++
START:	
            MOV A,#00H
            MOV p0,A
            
            MOV DPTR,#TAB
            MOV R4,#0
            MOV R5,#0
            
    A1:
            MOV C,P1.0
            JC XUNHUAN
            MOV C,9
            JC FUWEI
            INC R5
            CJNE R5,#15,XUNHUAN
            MOV R5,#0
            INC R4
            CJNE R4,#15,XUNHUAN
            JMP FUWEI

XUNHUANFUWEI 部分:

  • XUNHUAN 使用LED函數,亮數位管,之後跳轉A1中。
  • FUWEI 給與R4與R5賦值為0,之後跳轉到A1中
XUNHUAN:	
            LCALL LED
            JMP A1
            
    FUWEI:	
            MOV R4,#0
            MOV R5,#0
            JMP A1

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、什麼是AOP AOP為Aspect Oriented Programming的縮寫,意為:面向切麵編程,通過預編譯方式和運行期間動態代理實現程式功能的統一維護的一種技術。AOP是OOP的延續,是軟體開發中的一個熱點,也是Spring框架中的一個重要內容,是函數式編程的一種衍生範型。利用AOP可以 ...
  • 我們可以通過使用Win32Api來製作一些強大的功能,本文將通過示例代碼來介紹使用Win32Api來之做桌面視窗停靠功能; 效果圖: 一.通過Nuget 引入 Vanara.PInvoke.Shell32 和 PInvoke.User32 這兩個庫。 二.功能列表 1.Berth 函數,將視窗停靠在 ...
  • 分散式唯一ID,顧名思義,是指在全世界任何一臺電腦上都不會重覆的唯一Id。 在單機/單伺服器/單資料庫的小型應用中,不需要用到這類東西。但在高併發、海量數據、大型分散式應用中,這類卻是構建整個系統的最核心一環。 設想一下如下場景: 在某個大型電商系統A中,“訂單”這類大數據(比如,每天產生1500 ...
  • ALglib 是一個跨平臺的數值分析和數據處理庫。它支持多種編程語言(C + + 、 C # 、 Delphi)和多種操作系統(Windows 和 POSIX,包括 Linux)。 ALglib 功能包括: 數據分析(分類/回歸,統計學) 優化和非線性解法 插值和線性/非線性最小二乘擬合 線性代數( ...
  • [演算法2-數組與字元串的查找與匹配] (.NET源碼學習) 關鍵詞:1. 數組查找(演算法) 2. 字元串查找(演算法) 3. C#中的String(源碼) 4. 特性Attribute 與內在屬性(源碼) 5. 字元串的比較(底層原理) 6. C#中的StringComparsion(源碼) 7. 字 ...
  • 大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家講的是一個關於Segger J-Flash在Micron Flash固定區域下載校驗失敗的故事。 痞子衡最近在支持一個 i.MXRT1170 歐美客戶,客戶項目里選用了來自 Micron 的四線 NOR Flash - MT25QL256ABA ...
  • 《上古卷軸5:天際》是Bethesda五年磨一劍的《上古卷軸》系列作品,Bethesda將提供充滿無限期待與幻想的諾德大陸。在這廣闊的地圖之上,Bethesda工作室給玩家提供了超過120個不重覆的地下迷宮,以及5個規模巨集大的城市供玩家探索,而玩家將在這個奇異自由的世界踏上史詩性的徵程,使用自己心儀 ...
  • @(文章目錄) 前言 今天和大家一起來看一下在LabVIEW中如何使用OpenCV DNN模塊實現手寫數字識別 一、OpenCV DNN模塊 1.OpenCV DNN簡介 OpenCV中的DNN(Deep Neural Network module)模塊是專門用來實現深度神經網路相關功能的模塊。Op ...
一周排行
    -Advertisement-
    Play Games
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...