在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

寫一個數碼管動態掃描的程序,實現兼驗證動態顯示原理

2oON_changxuemc ? 2018-01-21 10:56 ? 次閱讀

多個數碼管顯示數字的時候,我們實際上是輪流點亮數碼管(一個時刻內只有一個數碼管是亮的),利用人眼的視覺暫留現象(也叫余輝效應),就可以做到看起來是所有數碼管都同時亮了,這就是動態顯示,也叫做動態掃描。

例如:有 2 個數碼管,我們要顯示“12”這個數字,先讓高位的位選三極管導通,然后控制段選讓其顯示“1”,延時一定時間后再讓低位的位選三極管導通,然后控制段選讓其顯示“2”。把這個流程以一定的速度循環運行就可以讓數碼管顯示出“12”,由于交替速度非常快,人眼識別到的就是“12”這兩位數字同時亮了。

那么一個數碼管需要點亮多長時間呢?也就是說要多長時間完成一次全部數碼管的掃描呢(很明顯:整體掃描時間=單個數碼管點亮時間*數碼管個數)?答案是:10ms 以內。當電視機和顯示器還處在 CRT(電子顯像管)時代的時候,有一句很流行的廣告語——“100Hz無閃爍”,沒錯,只要刷新率大于 100Hz,即刷新時間小于 10ms,就可以做到無閃爍,這也就是我們的動態掃描的硬性指標。那么你也許會問,有最小值的限制嗎?理論上沒有,但實際上做到更快的刷新卻沒有任何進步的意義了,因為已經無閃爍了,再快也還是無閃爍,只是徒然增加 CPU 的負荷而已(因為 1 秒內要執行更多次的掃描程序)。所以,通常我們設計

程序的時候,都是取一個接近 10ms,又比較規整的值就行了。我們開發板上有 6 個數碼管,那么我們現在就來著手寫一個數碼管動態掃描的程序,實現兼驗證上面講的動態顯示原理。

我們的目標還是實現秒表功能,只不過這次有 6 個位了,最大可以計到 999999 秒。那么現在要實現的這個程序相對于前幾章的例程來說就要復雜的多了,既要處理秒表計數,又要處理動態掃描。在編寫這類稍復雜的程序時,建議初學者們先用程序流程圖來把程序的整個流程理清,在動手寫程序之前先把整個程序的結構框架搭好,把每一個環節要實現的功能先細化出來,然后再用程序代碼一步一步的去實現出來。這樣就可以避免無處下筆的迷茫感了。如圖 6-1 就是本例的程序流程圖,大家先根據流程圖把程序的執行經過在大腦里走一遍,然后再看接下來的程序代碼,體會一下流程圖的作用,看是不是能幫助你更順暢的理清程序流程。

圖 6-1 數碼管動態顯示秒表程序流程圖

#include

sbit ADDR0 = P1^0;

sbit ADDR1 = P1^1;

sbit ADDR2 = P1^2;

sbit ADDR3 = P1^3;

sbit ENLED = P1^4;

unsigned char code LedChar[] = { //數碼管顯示字符轉換表

0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,

0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E

};

unsigned char LedBuff[6] = { //數碼管顯示緩沖區,初值 0xFF 確保啟動時都不亮

0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF

};

void main(){

unsigned char i = 0; //動態掃描的索引

unsigned int cnt = 0; //記錄 T0 中斷次數

unsigned long sec = 0; //記錄經過的秒數

ENLED = 0; //使能 U3,選擇控制數碼管

ADDR3 = 1; //因為需要動態改變 ADDR0-2 的值,所以不需要再初始化了

TMOD = 0x01; //設置 T0 為模式 1

TH0 = 0xFC; //為 T0 賦初值 0xFC67,定時 1ms

TL0 = 0x67;

TR0 = 1; //啟動 T0

while (1){

if (TF0 == 1){ //判斷 T0 是否溢出

TF0 = 0; //T0 溢出后,清零中斷標志

TH0 = 0xFC; //并重新賦初值

TL0 = 0x67;

cnt++; //計數值自加 1

if (cnt >= 1000){ //判斷 T0 溢出是否達到 1000 次

cnt = 0; //達到 1000 次后計數值清零

sec++; //秒計數自加 1

//以下代碼將 sec 按十進制位從低到高依次提取并轉為數碼管顯示字符

LedBuff[0] = LedChar[sec%10];

LedBuff[1] = LedChar[sec/10%10];

LedBuff[2] = LedChar[sec/100%10];

LedBuff[3] = LedChar[sec/1000%10];

LedBuff[4] = LedChar[sec/10000%10];

LedBuff[5] = LedChar[sec/100000%10];

}

//以下代碼完成數碼管動態掃描刷新

if (i == 0)

{ ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=LedBuff[0]; }

else if (i == 1)

{ ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=LedBuff[1]; }

else if (i == 2)

{ ADDR2=0; ADDR1=1; ADDR0=0; i++; P0=LedBuff[2]; }

else if (i == 3)

{ ADDR2=0; ADDR1=1; ADDR0=1; i++; P0=LedBuff[3]; }

else if (i == 4)

{ ADDR2=1; ADDR1=0; ADDR0=0; i++; P0=LedBuff[4]; }

else if (i == 5)

{ ADDR2=1; ADDR1=0; ADDR0=1; i=0; P0=LedBuff[5]; }

}

}

}

這段程序,大家自己抄到 Keil 中,然后邊抄邊結合程序流程圖來理解,最終下載到實驗板上看一下運行結果。其中下邊的 if...else 語句就是每 1ms 快速的刷新一個數碼管,這樣 6個數碼管整體刷新一遍的時間就是 6ms,視覺感官上就是 6 個數碼管同時亮起來了。

在 C 語言中, /”等同于數學里的除法運算,而“%”等同于我們小學學的求余數運算,這個前邊已有介紹。如果是 123456 這個數字,我們要正常顯示在數碼管上,個位顯示,就是直接對 10 取余數,這個“6”就出來了,十位數字就是先除以 10,然后再對 10 取余數,以此類推,就把 6 個數字全部顯示出來了。

對于多選一的動態刷新數碼管的方式,我們如果用 switch 會有更好的效果,大家來看一下我們用 switch 語句完成的情況。

#include

sbit ADDR0 = P1^0;

sbit ADDR1 = P1^1;

sbit ADDR2 = P1^2;

sbit ADDR3 = P1^3;

sbit ENLED = P1^4;

unsigned char code LedChar[] = { //數碼管顯示字符轉換表

0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,

0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E

};

unsigned char LedBuff[6] = { //數碼管顯示緩沖區,初值 0xFF 確保啟動時都不亮

0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF

};

void main(){

unsigned char i = 0; //動態掃描的索引

unsigned int cnt = 0; //記錄 T0 中斷次數

unsigned long sec = 0; //記錄經過的秒數

ENLED = 0; //使能 U3,選擇控制數碼管

ADDR3 = 1; //因為需要動態改變 ADDR0-2 的值,所以不需要再初始化了

TMOD = 0x01; //設置 T0 為模式 1

TH0 = 0xFC; //為 T0 賦初值 0xFC67,定時 1ms

TL0 = 0x67;

TR0 = 1; //啟動 T0

while (1){

if (TF0 == 1){ //判斷 T0 是否溢出

TF0 = 0; //T0 溢出后,清零中斷標志

TH0 = 0xFC; //并重新賦初值

TL0 = 0x67;

cnt++; //計數值自加 1

if (cnt >= 1000){ //判斷 T0 溢出是否達到 1000 次

cnt = 0; //達到 1000 次后計數值清零

sec++; //秒計數自加 1

//以下代碼將 sec 按十進制位從低到高依次提取并轉為數碼管顯示字符

LedBuff[0] = LedChar[sec%10];

LedBuff[1] = LedChar[sec/10%10];

LedBuff[2] = LedChar[sec/100%10];

LedBuff[3] = LedChar[sec/1000%10];

LedBuff[4] = LedChar[sec/10000%10];

LedBuff[5] = LedChar[sec/100000%10];

}

//以下代碼完成數碼管動態掃描刷新

switch (i){

case 0: ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=LedBuff[0]; break;

case 1: ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=LedBuff[1]; break;

case 2: ADDR2=0; ADDR1=1; ADDR0=0; i++; P0=LedBuff[2]; break;

case 3: ADDR2=0; ADDR1=1; ADDR0=1; i++; P0=LedBuff[3]; break;

case 4: ADDR2=1; ADDR1=0; ADDR0=0; i++; P0=LedBuff[4]; break;

case 5: ADDR2=1; ADDR1=0; ADDR0=1; i=0; P0=LedBuff[5]; break;

default: break;

}

}

}

}

程序完成的功能是一模一樣的,但大家看一下,switch 語句是不是比 if...else 語句顯得要整齊清爽呢。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數碼管
    +關注

    關注

    32

    文章

    1889

    瀏覽量

    92269
  • 動態顯示
    +關注

    關注

    0

    文章

    40

    瀏覽量

    11839

原文標題:單片機數碼管動態顯示程序及原理講解

文章出處:【微信號:changxuemcu,微信公眾號:暢學單片機】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    數碼管動態顯示

    數碼管動態顯示,要讓數碼管顯示0到7這8個數字,如上所示為主函數代碼。我的問題是為什么要加上P0=0xff這行代碼?按照
    發表于 08-27 15:33

    如何實現數碼管動態顯示

    實現功能:按下按鍵時,數碼管動態顯示‘ 鍵值-掃描值 ’按鍵松開時,數碼管動態顯示‘ 0-00
    發表于 01-07 06:22

    數碼管動態顯示的基本原理與實現思路

    、模塊題目二、原理簡述動態顯示的基本原理與實現思路(轉載)動態顯示實質上就是輪流點亮單個數碼管實現
    發表于 01-11 06:32

    完成數碼管動態顯示的方法

    開拓者FPGA開發板上有六共陽極八段數碼管,本實驗將完成數碼管動態顯示數碼管動態/靜態
    發表于 01-18 10:25

    分享基本的數碼管動態顯示案例

    穩定地顯示各自的圖案。在上個鏈接的文章,即介紹模塊化設計的文章中,有實例是利用撥碼開關手動地控制數碼管的位選。而在實現
    發表于 08-01 15:21

    FPGA入門實現教程之數碼管動態顯示

    FPGA入門實現教程之數碼管動態顯示
    發表于 11-13 16:25 ?93次下載

    數碼管動態顯示)【C語言版】

    數碼管動態顯示)【C語言版】數碼管動態顯示)【C語言版】數碼管動態顯示)【C語言版】
    發表于 12-29 15:51 ?0次下載

    MIN數碼管動態顯示

    數碼管動態顯示,MIN數碼管動態顯示,MIN。
    發表于 05-03 10:48 ?11次下載

    8個數碼管靜態顯示_數碼管動態顯示

    本文主要介紹了幾個數碼管靜態顯示以及數碼管動態顯示程序數碼管由多個發光二極
    發表于 01-16 16:37 ?2w次閱讀
    8<b class='flag-5'>個數碼管</b>靜態<b class='flag-5'>顯示</b>_<b class='flag-5'>數碼管</b>的<b class='flag-5'>動態顯示</b>

    數碼管動態掃描顯示01234567程序(三種方案)

    在高校電子信息類專業單片機的教學過程中,數碼管動態顯示實現方法是學生普遍反映較難掌握的內容。鑒于此,本文為大家帶來三個數碼管動態
    發表于 01-29 11:24 ?9.8w次閱讀
    <b class='flag-5'>數碼管</b><b class='flag-5'>動態</b><b class='flag-5'>掃描</b><b class='flag-5'>顯示</b>01234567<b class='flag-5'>程序</b>(三種方案)

    通過FPGA DIY開發板實現數碼管動態顯示

    8個數碼管動態顯示數字,數碼管依次顯示數字0~7
    的頭像 發表于 06-20 01:29 ?4602次閱讀
    通過FPGA DIY開發板<b class='flag-5'>實現</b><b class='flag-5'>數碼管</b><b class='flag-5'>動態顯示</b>

    使用數碼管動態顯示123456的程序免費下載

    本文檔的主要內容詳細介紹的是使用數碼管動態顯示123456的程序免費下載。解釋:數碼管動態顯示,其實就是
    發表于 08-07 17:33 ?13次下載
    使用<b class='flag-5'>數碼管</b><b class='flag-5'>動態顯示</b>123456的<b class='flag-5'>程序</b>免費下載

    使用51單片機設計數碼管動態顯示的電路圖和程序及資料說明

    數碼管的靜態顯示,是指定某一個或者幾個數碼管,然后顯示數據。動態顯示方式,所謂
    發表于 07-15 17:39 ?6次下載
    使用51單片機設計<b class='flag-5'>數碼管</b><b class='flag-5'>動態顯示</b>的電路圖和<b class='flag-5'>程序</b>及資料說明

    FPGA入門系列實驗教程之使用FPGA實現數碼管動態顯示的資料免費下載

    實現開發板上 8 個數碼管動態顯示 0~7。通過這個實驗,掌握采用 Verilog HDL語言編程實現 7 段數碼管
    發表于 06-12 16:32 ?15次下載
    FPGA入門系列實驗教程之使用FPGA<b class='flag-5'>實現</b><b class='flag-5'>數碼管</b><b class='flag-5'>動態顯示</b>的資料免費下載

    數碼管動態顯示的原理概述

    動態顯示的特點是將所有數碼管的段選線并聯在起,由位選線控制是哪一位數碼管有效。選亮數碼管采用動態
    發表于 11-04 08:00 ?0次下載
    主站蜘蛛池模板: 久久女同 | 久久www免费人成高清 | 日本天天射| 伊人网亚洲| 两性毛片| 国产精品无码永久免费888 | 成人爽a毛片在线视频网站 成人窝窝午夜看片 | 一级特级毛片免费 | 午夜在线免费视频 | 人人澡 人人澡 人人看 | 色偷偷免费 | 五月综合激情视频在线观看 | 午夜精品久久久久久久第一页 | 国产成人精品免费视频大全可播放的 | 国产大片免费观看中文字幕 | 毛片网在线 | 国产三级高清 | 201天天爱天天做 | 亚洲欧美国产五月天综合 | 五月婷婷丁香六月 | 日本经典在线三级视频 | 激情五月婷婷色 | 一本到卡二卡三卡视频 | 五月花综合 | 欧美人与动性xxxxbbbb | 久久久久国产精品免费网站 | 双性强迫开宫灌满h | 日韩一级免费毛片 | 免费黄色在线观看 | 欧美xxxxx性视频 | 中国美女一级黄色片 | 97在线人人 | 亚1州区2区3区4区产品乱码 | 四虎影院大全 | 在线免费看视频 | 二区视频在线 | 天堂中文资源在线地址 | 色偷偷av男人的天堂 | 日韩h视频| 久热国产精品视频 | a爱视频|