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

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

        基于AVR C++寫的4位數碼管驅動程序

        作者:未知   來源:會員上傳   點擊數:  更新時間:2014年05月22日   【字體:

         我在這里用C++向大家展示一個實用的程序,如果你會C,相信C++對你來說不會很難。而且在我們平時的編程中,又要兼顧PCB,又要記住接線方法,是否會讓你感到很棘手呢?經過我多年的編程經驗,我把這個程序和大家分享,讓大家領略到一些編程的技巧。這個程序需要將數碼管的腳全部連接到MCU的IO上,可以任意連接.

        首先我們需要定義一個mydef.h保存在你的工作目錄下,輸入以下內容,當然是由您自己的喜歡而定義,但是請記住需要對號入座。
         
        #define seLED_QW() (clPB0())
        #define seLED_BW() (clPB0())
        #define seLED_SW() (clPB0())
        #define seLED_GW() (clPB0())
         
        #define clLED_QW() (sePB0())
        #define clLED_BW() (sePB0())
        #define clLED_SW() (sePB0())
        #define clLED_GW() (sePB0())
         
        #define seLED_DQW() (seDB0())
        #define seLED_DBW() (seDB0())
        #define seLED_DSW() (seDB0())
        #define seLED_DGW() (seDB0())
         
        #define seLED_PA() (sePB0())
        #define seLED_PB() (sePB0())
        #define seLED_PC() (sePB0())
        #define seLED_PD() (sePB0())
        #define seLED_PE() (sePB0())
        #define seLED_PF() (sePB0())
        #define seLED_PG() (sePB0())
        #define seLED_PH() (sePB0())
         
        #define seLED_DA() (seDB0())
        #define seLED_DB() (seDB0())
        #define seLED_DC() (seDB0())
        #define seLED_DD() (seDB0())
        #define seLED_DE() (seDB0())
        #define seLED_DF() (seDB0())
        #define seLED_DG() (seDB0())
        #define seLED_DH() (seDB0())
         
        #define clLED_PA() (clPB0())
        #define clLED_PB() (clPB0())
        #define clLED_PC() (clPB0())
        #define clLED_PD() (clPB0())
        #define clLED_PE() (clPB0())
        #define clLED_PF() (clPB0())
        #define clLED_PG() (clPB0())
        #define clLED_PH() (clPB0())
         
        以上大家應該看得明白吧,就是讓編譯器知道LED屏的腳位和最低級的動作。
         
        接下來大家再寫一個.h文件,輸入以下內容,然后保存,通常我習慣把經常需要用到的庫文件保存到c:inc\目錄下,我把它保存為4led.h如果你很聰明的話,當然還可以更改以做出更優秀的作品。
         
        /******************************************************************
         
        函數說明:
         
        void FOURLED::FOURLED(void); 構造函數
        void FOUR_LED::DrawText(const char *p,char x=0); 將字符串顯示到x位置上
        void FOUR_LED::char TEXT(const char *p,unsigned char speed=0); 將字符串按speed定義的速度流動顯示
        char FOUR_LED::out(); 輸出程序,在main里需要定時調用本程序以刷新LED,返回值:0正在刷新,1:結束。
        char FOUR_LED::setBRI(char i)// 顯示屏亮度調整, 0-50 越高亮度越高,越低亮度越低,但是刷新率也會降低(造成閃爍)
         
         
        **********************************************************************/
         
        #include "c:\inc\asciitab.h"
         
        [B ]class FOUR_LED
        {
        private:
        unsigned char bri,i,start,timer;
        public:
        unsigned char sbuffer[4];
        void DrawText(const char *p,char x=0)
        {
        while(*p||x<4)
        {
        if(p[0]==0)
        {
        sbuffer[x]=0;
        }
        else if(p[0]=='.')
        {
        sbuffer[x]=ASCIItab[*p];
        p++;
        }
        else if(p[1]!='.')
        {
        sbuffer[x]=ASCIItab[*p];
        p++;
        }
        else
        {
        sbuffer[x]=ASCIItab[*p]|0x80;
        p+=2;
        }
        x++;
        }
        }
        char TEXT(const char *p,unsigned char speed=0)
        {
        if(speed==0)
        {
        DrawText(p);
        }
        else
        {
        if(start<4)
        {
        sbuffer[0]=sbuffer[1]=sbuffer[2]=sbuffer[3]=0;
        DrawText(p,4-start);
        }
        else
        {
        DrawText(p+start-4);
        if(p[start-1]==0)
        {
        start=0;
        return 1;
        }
        }
        if(timer<0xFF)
        timer++;
        else
        {
        timer=speed;
        start++;
        }
        }
        return 0;
        }
        char out()
        {
        char x;
        clLED_GW();// 黑屏
        clLED_SW();
        clLED_BW();
        clLED_QW();
        if(i<=3)
        {
        x=sbuffer[i ];
        if(x&0x01)// 輸出A~G
        {
        seLED_PA();
        }
        else
        {
        clLED_PA();
        }
        if(x&0x02)
        {
        seLED_PB();
        }
        else
        {
        clLED_PB();
        }
        if(x&0x04)
        {
        seLED_PC();
        }
        else
        {
        clLED_PC();
        }
        if(x&0x08)
        {
        seLED_PD();
        }
        else
        {
        clLED_PD();
        }
        if(x&0x10)
        {
        seLED_PE();
        }
        else
        {
        clLED_PE();
        }
        if(x&0x20)
        {
        seLED_PF();
        }
        else
        {
        clLED_PF();
        }
        if(x&0x40)
        {
        seLED_PG();
        }
        else
        {
        clLED_PG();
        }
        if(x&0x80)
        {
        seLED_PH();
        }
        else
        {
        clLED_PH();
        }
        }
        switch(i)// 置位相應的總控制位(GW~QW)
        {
        case 0:seLED_QW();break;
        case 1:seLED_BW();break;
        case 2:seLED_SW();break;
        case 3:seLED_GW();break;
        }
        if(i<3)
        i++;
        else
        {
        if(bri)
        {
        if(i<bri)
        i++;
        else
        i=0;
        }
        else
        i=0;
        }
        return 0;
        }
        void setBRI(char i)// 0-50 越高亮度越高
        {
        bri=50-i;
        }
        FOUR_LED()
        {
        i=0;
        start=0;
        timer=0xFF;
        bri=0;
        seLED_DA();
        seLED_DB();
        seLED_DC();
        seLED_DD();
        seLED_DE();
        seLED_DF();
        seLED_DG();
        seLED_DH();
        seLED_DQW();
        seLED_DBW();
        seLED_DSW();
        seLED_DGW();
        }
        };
         
         
        這個程序里面包含了一個叫asciitab.h的文件,里面是一個數組,定義了顯示屏能夠顯示的字符。內容如下:
         
        __flash unsigned char ASCIItab[150]=
        {//0 1 2 3 4 5 6 7 8 9
        0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//0
        0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//1
        0x00,0x00,0x00,0x00,0x03,0x18,0x0c,0x18,0x00,0x00,//2
        0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,//3
        0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x00,0x3f,0x06,//4
        0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x00,//5
        0x00,0x48,0x00,0x00,0x00,0x77,0x7c,0x39,0x5e,0x79,//6
        0x71,0x3d,0x76,0x06,0x1e,0x00,0x38,0x00,0x37,0x3f,//7
        0x73,0x67,0x50,0x6d,0x78,0x3e,0x3e,0x00,0x00,0x6e,//8
        0x00,0x39,0x00,0x0f,0x23,0x08,0x00,0x77,0x7c,0x39,//9
        0x5e,0x79,0x71,0x3d,0x76,0x06,0x1e,0x00,0x38,0x00,//10
        0x54,0x5c,0x73,0x67,0x50,0x6d,0x78,0x1c,0x00,0x00,//11
        0x00,0x6e,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,//12
        0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//13
        0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 //14
        };
         
        到了這里,你就可以在你的主程序里面打上這么一句:
         
        #include "io.h"
        #include "mydef.h"
        #include "c:\inc\4led.h"
         
        FOUR_LED led;
         
        int main()
        {
        led.TEXT("3.141");
        while(1)
        {
        led.out();
        }
        }
         
        程序就能夠將3.141顯示在你的顯示屏上了,無論是共陰還是共陽的數碼管都可以用,只要在mydef.h稍做改變即可.是否有點 Hello Word! 的感覺了呢?這是不是很簡單呢?
        把我剛才所說的內容消化一下,保存到某個文件夾里,以后你就可以輕松自如的在任何地方使用LED屏(數碼管)了。
        關閉窗口

        相關文章

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