新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > LED點(diǎn)陣屏(上移)C51程序

        LED點(diǎn)陣屏(上移)C51程序

        作者: 時(shí)間:2012-10-31 來(lái)源:網(wǎng)絡(luò) 收藏

        先來(lái)張效果,圖比較酷吧

        點(diǎn)擊瀏覽下一頁(yè)

        點(diǎn)擊瀏覽下一頁(yè)

        電路原路圖
        以下程序有部分刪減,請(qǐng)從以下地址下載.單片機(jī)型號(hào)是,晶振為11.0592.本人測(cè)試成功.
        完整程序下載:http://www.51hei.com/ziliao/file/dianzhen2.rar

        //*****************************************************
        //程序功能:
        // LED點(diǎn)陣顯示屏,每行顯示字?jǐn)?shù)為 LED_NUM個(gè),
        // 總共可顯示字?jǐn)?shù)為DISP_NUM個(gè),
        // 最大可顯示字?jǐn)?shù)為65536/32=2048個(gè)。
        // 行數(shù)最多可為65536/16=4096行。
        // 循環(huán)時(shí)間參數(shù)為DISP_TIME_MOVE
        //MCU:AT89S52
        //
        //程序編寫(xiě):Bunagi
        //修改時(shí)間:2008/11/11
        //********************************************************
        #include reg51.h>
        //********************************************************
        #define LED_NUM 2 //LED顯示屏字?jǐn)?shù)
        #define DISP_NUM 12 //顯示內(nèi)容字?jǐn)?shù)
        #define DISP_TIME_MOVE 3 //循環(huán)時(shí)間參數(shù)
        //**********************************************************
        #define uchar unsigned char
        #define uint unsigned int
        //*******************************************************
        sbit LED1_SH=P2^0; //595數(shù)據(jù)傳遞控制,上升沿有效
        sbit LED1_DS=P2^1; //595數(shù)據(jù)傳遞輸入
        sbit LED1_ST=P2^2; //595數(shù)據(jù)輸出控制,上升沿有效
        sbit LED1_OE=P2^3; //595片選
        sbit LED2_SH=P2^4; //595數(shù)據(jù)傳遞控制,上升沿有效
        sbit LED2_DS=P2^5; //595數(shù)據(jù)傳遞輸入
        sbit LED2_ST=P2^6; //595數(shù)據(jù)輸出控制,上升沿有效
        sbit LED2_OE=P2^7; //595片選
        //***********************************************************

        uint disp_up_move; //上下移動(dòng)控制
        uchar disp_move_time;
        code uchar disp_code[]={
        0x20,0x08,0x17,0xFC,0x10,0x00,0x03,0xF8, //福
        0xFA,0x08,0x0A,0x08,0x13,0xF8,0x38,0x04,
        0x57,0xFE,0x94,0x44,0x14,0x44,0x17,0xFC,
        0x14,0x44,0x14,0x44,0x17,0xFC,0x14,0x04,
        0x10,0x04,0x10,0x84,0x10,0x84,0x10,0x84, //州

        };

        //*********************************************************
        void disp();
        void sent(uchar sent_dat);
        void delay(uchar temp);
        //****************************************************

        void main()
        {
        P2=0X00;
        TR0=0;
        TL0=0; //20MS
        TH0=0;
        TMOD=0X01; //方式1
        EA=1;
        ET0=1;
        TR0=1;
        while(1)
        {
        disp();
        }
        }

        //**************************************************
        //LED掃描顯示程序。
        //顯示方式為逐字掃描
        //*************************************************

        void disp()
        {
        uchar i,j;
        uint move_ctrl;
        LED1_DS=0;
        LED1_SH=0;
        LED1_ST=0;
        LED1_OE=0;
        LED2_DS=0;
        LED2_SH=0;
        LED2_ST=0;
        LED2_OE=0;
        for(j=0;j8;j++)
        {

        for(i=LED_NUM;i>=1;i--)
        {
        //**************************************字符下半部分***************************************************
        if((disp_up_move+9+j)>((DISP_NUM/LED_NUM)*16)) //判斷要顯示的字符是否已超出字庫(kù)
        {
        sent(0x00);
        sent(0x00);
        }

        else
        {
        if((disp_up_move+8+j)>15) //判斷當(dāng)前行顯示內(nèi)容是否為下一屏內(nèi)容
        {

        move_ctrl=32*(i-1)+(32*LED_NUM)*((disp_up_move+8+j)/16); //判斷顯示字符的下半部第一個(gè)字節(jié)位置
        // 第N個(gè)字符 一屏字符大小*當(dāng)前顯示行為第幾屏
        sent(disp_code[move_ctrl+2*(((disp_up_move%16)+j+8)%16)+1]);
        sent(disp_code[move_ctrl+2*(((disp_up_move%16)+j+8)%16)]);
        /*
        如果有多于一行的LED點(diǎn)陣條,則程序在此添加:
        move_ctrl=32*(i-1)+(32*LED_NUM)*((disp_up_move+8+j)/16)+LED_NUM*32*第幾行;
        sent(disp_code[move_ctrl+2*(((disp_up_move%16)+j+8)%16)+1]);
        sent(disp_code[move_ctrl+2*(((disp_up_move%16)+j+8)%16)]);
        ......
        */
        }
        else
        {
        move_ctrl=32*(i-1)+2*(disp_up_move%16);
        sent(disp_code[move_ctrl+16+j*2+1]);
        sent(disp_code[move_ctrl+16+j*2]);
        /*
        如果有多于一行的LED點(diǎn)陣條,則程序在此添加:
        move_ctrl=32*(i-1)+2*(disp_up_move%16)+LED_NUM*32*第幾行;
        sent(disp_code[move_ctrl+16+j*2+1]);
        sent(disp_code[move_ctrl+16+j*2]);
        ......

        */
        }
        }

        //***********************************字符上半部分***************************************************
        if((disp_up_move+j+1)>(DISP_NUM/LED_NUM)*16)
        {
        sent(0x00);
        sent(0x00);
        }
        else
        {
        if((disp_up_move+j)>15)
        {
        move_ctrl=32*(i-1)+(32*LED_NUM)*((disp_up_move+j)/16);
        sent(disp_code[move_ctrl+2*(((disp_up_move%16)+j)%16)+1]);
        sent(disp_code[move_ctrl+2*(((disp_up_move%16)+j)%16)]);
        /*
        如果有多于一行的LED點(diǎn)陣條,則程序在此添加:
        move_ctrl=32*(i-1)+(32*LED_NUM)*((disp_up_move+j)/16)+LED_NUM*32*第幾行;
        sent(disp_code[move_ctrl+2*(((disp_up_move%16)+j)%16)+1]);
        sent(disp_code[move_ctrl+2*(((disp_up_move%16)+j)%16)]);
        ......
        */
        }
        else
        {
        move_ctrl=32*(i-1)+2*(disp_up_move%16);
        sent(disp_code[move_ctrl+j*2+1]);
        sent(disp_code[move_ctrl+j*2]);
        /*

        如果有多于一行的LED點(diǎn)陣條,則程序在此添加:
        move_ctrl=32*(i-1)+2*(disp_up_move%16)+LED_NUM*32*第幾行;
        sent(disp_code[move_ctrl+j*2+1]);
        sent(disp_code[move_ctrl+j*2]);
        ......
        */
        }
        }
        }


        LED1_SH=1;
        LED1_SH=0;
        LED1_DS=1;
        LED1_ST=1;
        LED1_ST=0;
        LED2_ST=1;
        LED2_ST=0;
        delay(1);
        }

        LED1_OE=1;
        LED2_OE=1;

        }

        //***************************************************
        void sent(uchar sent_dat)
        {
        uchar i;
        for(i=0;i8;i++)
        {
        LED2_DS=sent_dat0x01;
        sent_dat=sent_dat>>1;
        LED2_SH=1;
        LED2_SH=0;
        }

        }

        //************************************************
        void delay(uchar temp)
        {
        uchar i,j;
        for(i=0;itemp;i++)
        for(j=0;j100;j++);
        }

        //********************************************

        void t0() interrupt 1
        {
        TR0=0;
        TL0=0;
        TH0=0;
        if(disp_move_time++>DISP_TIME_MOVE)
        {
        disp_move_time=0;
        if(disp_up_move++ >((DISP_NUM/LED_NUM)*16)-1)disp_up_move=0;
        }
        TR0=1;
        }



        評(píng)論


        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 太保市| 永泰县| 苍梧县| 包头市| 淮南市| 河源市| 陇西县| 永城市| 阳朔县| 峨山| 广汉市| 甘肃省| 乌苏市| 沭阳县| 九龙坡区| 改则县| 潼关县| 柏乡县| 乌恰县| 尼木县| 稻城县| 安阳县| 怀仁县| 科尔| 南投县| 台北县| 商丘市| 包头市| 廉江市| 阳信县| 讷河市| 巴塘县| 黔东| 漳浦县| 翁牛特旗| 南部县| 南开区| 延寿县| 丹棱县| 进贤县| 雷州市|