<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

        數碼管動態掃描三種實現方法

        作者:寒竹子   來源:本站原創   點擊數:  更新時間:2014年03月21日   【字體:

         本程序所用的原理圖下載: 點這里 ,單片機芯片使用的stc89c51;找到數碼管部分的原理圖即可.這是一整個單片機開發板的電路圖其他的忽略.

        以下是3個程序的源碼:
        /**********利用定時器定時50毫秒動態掃描數碼管***********/
        /**
        *功能:定時器T1實現數碼管動態掃瞄123456(if)
        *作者:徐冉
        *日期:2013-06-12-22:10
        *備注:不同的方法實現顯示設備的動態掃描,節約能耗
        **/
        /****************AT89C52-RC MCU*************/
        /****************51hei開發板*************/
        #include <reg52.h>
        typedef unsigned int uint;
        typedef unsigned char uchar;
        sbit wela = P2^7;
        sbit dula = P2^6;
        //段選數據編碼表
        uchar code table[] = {
               0x3F,  //"0"
                        0x06,  //"1"
                        0x5B,  //"2"
                        0x4F,  //"3"
                        0x66,  //"4"
                        0x6D,  //"5"
                        0x7D,  //"6"
                        0x07,  //"7"
                        0x7F,  //"8"
                        0x6F  //"9"
             };
        //位選數據編碼表
        uchar code table1[] = {
             0xfe,
             0xfd,
             0xfb,
             0xf7,
             0xef,
             0xdf
               };
        uchar j = 1, counter = 0;
        //延時程序
        void display()
        {
         dula = 1;
         P0 = table[j++];
         dula = 0;
         if(j >= 7)
         {
          j = 1;
         }
        }
        //刷新程序
        void refrash()
        {
         static uchar i = 0;
         if(0 == i)
         {
          wela = 1;
          P0 = table1[0];
          wela = 0;
         }
         if(1 == i)
         {
          wela = 1;
          P0 = table1[1];
          wela = 0;
         }
         if(2 == i)
         {
          wela = 1;
          P0 = table1[2];
          wela = 0;
         }
         if(3 == i)
         {
          wela = 1;
          P0 = table1[3];
          wela = 0;
         }
         if(4 == i)
         {
          wela = 1;
          P0 = table1[4];
          wela = 0;
         }
         if(5 == i)
         {
          wela = 1;
          P0 = table1[5];
          wela = 0;
         }
         i++;
         if(i >= 6)
         {
          i = 0;
         }
        }
        //定時器T1初始化
        void init()
        {
         P0 = 0x00;//關閉數碼管顯示
         TMOD = 0x11;
         TH1 = 0xFC; //T1定時1毫秒
         TL1 = 0x66;
         TR1 = 1;
         EA = 1;
         ET1 = 1;
        }
        //主程序
        void main(void)
        {
         init();
         while(1)
         {
          if(counter == 50)
          {
           counter = 0;
           display();//顯示
           refrash();//刷新
          }
            }
        }
        //T1中斷服務程序
        void timer1_int() interrupt 3
        {
          TH1 = 0xFC;
           TL1 = 0x66;
          counter++;
        }

        /**********利用定時器定時50毫秒動態掃描數碼管***********/
        /**
        *功能:定時器T1實現數碼管動態掃瞄123456(switch case)
        *作者:徐冉
        *日期:2013-06-12-21:50
        *備注:不同的方法實現顯示設備的動態掃描,節約能耗
        **/
        /****************AT89C52-RC MCU*************/
        /****************51hei開發板*************/
        #include <reg52.h>
        typedef unsigned int uint;
        typedef unsigned char uchar;
        sbit wela = P2^7;
        sbit dula = P2^6;
        //段選數據編碼表
        uchar code table[] = {
               0x3F,  //"0"
                        0x06,  //"1"
                        0x5B,  //"2"
                        0x4F,  //"3"
                        0x66,  //"4"
                        0x6D,  //"5"
                        0x7D,  //"6"
                        0x07,  //"7"
                        0x7F,  //"8"
                        0x6F  //"9"
             };
        //位選數據編碼表
        uchar code table1[] = {
             0xfe,
             0xfd,
             0xfb,
             0xf7,
             0xef,
             0xdf
               };
        uchar j = 1, counter = 0;
        //延時程序
        void display()
        {
         dula = 1;
         P0 = table[j++];
         dula = 0;
         if(j >= 7)
         {
          j = 1;
         }
        }
        //刷新程序
        void refrash()
        {
          static uchar i = 0;
          switch(i)
          {
            case 0: wela = 1; P0 = table1[i]; wela = 0; i++;
           break;
            case 1: wela = 1; P0 = table1[i]; wela = 0; i++;
           break;
            case 2: wela = 1; P0 = table1[i]; wela = 0; i++;
           break;
            case 3: wela = 1; P0 = table1[i]; wela = 0; i++;
           break;
            case 4: wela = 1; P0 = table1[i]; wela = 0; i++;
           break;
            case 5: wela = 1; P0 = table1[i]; wela = 0; i++;
           break;
           default: break;
          }
          if(i >= 6)
          {
           i = 0;
          }
        }
        //定時器T1初始化
        void init()
        {
         P0 = 0x00;//關閉數碼管顯示
         TMOD = 0x11;
         TH1 = 0xFC; //T1定時1毫秒
         TL1 = 0x66;
         TR1 = 1;
         EA = 1;
         ET1 = 1;
        }
        //主程序
        void main(void)
        {
         init();
         while(1)
         {
          if(counter == 50)
          {
           counter = 0;
           display();//顯示
           refrash();//刷新
          }
            }
        }
        //T1中斷服務程序
        void timer1_int() interrupt 3
        {
          TH1 = 0xFC;
           TL1 = 0x66;
          counter++;
        }

        /**********利用延時函數定時50毫秒動態掃描數碼管***********/
        /**
        *功能:延時函數實現數碼管動態掃瞄123456
        *作者:徐冉
        *日期:2013-06-12-20:50
        *備注:不同的方法實現顯示設備的動態掃描,節約能耗
        **/
        /****************AT89C52-RC MCU*************/
        /****************51hei開發板*************/
        #include <reg52.h>
        typedef unsigned int uint;
        typedef unsigned char uchar;
        sbit wela = P2^7;
        sbit dula = P2^6;
        //段選編碼表
        uchar code table[] = {
            0x3F,  //"0"
                        0x06,  //"1"
                        0x5B,  //"2"
                        0x4F,  //"3"
                        0x66,  //"4"
                        0x6D,  //"5"
                        0x7D,  //"6"
                        0x07,  //"7"
                        0x7F,  //"8"
                        0x6F  //"9"
                 };
        //位選編碼表
        uchar code table1[] = {
              0xfe,
              0xfd,
              0xfb,
              0xf7,
              0xef,
              0xdf
              };
        //毫秒延時程序
        void delay(uint xms)
        {
         uint x, y;
         for(x = 0; x < xms; x++)
           for(y = 0; y < 110; y++);
        }
        //動態掃描程序
        void display()
        {
         static uchar i = 0;//靜態變量i
         dula = 1;
         P0 = table[i+1];//段選數據
         dula = 0;
         P0 = 0xff;//消影
         wela = 1;
         P0 = table1[i]; //位選數據
         wela = 0;
         delay(50);//延時50毫秒
         i++;
         if(i >= 6)
         {
          i = 0;
         }
        }
        //主程序
        void main(void)
        {
         P0 = 0x00;//開始時關閉所有數碼管顯示
         while(1)
         {
          display();
         }
        }

         

        關閉窗口

        相關文章

        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮