關於51單片機數位管消影

来源:http://www.cnblogs.com/yllinux/archive/2017/06/02/6935590.html
-Advertisement-
Play Games

自學單片機學到中斷部分,用數位管動態顯示刷新頻率高的時候會有重影,為了消除重影我查找了網上很多資料,好多錯的。 看看原理圖: 百度百科:74HC573 數位管 74HC573是擁有八路輸出的透明鎖存器,輸出為三態門,是一種高性能硅柵CMOS器件。 SL74HC573跟LS/AL573的管腳一樣。器件 ...


自學單片機學到中斷部分,用數位管動態顯示刷新頻率高的時候會有重影,為了消除重影我查找了網上很多資料,好多錯的。

看看原理圖:

 

百度百科:74HC573    數位管 ----------------------------------------------------------------------------------------------------------- 74HC573是擁有八路輸出的透明鎖存器,輸出為三態門,是一種高性能硅柵CMOS器件。 SL74HC573跟LS/AL573的管腳一樣。器件的輸入是和標準CMOS輸出相容的,加上拉電阻他們能和LS/ALSTTL輸出相容。 ----------------------------------------------------------------------------------------------------------- 數位管動態顯示介面是將所有數位管的8個顯示筆劃"a,b,c,d,e,f,g,dp"的同名端連在一起,另外為每個數位管的公共極COM增加位選通控制電路,位選通由各自獨立的I/O線控制,當單片機輸出字形碼時,所有數位管都接收到相同的字形碼,但究竟是哪個數位管會顯示出字形,取決於單片機對位選通COM端電路的控制,所以我們只要將需要顯示的數位管的選通控制打開,該位就顯示出字形,沒有選通的數位管就不會亮。通過分時輪流控制各個數位管的的COM端,就使各個數位管輪流受控顯示,這就是動態驅動。在輪流顯示過程中,每位數位管的點亮時間為1~2ms,由於人的視覺暫留現象及發光二極體的餘輝效應,儘管實際上各位數位管並非同時點亮,但只要掃描的速度足夠快,給人的印象就是一組穩定的顯示數據,不會有閃爍感,動態顯示的效果和靜態顯示是一樣的,能夠節省大量的I/O埠,而且功耗更低。 ------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------ 由上面可以知道,數位管要顯示得位碼和段碼都分別賦值(賦值前選通控制打開,賦值後選通關閉)才行,位碼或段碼賦值完成數值立即被鎖存,只要不重新給位碼或段碼賦值則鎖存的值不變。(註意,給鎖存器賦值的是P0埠,只要不給P0重新賦值,則P0的值也不變)所以:

通常是  (1)清除位碼 → (2)給鎖存器賦下一位要顯示的段碼(字形碼),開通段選,關閉段選 → (3)給鎖存器賦下一位要顯示的位碼(位置碼),開通位選,關閉位選

 1         P0   = 0xff;//消除重影,關閉所有位選
 2     wela = 1;
 3     wela = 0;
 4     P0   = digitron_table[shi];//調用八段數位管代碼表
 5     dula = 1;
 6     dula = 0;
 7     P0   = 0xbf;
 8     wela = 1;
 9     wela = 0;
10     delay(1);
11     
12     P0   = 0xff;//消除重影
13     wela = 1;
14     wela = 0;
15     P0   = digitron_table[ge];//調用八段數位管代碼表
16     dula = 1;
17     dula = 0;
18     P0   = 0x7f;
19     wela = 1;
20     wela = 0;
21     delay(1);
View Code

也可以  (1)清除段碼 → (2)給鎖存器賦下一位要顯示的位碼(位置碼),開通位選,關閉位選 → (3)給鎖存器賦下一位要顯示的段碼(字形碼),開通段選,關閉段選

 1         P0   = 0x00;//消除重影,關閉段選
 2     dula = 1;
 3     dula = 0;
 4     P0   = 0xbf;
 5     wela = 1;
 6     wela = 0;
 7     P0   = digitron_table[shi];//調用八段數位管代碼表
 8     dula = 1;
 9     dula = 0;
10     delay(1);
11     
12     P0   = 0x00;//消除重影
13     dula = 1;
14     dula = 0;
15     P0   = 0x7f;
16     wela = 1;
17     wela = 0;
18     P0   = digitron_table[ge];//調用八段數位管代碼表
19     dula = 1;
20     dula = 0;
21     delay(1);
View Code

 

這樣,不論多快的刷新頻率都不會有重影。

--------------------------------------------------------------------------------------

完整代碼:

  1 //使用定時器1中斷讓8個LED迴圈右移,間隔500ms,同時使用定時器0中斷方式讓數位管前2位間隔1000ms從0顯示到60,
  2 //如果有外部中斷產生則停止數位管走數(外部中斷0低電平觸發方式)
  3  
  4 #include <reg52.h>
  5 #include <intrins.h>
  6  
  7 //巨集定義,方便書寫
  8 #define uchar unsigned char
  9 #define uint unsigned int
 10 
 11 sbit dula = P2^6;
 12 sbit wela = P2^7;
 13 uchar counter_s;
 14 
 15 //子函數聲明
 16 void interrupt_timer_init();
 17 void display(uchar i);
 18 void delay(uint z);
 19 
 20 //八段數位管代碼表
 21 uchar code digitron_table[] = {//LED單元 dp g f e  d c b a 
 22     0x3F,  //"0"  0011 1111
 23     0x06,  //"1"  0000 0110
 24     0x5B,  //"2"  0101 1011    * * * *  a  * * * *
 25     0x4F,  //"3"  0100 1111    *                 *
 26     0x66,  //"4"  0110 0110    *                 *
 27     0x6D,  //"5"  0110 1101    *                 *
 28     0x7D,  //"6"  0111 1101    f                 b
 29     0x07,  //"7"  0000 0111    *                 *
 30     0x7F,  //"8"  0111 1111    *                 *
 31     0x6F,  //"9"  0110 1111    *                 *
 32     0x77,  //"A"  0111 0111    * * * *  g  * * * *
 33     0x7C,  //"B"  0111 1100    *                 *
 34     0x39,  //"C"  0011 1001    *                 *
 35     0x5E,  //"D"  0101 1110    *                 *
 36     0x79,  //"E"  0111 1001    e                 c
 37     0x71,  //"F"  0111 0001    *                 *
 38     0x76,  //"H"  0111 0110    *                 *
 39     0x38,  //"L"  0011 1000    *                 *
 40     0x37,  //"n"  0011 0111    * * * *  d  * * * * * dp * *
 41     0x3E,  //"u"  0011 1110
 42     0x73,  //"P"  0111 0011
 43     0x5C,  //"o"  0101 1100
 44     0x40,  //"-"  0100 0000
 45     0x00,  //熄滅 0000 0000
 46     0x00   //自定義
 47 };
 48 
 49 //主函數部分
 50 void main()
 51 {
 52     interrupt_timer_init();
 53     while (1) {
 54         display(counter_s);
 55 }
 56 }
 57  
 58 //中斷服務特殊功能寄存器配置和定時器初始化
 59 void interrupt_timer_init()
 60 {
 61     TMOD = 0x11;//定時方式工作模式0和1,工作模式寄存器TMOD的地址是0x89,不能被8整除,只能對位元組操作,不能位操作
 62     TH1  = 0x4c;//公式:定時時間t = (2^16 - T1初值) * 振蕩周期 * 12         (振蕩周期 * 12 即機器周期)
 63     TH0  = 0x4c;
 64     TL1  = 0x00;//T1 = 2^16 - t * 11059200 / 12         (此定時時間為 50ms, T1 = 19456 = 0x4c00)
 65     TL0  = 0x00;
 66     TR1  = 1;    //定時器運行控制位置1,TCON的地址是0x88,可以對位操作
 67     TR0  = 1;
 68     ET1  = 1; //定時器/計數器T1的溢出中斷允許位置1,允許T1中斷, 中斷允許寄存器IE(A8H)
 69     ET0  = 1;
 70     EX0  = 1;
 71     IT0   = 0;
 72     EA   = 1; //中斷允許總控制位置1,CPU開放中斷, 中斷允許寄存器IE(A8H)
 73     P1 = 0x7f;
 74 } 
 75 
 76 //
 77 void interrupt_program_INT0() interrupt 0 //(1)中斷函數無返回值,會破壞棧 (2)不能向ISR傳遞參數,會破壞棧 (3)ISR應該儘可能的短小精悍 (4)中斷函數不能被調用,硬體決定
 78 {
 79     TR0 = 0;
 80 }
 81 
 82 //T1中斷服務程式
 83 void interrupt_program_T1() interrupt 3
 84 {
 85     uchar counter;
 86     counter++;
 87     TH1  = 0x4c;
 88     TL1  = 0x00;
 89     if (counter == 10) {    
 90         P1 = _cror_(P1, 1);
 91         counter = 0;
 92     }    
 93 }
 94 
 95 //T0中斷服務程式
 96 void interrupt_program_T0() interrupt 1
 97 {
 98     uchar counter_ms;
 99     counter_ms++;
100     TH1  = 0x4c;
101     TL1  = 0x00;
102     if (counter_ms == 20) {        
103         counter_ms = 0;
104         counter_s++;
105         if (counter_s == 60) {
106             counter_s = 0;
107         }
108     }    
109 }
110 
111 //延時函數
112 void delay(uint z)
113 {
114     uint x, y;
115     for (x = 0; x < z; x++)
116         for (y = 0; y < 114; y++);
117 }
118 
119 //數位管顯示函數
120 void display(uchar i)
121 {
122      uchar shi,ge;
123     shi = i / 10;//求模
124     ge = i % 10;//求餘
125 //實際產品中,(1)關所有位選→(2)輸出下一位要顯示的段碼→(3)開通下一位要顯示的位選
126 //其實也可以,(1)關所有段碼→(2)開通下一位要顯示的位選→(3)輸出下一位要顯示的段碼
127     P0   = 0x00;//消除重影,關閉段選
128     dula = 1;
129     dula = 0;
130     P0   = 0xbf;
131     wela = 1;
132     wela = 0;
133     P0   = digitron_table[shi];//調用八段數位管代碼表
134     dula = 1;
135     dula = 0;
136     delay(1);
137     
138     P0   = 0x00;//消除重影
139     dula = 1;
140     dula = 0;
141     P0   = 0x7f;
142     wela = 1;
143     wela = 0;
144     P0   = digitron_table[ge];//調用八段數位管代碼表
145     dula = 1;
146     dula = 0;
147     delay(1);
148     
149 /*
150   P0   = 0xff;//消除重影,關閉所有位選
151     wela = 1;
152     wela = 0;
153     P0   = digitron_table[shi];//調用八段數位管代碼表
154     dula = 1;
155     dula = 0;
156     P0   = 0xbf;
157     wela = 1;
158     wela = 0;
159     delay(1);
160     
161     P0   = 0xff;//消除重影
162     wela = 1;
163     wela = 0;
164     P0   = digitron_table[ge];//調用八段數位管代碼表
165     dula = 1;
166     dula = 0;
167     P0   = 0x7f;
168     wela = 1;
169     wela = 0;
170     delay(1);
171 */
172 }
View Code

 

 

如有錯誤還請指出,如有侵權還請告知,如需轉載請註明出處!                                              

本人博客:http://www.cnblogs.com/yllinux/

 


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

-Advertisement-
Play Games
更多相關文章
  • 回到目錄 在MVC,EF,LINQ環境里,我們經常會用到DataModel(DO)和ViewModel(VO),可能對於它們的屬性校驗我們會採用特性的方式,當然這很直觀,就連微軟的DEMO也是如些,一般是這樣的代碼 而這種設計方式給我們以後的維護帶來很多問題,具體大叔總結一下: 綜上所述,Fluen ...
  • Java基礎十二--多態是成員的特點 一、特點 1,成員變數。 編譯和運行都參考等號的左邊。 覆蓋只發生在函數上,和變數沒關係。 Fu f = new Zi();System.out.println(f.num);//是父類,答案是3 2,成員函數(非靜態)。 編譯看左邊,運行看右邊。 因為成員函數 ...
  • 頭文件algorithm中的常用函數 一、非修改性序列操作(12個) 迴圈 對序列中的每個元素執行某操作 for_each() 查找 在序列中找出某個值的第一次出現的位置 find() 在序列中找出符合某謂詞的第一個元素 find_if() 在序列中找出一子序列的最後一次出現的位置 find_end ...
  • 慕課網Hibernate初探之一對多映射實驗及總結 一、本課核心 * 1、如何在MyEclipse中使用Hibernate * 2、如何實現Hibernate中一對多的映射 * 3、如何創建Session對象 * 4、Hibernate如何使用增刪改查 1、如何在MyEclipse中使用Hibern ...
  • 學習一門技術,不止要會,還要善用,例子就是帶你快速入門的最佳利器。本文就是要用例子,不,大量的例子來帶你走進PowerShell應用世界。 本文主要介紹一些PowerShell入門的基礎知識,對技術小白來說可以快速入門,對技術老鳥來說可以複習鞏固,廢話不多說,直接進入正題。 PowerShell,相 ...
  • 一 概述 1.什麼是進程? 進程是一個相對獨立的執行單位。 2.什麼是線程? 進程的一部分,進程中實際的任務執行者,必須依附於進程。線程對進程的依賴主要體現在: 線程不能脫離進程開啟,必須在進程開啟的前提下開啟。 線程有時必須從進程中獲取數據。 3.線程與進程的區別? 線程與進程是兩個相對的概念,一 ...
  • 當我們有一個 先序遍歷序列:1,3,7,9,5,11 中序遍歷序列:9,7,3,1,5,11 我們可以很輕鬆的用筆寫出對應的二叉樹。但是用代碼又該如何實現? 下麵我們來簡單談談基本思想。 首先,先序遍歷的順序是根據 根-左孩子-右孩子 的順序遍歷的,那麼我們可以率先確認的是先序遍歷序列的第一個數就是 ...
  • 之前一直都是使用Notepad++來編寫Python代碼,後來想起來之前查資料的時候有個VS Code可以編寫一些的腳本語言(js,node.js)甚至是高級編程語言(C#,PHP,JAVA,Python等)而且這是微軟自家寫的,這就引起我的濃烈興趣了,查了下VS Code發現這東西不錯,而且廣受程 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...