一、硬件簡介: 經(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)用右覆蓋子程序
}
}