實驗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
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...