專注電子技術(shù)學(xué)習(xí)與研究
當前位置:單片機教程網(wǎng) >> MCU設(shè)計實例 >> 瀏覽文章

單片機驅(qū)動點陣16*16綜合C程序-包含各種效果

作者:佚名   來源:本站原創(chuàng)   點擊數(shù):  更新時間:2012年06月30日   【字體:

一、硬件簡介: 經(jīng)過努力,終于完成了我以前一直的夢想,點陣各種模式能獨立原創(chuàng)出點陣屏各種模式:間斷、上移、下移、左移、右移、上拉幕、下拉幕、左拉幕、右拉幕、左覆蓋、右覆蓋等等模式,我認為點陣只要是上移、左移會了,基本其它的都會了!一定要理解了,才算喲,太高興了,現(xiàn)在和大家分享下了,我的硬件是:行是譯碼器74HC154+S8550,列是74HC595移位寄存器.

祥細視頻如下http://www.tudou.com/programs/view/D0SCJyO4RBQ/ 
完整的程序源代碼下載:http://www.torrancerestoration.com/f/dz854.rar

 二、具體原理圖見

電路介紹:http://www.torrancerestoration.com/mcu/1523.html  

三、具體程序代碼如下:

#include<reg52.h>

#define uchar unsigned char

#define uint unsigned int

#define LINE P0//定義行線IO口,即74HC154控制端

#define shudu 12//字移動的速度

sbit DATA=P1^4;//74HC595數(shù)據(jù)端

sbit CLK=P1^5;//74HC595移位脈沖端

sbit CLKR=P1^6;//74HC595數(shù)據(jù)鎖存端

uchar move;//移動幾位變量

uchar line;//行變量

uint word;//字節(jié)變量

uchar ji,gai;//字節(jié)變量

uchar BUF[4];//4組緩存數(shù)組以便左移右移等功能動態(tài)更改數(shù)據(jù)

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

/**********上移上拉左移左拉左覆蓋數(shù)組************************/

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

uchar   code table[]={

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x10,0x3F,0xF8,0x04,0x10,0x04,0x14,0xFF,0xFE,0x04,0x10,0x04,0x10,

0x3F,0xF0,0x04,0x10,0x04,0x00,0x08,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,

0x01,0x00,0x01,0x08,0x7F,0xFC,0x01,0x00,0x3F,0xF8,0x01,0x00,0xFF,0xFE,0x00,0x10,

0x1F,0xF8,0x10,0x10,0x1F,0xF0,0x10,0x10,0x1F,0xF0,0x10,0x10,0x10,0x50,0x10,0x20,

0x01,0x10,0xFF,0x90,0x14,0x50,0x14,0x7C,0x7F,0x50,0x55,0x90,0x55,0x10,0x57,0xFE,

0x61,0x04,0x41,0x7E,0x41,0x44,0x7F,0x44,0x41,0x44,0x41,0x44,0x7F,0x7C,0x41,0x44,

0x00,0x78,0x3F,0x80,0x11,0x10,0x09,0x20,0x7F,0xFE,0x42,0x02,0x82,0x04,0x7F,0xF8,

0x04,0x00,0x07,0xF0,0x0A,0x20,0x09,0x40,0x10,0x80,0x11,0x60,0x22,0x1C,0x0C,0x08,

0x04,0x40,0x04,0x44,0xFF,0xFE,0x04,0x40,0x08,0x7C,0x09,0x44,0x7F,0xC4,0x08,0x7C,

0x0A,0x44,0x3F,0x44,0x22,0x7C,0x22,0x44,0x22,0x44,0x3E,0x44,0x22,0x94,0x01,0x08,

0x08,0x20,0x08,0x24,0xFF,0xFE,0x08,0x20,0x01,0x08,0x3F,0xFC,0x20,0x08,0x20,0x08,

0x3F,0xF8,0x20,0x08,0x20,0x00,0x20,0x00,0x20,0x00,0x40,0x00,0x40,0x00,0x80,0x00,

0x08,0x10,0x08,0x10,0x08,0x10,0x10,0x20,0x10,0x20,0x22,0x44,0x7E,0xFC,0x04,0x08,

0x08,0x10,0x10,0x20,0x20,0x40,0x7E,0xFC,0x00,0x00,0x00,0x04,0xFF,0xFE,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00

};

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

/**********************下拉、下移數(shù)組************************/

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

uchar   code table1[]={

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x08,0x10,0x08,0x10,0x08,0x10,0x10,0x20,0x10,0x20,0x22,0x44,0x7E,0xFC,0x04,0x08,

0x08,0x10,0x10,0x20,0x20,0x40,0x7E,0xFC,0x00,0x00,0x00,0x04,0xFF,0xFE,0x00,0x00,

0x08,0x20,0x08,0x24,0xFF,0xFE,0x08,0x20,0x01,0x08,0x3F,0xFC,0x20,0x08,0x20,0x08,

0x3F,0xF8,0x20,0x08,0x20,0x00,0x20,0x00,0x20,0x00,0x40,0x00,0x40,0x00,0x80,0x00,

0x04,0x40,0x04,0x44,0xFF,0xFE,0x04,0x40,0x08,0x7C,0x09,0x44,0x7F,0xC4,0x08,0x7C,

0x0A,0x44,0x3F,0x44,0x22,0x7C,0x22,0x44,0x22,0x44,0x3E,0x44,0x22,0x94,0x01,0x08,

0x00,0x78,0x3F,0x80,0x11,0x10,0x09,0x20,0x7F,0xFE,0x42,0x02,0x82,0x04,0x7F,0xF8,

0x04,0x00,0x07,0xF0,0x0A,0x20,0x09,0x40,0x10,0x80,0x11,0x60,0x22,0x1C,0x0C,0x08,

0x01,0x10,0xFF,0x90,0x14,0x50,0x14,0x7C,0x7F,0x50,0x55,0x90,0x55,0x10,0x57,0xFE,

0x61,0x04,0x41,0x7E,0x41,0x44,0x7F,0x44,0x41,0x44,0x41,0x44,0x7F,0x7C,0x41,0x44,

0x01,0x00,0x01,0x08,0x7F,0xFC,0x01,0x00,0x3F,0xF8,0x01,0x00,0xFF,0xFE,0x00,0x10,

0x1F,0xF8,0x10,0x10,0x1F,0xF0,0x10,0x10,0x1F,0xF0,0x10,0x10,0x10,0x50,0x10,0x20,

0x00,0x00,0x00,0x10,0x3F,0xF8,0x04,0x10,0x04,0x14,0xFF,0xFE,0x04,0x10,0x04,0x10,

0x3F,0xF0,0x04,0x10,0x04,0x00,0x08,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00

};

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

/*************************右覆蓋數(shù)組************************/

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

uchar code table2[]={

0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,

0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00

};

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

/*************************左覆蓋數(shù)組************************/

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

uchar code table3[]={

0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00,

0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00

};

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

/*****************延時子程序*************/

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

void delay(uchar z)

{

    uchar x,y;

    for(x=2;x>0;x--)

    for(y=z;y>0;y--);

}

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

/**************74HC595送數(shù)子程序********/

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

void song(uchar z)//帶參數(shù)函數(shù)

{

    uchar num,hang;//定義變量

    hang=z;//將形參給變量

    for(num=0;num<8;num++)//移動8次將數(shù)據(jù)發(fā)送完畢

    {

        if(hang&0x01==1)//將高7位屏蔽掉,保留最低位判斷

        DATA=1;//為1就將74HC595數(shù)據(jù)端置1

        else

        DATA=0;//否則給0

        CLK=0;//上升沿送走數(shù)據(jù)

        CLK=1;//高電平形成上升沿

        hang>>=1;//將數(shù)移走一位

    }

}

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

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

/**************************間斷顯示***************************/

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

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

void jian()

{

    while(word<128)//要顯示多少字?

    {

        for(move=150;move>0;move--)//字間斷顯示的速度

        {

            ji=word;

            for(line=0;line<16;line++)

            {

                song(~table[ji*2+1]);//先右半屏

                song(~table[ji*2]);//再左半屏

                ji++;//下一行

                CLKR=1;//在74HC595處鎖存起來

                CLKR=0;

                CLKR=1;

                LINE=line;//打開列

                delay(17);

            }

        }

        word=ji;

    } 

}

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

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

/**************************上移顯示***************************/

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

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

void shang()

{

    while(word<128)

    {

        for(move=20;move>0;move--)

        {

            ji=word;//將變量存起來

            for(line=0;line<16;line++)

            {

                song(~table[ji*2+1]);

                song(~table[ji*2]);

                ji++;

                CLKR=1;//在74HC595處鎖存起來

                CLKR=0;

                CLKR=1;

                LINE=line;

                delay(5);

            }

        }

        word+=1;//數(shù)組數(shù)增加一行,形成上移

    }

}

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

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

/**************************下移顯示***************************/

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

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

void xia()

{

    while(word>1)

    {

        for(move=20;move>0;move--)

        {

            ji=word;//給倒數(shù)第2個字位置地址碼給ji變量

            for(line=0;line<16;line++)

            {

                song(~table1[ji*2+1]);//發(fā)右半屏數(shù) 注意這是數(shù)組1的代碼

                song(~table1[ji*2]);//發(fā)左半屏數(shù)

                ji++;

                CLKR=1;//在74HC595處鎖存起來

                CLKR=0;

                CLKR=1;

                LINE=line;

                delay(5);

            }

        }

        word-=1;//數(shù)組數(shù)減1一行,形成下移

    }

}

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

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

/**************************左移顯示***************************/

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

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

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

/*裝一線數(shù)據(jù)子函數(shù)(即一行數(shù)據(jù))*/

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

void yixian()

{

    uchar s;

    for(s=0;s<2;s++)/*循環(huán)2次,得到第1個字(代碼存在數(shù)組1與2中)

與第2個字(代碼存在數(shù)組2與3中)的某一行數(shù)值*/

    {

        BUF[s*2]=table[word+(32*s)+(line*2)];//左半屏代碼,line表示行數(shù),word表示字數(shù)

        BUF[s*2+1]=table[word+(32*s+1)+(line*2)];//右半屏代碼

    }

}

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

/*將一行數(shù)據(jù)轉(zhuǎn)換出來,然后顯示*/

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

void yipai()

{

    uchar temp,yi;

    if(move<8)//處理移動次數(shù)小于8次的部分

    {

        yi=move;

        temp=(BUF[1]<<yi)|(BUF[2]>>(8-yi));/*將第1個字的右半屏數(shù)左移yi次,

        然后或上第2個字左半屏的8-yi次數(shù),注此句是處理右半屏的數(shù)*/

        song(~temp);//發(fā)送給74HC595

        temp=(BUF[0]<<yi)|(BUF[1]>>(8-yi));/*將第1個字的左半屏數(shù)左移yi次,

        然后或上第1個字右半屏的8-yi次數(shù),注此句是處理左半屏的數(shù)*/

        song(~temp);//發(fā)送給74HC595

    }

    else//處理移動次數(shù)小于8次以外的部分

    {

        yi=move-8;

        temp=(BUF[2]<<yi)|(BUF[3]>>(8-yi));//原理同上

        song(~temp);//發(fā)送給74HC595

        temp=(BUF[1]<<yi)|(BUF[2]>>(8-yi));//原理同上

        song(~temp);//發(fā)送給74HC595

    } 

}

 

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

/************左移子程序**********/

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

void zou()

{

    uchar i;

    while(word<256)

    {

        for(move=0;move<16;move++)//要移多少位?

        {

            for(i=0;i<shudu;i++)//一字移動的速度

            {

                for(line=0;line<16;line++)//掃描16次,即完成一個字的移動

                {

                    yixian();//調(diào)用一線子程序

                    yipai();//調(diào)用數(shù)據(jù)轉(zhuǎn)換子程序

                    LINE=line;//打開行線,即174HC154行線端

                    CLKR=1;//在74HC595處鎖存起來

                    CLKR=0;

                    CLKR=1;

                }

            }

        }

        word=word+32;//一個字顯示完了,就顯示下一個字

    }

}

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

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

/**************************右移顯示***************************/

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

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

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

/*將一行數(shù)據(jù)轉(zhuǎn)換出來,然后顯示*/

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

void yipai1()

{

    uchar temp,yi;

    if(move<8)//處理移動次數(shù)小于8次的部分

    {

        yi=move;//小于8次就直接給移動的次數(shù)

        temp=(BUF[0]<<(8-yi))|(BUF[1]>>yi);/*將第1個字的左半屏數(shù)左移8-yi次,

        然后或上右半屏的yi次數(shù),注此句是處理右半屏的數(shù)*/

        song(~temp);//發(fā)送給74HC595

 

        temp=(BUF[3]<<(8-yi))|(BUF[0]>>yi);/*將第2個字的右半屏數(shù)與第1個字左

        半屏的數(shù)左移8-yi次,然后或上右半屏的yi次數(shù),注此句是處理左半屏的數(shù)*/

        song(~temp);//發(fā)送給74HC595

    }

    else//處理移動次數(shù)小于8次以外的部分

    {

        yi=move-8;//不小于8次就給move-8次給變量

        temp=(BUF[3]<<(8-yi))|(BUF[0]>>yi);/*將第2個字的右半屏數(shù)左移8-yi次,

        然后或上第1個字左半屏的yi次數(shù),注此句是處理右半屏的數(shù)*/

        song(~temp);//發(fā)送給74HC595

 

        temp=(BUF[2]<<(8-yi))|(BUF[3]>>yi);/*將第2個字的左半屏數(shù)左移8-yi次,

        然后或上第2個字的右半屏的yi次數(shù),注此句是處理左半屏的數(shù)*/

        song(~temp);//發(fā)送給74HC595

    }

  

}

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

/************右移子程序**********/

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

void you()

{

    uchar i;

    while(word<256)

    {

        for(move=0;move<16;move++)//要移多少位?

        {

            for(i=0;i<shudu;i++)//一字移動的速度

            {

                for(line=0;line<16;line++)//掃描16次,即完成一個字的移動

                {

                    yixian();//調(diào)用一線子程序

                    yipai1();//調(diào)用數(shù)據(jù)轉(zhuǎn)換子程序

                    LINE=line;//打開行線,即174HC154行線端

                    CLKR=1;//在74HC595處鎖存起來

                    CLKR=0;

                    CLKR=1;

                }

            }

        }

        word=word+32;//一個字顯示完了,就顯示下一個字

    }

}

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

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

/*************************上拉子函數(shù)**************************/

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

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

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

/***********顯示一個整體字子函數(shù)***********/

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

void shang1()//快速上移完一個整體字

{

    ji=word;//將變量給計數(shù)器

    for(line=0;line<16;line++)//循環(huán)16次得到一個整體字

    {

        song(~table[ji*2+1]);//先發(fā)右半屏數(shù)

        song(~table[ji*2]);//再發(fā)左半屏數(shù)

        ji++;//取下一行數(shù)

        CLKR=1;//在74HC595處鎖存起來

        CLKR=0;

        CLKR=1;

        LINE=line;//打開行

        delay(10);

    }

}

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

/****快速將一個字上移16次,即一個整體字****/

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

void shangla()

{

    uchar i;

    while(word<128)

    {

        for(i=0;i<16;i++)//循環(huán)16次將一個字上移16次

        {

            shang1();//調(diào)用顯示

            word+=1;

        }

        for(i=0;i<150;i++)//上移完一個字后,停留一段時間,從而形成上拉

        shang1();

    }

}

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

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

/**************************下拉函數(shù)***************************/

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

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

/********************顯示一個字子程序************************/

void xia1()

{

    ji=word;

    for(line=0;line<16;line++)//循環(huán)16次顯示一個字

    {

        song(~table1[ji*2+1]);

        song(~table1[ji*2]);

        ji++;

        CLKR=1;//在74HC595處鎖存起來

        CLKR=0;

        CLKR=1;

        LINE=line;

        delay(3);

    }

}

/********************將一個字上移16次形成下拉子程序************************/

void xiala()

{

    uchar i;

    while(word>1)

    {

        for(i=0;i<16;i++)//將一個字下位16次

        {

            xia1();//調(diào)用顯示子程序

            word-=1;//下拉1位

        }

        for(i=0;i<150;i++)//下拉16次后停下來

        xia1();//調(diào)用顯示

    }

}

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

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

/**************************左拉子函數(shù)************************/

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

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

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

/*將一行數(shù)據(jù)轉(zhuǎn)換出來,然后顯示*/

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

void yipai2()

{

    uchar temp,yi;

    if(move<8)//處理移動次數(shù)小于8次的部分

    {

        yi=move;

        temp=(BUF[1]<<yi)|(BUF[2]>>(8-yi));/*將第1個字的右半屏數(shù)左移yi次,

        然后或上第2個字左半屏的8-yi次數(shù),注此句是處理右半屏的數(shù)*/

        song(~temp);//發(fā)送給74HC595

        temp=(BUF[0]<<yi)|(BUF[1]>>(8-yi));/*將第1個字的左半屏數(shù)左移yi次,

        然后或上第1個字右半屏的8-yi次數(shù),注此句是處理左半屏的數(shù)*/

        song(~temp);//發(fā)送給74HC595

    }

    else//處理移動次數(shù)小于8次以外的部分

    {

        yi=move-8;

        temp=(BUF[2]<<yi)|(BUF[3]>>(8-yi));//原理同上

        song(~temp);//發(fā)送給74HC595

        temp=(BUF[1]<<yi)|(BUF[2]>>(8-yi));//原理同上

        song(~temp);//發(fā)送給74HC595

    } 

}

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

/*******將一個字移一位***********/

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

void zou3()

{

    for(line=0;line<16;line++)//掃描16次,即完成一個字的移動

    {

        yixian();//調(diào)用一線子程序

        yipai2();//調(diào)用數(shù)據(jù)轉(zhuǎn)換子程序

        LINE=line;//打開行線,即174HC154行線端

        CLKR=1;//在74HC595處鎖存起來

        CLKR=0;

        CLKR=1;

    }

}

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

/*將一個左移16次,形成一個字左拉***/

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

void zoula()

{

    uchar x;

    while(word<256)

    {

        for(move=0;move<16;move++)//要移多少位?

        zou3();

        for(x=0;x<150;x++)

        zou3();

        word=word+32;//一個字顯示完了,就顯示下一個字

    } 

}

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

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

/**************************右拉子函數(shù)***************************/

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

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

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

/*將一行數(shù)據(jù)轉(zhuǎn)換出來,然后顯示*/

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

void yipai3()

{

    uchar temp,yi;

    if(move<8)//處理移動次數(shù)小于8次的部分

    {

        yi=move;//小于8次就直接給移動的次數(shù)

        temp=(BUF[0]<<(8-yi))|(BUF[1]>>yi);/*將第1個字的左半屏數(shù)左移8-yi次,

        然后或上右半屏的yi次數(shù),注此句是處理右半屏的數(shù)*/

        song(~temp);//發(fā)送給74HC595

 

        temp=(BUF[3]<<(8-yi))|(BUF[0]>>yi);/*將第2個字的右半屏數(shù)與第1個字左

        半屏的數(shù)左移8-yi次,然后或上右半屏的yi次數(shù),注此句是處理左半屏的數(shù)*/

        song(~temp);//發(fā)送給74HC595

    }

    else//處理移動次數(shù)小于8次以外的部分

    {

        yi=move-8;//不小于8次就給move-8次給變量

        temp=(BUF[3]<<(8-yi))|(BUF[0]>>yi);/*將第2個字的右半屏數(shù)左移8-yi次,

        然后或上第1個字左半屏的yi次數(shù),注此句是處理右半屏的數(shù)*/

        song(~temp);//發(fā)送給74HC595

 

        temp=(BUF[2]<<(8-yi))|(BUF[3]>>yi);/*將第2個字的左半屏數(shù)左移8-yi次,

        然后或上第2個字的右半屏的yi次數(shù),注此句是處理左半屏的數(shù)*/

        song(~temp);//發(fā)送給74HC595

    }

  

}

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

/*******將一個字移一位***********/

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

void you3()

{

    for(line=0;line<16;line++)//掃描16次,即完成一個字的移動

    {

        yixian();//調(diào)用一線子程序

        yipai3();//調(diào)用數(shù)據(jù)轉(zhuǎn)換子程序

        LINE=line;//打開行線,即174HC154行線端

        CLKR=1;//在74HC595處鎖存起來

        CLKR=0;

        CLKR=1;

    }     

}

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

/*******將一個字右移16位***********/

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

void youla()

{

    uchar i;

    while(word<256)

    {

        for(move=0;move<16;move++)//要移多少位?

        you3();

        for(i=0;i<150;i++)

        you3();

        word=word+32;//一個字顯示完了,就顯示下一個字

    }

}

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

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

/**************************左覆蓋***************************/

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

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

 

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

/*將一行數(shù)據(jù)轉(zhuǎn)換出來,然后顯示*/

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

void yipai5()

{

    uchar temp,yi;

    if(move<8)//處理移動次數(shù)小于8次的部分

    {

        yi=move;

        temp=(BUF[1]);//發(fā)送左半屏的數(shù),在移動右半屏?xí)r,左半屏不動

        song(~temp);//發(fā)送給74HC595

        temp=(BUF[2]&~gai)|(BUF[0]&gai);

        song(~temp);//發(fā)送給74HC595

    }

    else//處理移動次數(shù)小于8次以外的部分

    {

        yi=move-8;

        temp=(BUF[3]&~gai)|(BUF[1]&gai);/*將第1個字的左半屏數(shù)第0列清0或上第二

        個字左半屏最后1行*/

        song(~temp);//發(fā)送給74HC595

        temp=BUF[2];//發(fā)送右半屏的數(shù),在移動左半屏?xí)r,右半屏不動

        song(~temp);//發(fā)送給74HC595

    } 

}

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

/*****掃描16次,形成一列覆蓋*****/

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

void fu3()

{

    uchar i;

    for(i=0;i<2;i++)//一字移動的速度

    {

        for(line=0;line<16;line++)//掃描16次,即完成一個字的移動

        {

            yixian();//調(diào)用一線子程序

            yipai5();//調(diào)用數(shù)據(jù)轉(zhuǎn)換子程序

            LINE=line;//打開行線,即174HC154行線端

            CLKR=1;//在74HC595處鎖存起來

            CLKR=0;

            CLKR=1;

        }

    }

}

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

/***每列移動16次后,形成覆蓋****/

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

void zoufu()

{

    uchar o;

    while(word<256)

    {

        for(move=0;move<16;move++)//移動16次,形成覆蓋

        {

            gai=table3[move];//移動一次改變一次覆蓋變量

            fu3();//調(diào)用覆蓋子程序

        }

        for(o=0;o<60;o++)//一字完后,停一段時間

        {

            fu3();//調(diào)用覆蓋子程序

        }

        word=word+32;//一個字顯示完了,就顯示下一個字

    }

}

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

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

/**************************右覆蓋***************************/

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

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

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

/*將一行數(shù)據(jù)轉(zhuǎn)換出來,然后顯示*/

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

void yipai4()

{

    uchar temp,yi;

    if(move<8)//處理移動次數(shù)小于8次的部分

    {

        yi=move;

        temp=(BUF[1]&gai)|(BUF[3]&~gai);/*將第1個字的右半屏數(shù)第0列清0或上第二

        個字右半屏最后1行*/

        song(~temp);//發(fā)送給74HC595

        temp=(BUF[0]);//發(fā)送左半屏的數(shù),在移動右半屏?xí)r,左半屏不動

        song(~temp);//發(fā)送給74HC595

    }

    else//處理移動次數(shù)小于8次以外的部分

    {

        yi=move-8;

        temp=BUF[3];//發(fā)送右半屏的數(shù),在移動左半屏?xí)r,右半屏不動

        song(~temp);//發(fā)送給74HC595

        temp=(BUF[0]&gai)|(BUF[2]&~gai);/*將第1個字的左半屏數(shù)第0列清0或上第二

        個字左半屏最后1行*/

        song(~temp);//發(fā)送給74HC595

    } 

}

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

/*****掃描16次,形成一列覆蓋*****/

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

void fu2()

{

    uchar i;

    for(i=0;i<2;i++)//一字移動的速度

    {

        for(line=0;line<16;line++)//掃描16次,即完成一個字的移動

        {

            yixian();//調(diào)用一線子程序

            yipai4();//調(diào)用數(shù)據(jù)轉(zhuǎn)換子程序

            LINE=line;//打開行線,即174HC154行線端

            CLKR=1;//在74HC595處鎖存起來

            CLKR=0;

            CLKR=1;

        }

    }

}

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

/***每列移動16次后,形成覆蓋****/

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

void youfu()

{

    uchar o;

    while(word<256)

    {

        for(move=0;move<16;move++)//移動16次,形成覆蓋

        {

            gai=table2[move];//移動一次改變一次覆蓋變量

            fu2();//調(diào)用覆蓋子程序

        }

        for(o=0;o<60;o++)//一字完后,停一段時間

        {

            fu2();//調(diào)用覆蓋子程序

        }

        word=word+32;//一個字顯示完了,就顯示下一個字

    }

}

 

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

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

/**************************主函數(shù)***************************/

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

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

void main()

{

    while(1)

    {

       word=0;//初始化變量

       jian();//間斷顯示子程序

 

       word=0;

       shang();//調(diào)用上移子程序

 

       word=128;//賦初值以便形成下移

       xia();//調(diào)用下移子程序

 

       word=0;

       zou();//調(diào)用左移子程序

 

       word=0;

       you();//調(diào)用右移子程序

 

       word=0;

       shangla();//調(diào)用上拉子程序

 

       word=128;

       xiala();//調(diào)用下拉子程序

 

       word=0;

       zoula();//調(diào)用左拉子程序

 

       word=0;

       youla();//調(diào)用右拉子程序

 

       word=0;

       zoufu();//調(diào)用左覆蓋子程序

 

       word=0;

       youfu();//調(diào)用右覆蓋子程序

 

    }

}

 

關(guān)閉窗口

相關(guān)文章