新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 單片機實現7段數碼管顯示

        單片機實現7段數碼管顯示

        作者: 時間:2016-11-18 來源:網絡 收藏
        這個是我學習單片機過程中所做的第一個實驗,我們上課實驗用的是匯編的程序,但是個人覺得還是用c語實現時更為簡潔!這個例子可以用proteus進行仿真.

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

        單片機選擇常用的AT89C52,用與控制7段數碼管的顯示,共有4位7段共陰極數碼管,用于顯示數據.另外所需的器件如下:

        1、74ls273地址鎖存器,用于字位鎖存器和字型鎖存器,上升沿鎖存。

        2、74ls02雙輸入或非門,與74ls04、單片機的讀寫信號一起選中鎖存器74ls273,決定數碼管的字段和字位的顯示內容。

        3、74ls04是6輸入非門,對單片機輸出的片選信號取反,和74ls02一起決定鎖存器的片選。

        4、7407集電極開路的6正相高壓驅動器,提供數碼觀字型顯示的驅動電流。

        5、75452雙與非門外圍驅動器,用與字位驅動,有200mA的輸出電流能力。

        試驗流程圖:

        實驗電路圖:

        試驗程序代碼:

        /* 4位8段數碼管分別動態顯示“1234”,*/

        #include "7LEDShow.h"

        void main()

        {

        DIGPORT = 0;//關閉顯示

        TMOD = 0x01;// T0工作方式1

        /* 2ms定時設置*/

        time0_tmp = 65536-time0*fosc/12;

        TH0 = (time0_tmp/256);

        TL0 = (time0_tmp%256);

        TR0 = 1;

        ET0 = 1;

        EA = 1;

        digbit = 0x01;//從第一位數碼管開始

        wordbuf[3] = 4;

        wordbuf[2] = 3;

        wordbuf[1] = 2;

        wordbuf[0] = 1;

        while(1);

        }

        /*定時器0中斷服務子程序,定時動態掃描顯示*/

        void time0_int(void) interrupt 1

        {

        TH0 = (time0_tmp/256);

        TL0 = (time0_tmp%256);

        display();

        }

        /*根據共陰極字型編碼表獲取0~9,A~B字型代碼*/

        uchar getcode(uchar i)

        {

        uchar p;

        switch (i)

        {

        case 0:p=0x3f; break;/* 0 */

        case 1:p=0x06; break;/* 1 */

        case 2:p=0x5B; break;/* 2 */

        case 3:p=0x4F; break;/* 3 */

        case 4:p=0x66; break;/* 4 */

        case 5:p=0x6D; break;/* 5 */

        case 6:p=0x7D; break;/* 6 */

        case 7:p=0x07; break;/* 7 */

        case 8:p=0x7F; break;/* 8 */

        case 9:p=0x67; break;/* 9 */

        case 10: p=0x77; break;/* A */

        case 11: p=0x7C; break;/* B */

        case 12: p=0x39; break;/* C */

        case 13: p=0x5E; break;/* D */

        case 14: p=0x79; break;/* E */

        case 15: p=0x71; break;/* F */

        default:break;

        }

        return(p);

        }

        /*顯示函數*/

        void display(void)

        {

        uchar i;

        switch (digbit)

        {

        case 1: i=0;break;

        case 2: i=1;break;

        case 4: i=2;break;

        case 8: i=3;break;

        default:break;

        }

        DIGPORT = 0;//關閉顯示

        WORDPORT = getcode(wordbuf[i]);//送字型碼

        DIGPORT = digbit;//送字位碼

        if (digbit<0x08)

        digbit = digbit*2;

        else

        digbit = 0x01;

        }

        //7LEDShow.h程序

        #ifndef _7LEDSHOW_H//防止7LEDShow.h被重復引用

        #define _7LEDSHOW_H

        #include //引用標準庫的頭文件

        #include

        #include

        #include

        #define uchar unsigned char

        #define uint unsigned int

        #define DIGPORTXBYTE[0x0200] //定義字位口

        #define WORDPORTXBYTE[0x0100] //定義字型口

        #define fosc 11.0592//晶振頻率

        #define time0 2000//定時2000us

        uchar digbit;//字位

        uchar wordbuf[4];//字型碼緩沖區

        uint idata time0_tmp;//臨時變量,用于計算定時

        uchar getcode(uchar i);//根據共陰極字型編碼表獲取字型代碼函數

        void display(void);//顯示函數

        #endif



        關鍵詞: 單片機數碼管顯

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 尖扎县| 志丹县| 高邑县| 弥勒县| 吉水县| 遵化市| 武宁县| 三穗县| 浦北县| 平凉市| 宝坻区| 南宫市| 龙南县| 正蓝旗| 依安县| 保亭| 临泽县| 湾仔区| 疏勒县| 元江| 凭祥市| 安丘市| 河曲县| 阿克陶县| 房山区| 韶山市| 龙井市| 右玉县| 海口市| 邮箱| 嫩江县| 新兴县| 阳曲县| 双城市| 汉川市| 溆浦县| 桃江县| 峡江县| 高邮市| 阜城县| 南郑县|