新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > LED點陣屏(上移)C51程序

        LED點陣屏(上移)C51程序

        作者: 時間:2012-10-31 來源:網絡 收藏

        先來張效果,圖比較酷吧

        點擊瀏覽下一頁

        點擊瀏覽下一頁

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

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

        uint disp_up_move; //上下移動控制
        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)) //判斷要顯示的字符是否已超出字庫
        {
        sent(0x00);
        sent(0x00);
        }

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

        move_ctrl=32*(i-1)+(32*LED_NUM)*((disp_up_move+8+j)/16); //判斷顯示字符的下半部第一個字節位置
        // 第N個字符 一屏字符大小*當前顯示行為第幾屏
        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點陣條,則程序在此添加:
        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點陣條,則程序在此添加:
        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點陣條,則程序在此添加:
        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點陣條,則程序在此添加:
        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;
        }



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 池州市| 溆浦县| 左权县| 雷波县| 正安县| 合肥市| 和田县| 长汀县| 大城县| 临泉县| 剑河县| 榆社县| 南皮县| 长汀县| 田阳县| 德庆县| 通江县| 克拉玛依市| 临洮县| 邯郸县| 邢台市| 班玛县| 龙陵县| 威远县| 利辛县| 景东| 九龙县| 青阳县| 金平| 安乡县| 页游| 新宁县| 宁城县| 宁津县| 尼勒克县| 桓台县| 宜章县| 通海县| 达拉特旗| 佛山市| 施秉县|