新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 單片機(jī)驅(qū)動(dòng)點(diǎn)陣16*16綜合C程序-包含各種效果

單片機(jī)驅(qū)動(dòng)點(diǎn)陣16*16綜合C程序-包含各種效果

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

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

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

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

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

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

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

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

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

void yixian()

{

uchar s;

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

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

{

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

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

}

}

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

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

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

void yipai()

{

uchar temp,yi;

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

{

yi=move;

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

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

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

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

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

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

}

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

{

yi=move-8;

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

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

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

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

}

}

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

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

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

void zou()

{

uchar i;

while(word<256)

{

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

{

for(i=0;i {

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

{

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

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

LINE=line;//打開(kāi)行線,即174HC154行線端

CLKR=1;//在74HC595處鎖存起來(lái)

CLKR=0;

CLKR=1;

}

}

}

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

}

}

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

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

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

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

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

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

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

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

void yipai1()

{

uchar temp,yi;

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

{

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

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

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

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

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

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

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

}

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

{

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

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

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

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

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

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

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

}

}

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

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

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

void you()

{

uchar i;

while(word<256)

{

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

{

for(i=0;i {

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

{

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

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

LINE=line;//打開(kāi)行線,即174HC154行線端

CLKR=1;//在74HC595處鎖存起來(lái)

CLKR=0;

CLKR=1;

}

}

}

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

}

}

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

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

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

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

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

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

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

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

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

{

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

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

{

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

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

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

CLKR=1;//在74HC595處鎖存起來(lái)

CLKR=0;

CLKR=1;

LINE=line;//打開(kāi)行

delay(10);

}

}

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

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

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

void shangla()

{

uchar i;

while(word<128)

{

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

{

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

word+=1;

}

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

shang1();

}

}

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

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

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

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

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

/********************顯示一個(gè)字子程序************************/

void xia1()

{

ji=word;

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

{

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

song(~table1[ji*2]);

ji++;

CLKR=1;//在74HC595處鎖存起來(lái)

CLKR=0;

CLKR=1;

LINE=line;

delay(3);

}

}

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

void xiala()

{

uchar i;

while(word>1)

{

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

{

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

word-=1;//下拉1位

}

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

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

}

}

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

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

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

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

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

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

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

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

void yipai2()

{

uchar temp,yi;

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

{

yi=move;

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

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

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

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

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

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

}

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

{

yi=move-8;

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

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

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

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

}

}

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

/*******將一個(gè)字移一位***********/

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

void zou3()

{

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

{

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

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

LINE=line;//打開(kāi)行線,即174HC154行線端

CLKR=1;//在74HC595處鎖存起來(lái)

CLKR=0;

CLKR=1;

}

}

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

/*將一個(gè)左移16次,形成一個(gè)字左拉***/

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

void zoula()

{

uchar x;

while(word<256)

{

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

zou3();

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

zou3();

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

}

}

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

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

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

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

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

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

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

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

void yipai3()

{

uchar temp,yi;

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

{

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

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

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

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

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

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

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

}

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

{

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

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

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

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

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

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

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

}

}

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

/*******將一個(gè)字移一位***********/

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

void you3()

{

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

{

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

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

LINE=line;//打開(kāi)行線,即174HC154行線端

CLKR=1;//在74HC595處鎖存起來(lái)

CLKR=0;

CLKR=1;

}

}



評(píng)論


相關(guān)推薦

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

關(guān)閉