最近在研究點(diǎn)陣,這東西看起來簡(jiǎn)單,但是要完全掌握它,可是要花一定時(shí)間的!我現(xiàn)在做得8*8點(diǎn)陣硬件電路是這樣的,行采用74HC138+三極管8550驅(qū)動(dòng),列采用74HC595驅(qū)動(dòng),這種電路是非常用的,其次的掃描原理就是,先打開第一行,然后送代碼給列,即595端,像這樣掃描8次行,一個(gè)字就完成了,具體原理圖如下圖:
下面我將我寫得代碼下載地址分享下:http://www.torrancerestoration.com/f/sxzy.rar
一、上移:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define LINE P1//定義行線IO口,即74HC154控制端
#define shudu 50//字移動(dòng)的速度
sbit DATA=P3^5;//74HC595數(shù)據(jù)端
sbit CLK=P3^7;//74HC595移位脈沖端
sbit CLKR=P3^6;//74HC595數(shù)據(jù)鎖存端
uint word;//字節(jié)變量
uchar line;//字節(jié)變量
uchar code table[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x3C,0x00,0x18,0x00,0x7E,0x00,0x00,
0x08,0x08,0x7F,0x49,0x7F,0x08,0x08,0x08,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};//字模數(shù)組
void delay(uchar z)
{
uchar x,y;
for(x=8;x>0;x--)
for(y=z;y>0;y--);
}
/********************************/
/**74HC595移位寄存器送數(shù)子函數(shù)***/
/********************************/
void song(uchar z)//帶參數(shù)函數(shù)
{
uchar num,hang;//定義變量
hang=z;//將形參給變量
for(num=0;num<8;num++)//移動(dòng)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ù)移走一位
}
}
/********************************/
/*將一行數(shù)據(jù)轉(zhuǎn)換出來,然后顯示*/
/********************************/
void xian()
{
uchar i,f;
for(i=0;i<shudu;i++)//一字移動(dòng)的速度
{
word=f;//將字暫存器給計(jì)數(shù)器
for(line=0;line<8;line++)//掃描8次,即完成一個(gè)字的移動(dòng)
{
song(~table[word]);
CLKR=1;//在74HC595處鎖存起來
CLKR=0;
CLKR=1;
word++;//將計(jì)數(shù)器加1
LINE=line;//打開行線,即74HC138行線端
P3=0xff;
delay(20);
}
}
f+=2;//顯示完一個(gè)字后加2形成上移
if(word>=32)
{
word=0;//清0重新開始
f=0;
}
}
/********************************/
/************主程序*************/
/********************************/
void main()
{
while(1)
{
xian();
}
}
二、下移
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define LINE P1//定義行線IO口,即74HC154控制端
#define shudu 50//字移動(dòng)的速度
sbit DATA=P3^5;//74HC595數(shù)據(jù)端
sbit CLK=P3^7;//74HC595移位脈沖端
sbit CLKR=P3^6;//74HC595數(shù)據(jù)鎖存端
uchar f=24;//給一個(gè)初值以便下移
uchar code table[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x08,0x08,0x7F,0x49,0x7F,0x08,0x08,0x08,//將字碼調(diào)換
0x00,0x3C,0x00,0x18,0x00,0x7E,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};//字模數(shù)組
void delay(uchar z)
{
uchar x,y;
for(x=8;x>0;x--)
for(y=z;y>0;y--);
}
/********************************/
/**74HC595移位寄存器送數(shù)子函數(shù)***/
/********************************/
void song(uchar z)//帶參數(shù)函數(shù)
{
uchar num,hang;//定義變量
hang=z;//將形參給變量
for(num=0;num<8;num++)//移動(dòng)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ù)移走一位
}
}
/********************************/
/*將一行數(shù)據(jù)轉(zhuǎn)換出來,然后顯示*/
/********************************/
void xian()
{
uint word;//字節(jié)變量
uchar line,i;//字節(jié)變量
for(i=0;i<shudu;i++)//一字移動(dòng)的速度
{
word=f;//將字暫存器給計(jì)數(shù)器
for(line=0;line<8;line++)//掃描8次,即完成一個(gè)字的移動(dòng)
{
song(~table[word]);
CLKR=1;//在74HC595處鎖存起來
CLKR=0;
CLKR=1;
word++;//將計(jì)數(shù)器加1
LINE=line;//打開行線,即74HC138行線端
//P3=0xff;
delay(10);
}
}
f--;//顯示完一個(gè)字后減1形成下移
if(f==0)
{
f=24;//移完后給值
}
}
/********************************/
/************主程序*************/
/********************************/
void main()
{
while(1)
{
xian();
}
}
三、左移
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define LINE P1//定義行線IO口,即74HC154控制端
#define shudu 120//字移動(dòng)的速度
sbit DATA=P3^5;//74HC595數(shù)據(jù)端
sbit CLK=P3^7;//74HC595移位脈沖端
sbit CLKR=P3^6;//74HC595數(shù)據(jù)鎖存端
uchar move;//移動(dòng)幾位變量
uchar line;//行變量
uint word;//字節(jié)變量
uchar BUF[2];//2組緩存數(shù)組以便動(dòng)態(tài)更改數(shù)據(jù)
uchar code table[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x3C,0x00,0x18,0x00,0x7E,0x00,0x00,
0x08,0x08,0x7F,0x49,0x7F,0x08,0x08,0x08,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};//字模數(shù)組
/********************************/
/**74HC595移位寄存器送數(shù)子函數(shù)***/
/********************************/
void song(uchar z)//帶參數(shù)函數(shù)
{
uchar num,hang;//定義變量
hang=z;//將形參給變量
for(num=0;num<8;num++)//移動(dòng)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ù)移走一位
}
}
/********************************/
/*裝一線數(shù)據(jù)子函數(shù)(即一行數(shù)據(jù))*/
/********************************/
void yixian()
{
BUF[0]=table[word+line];//第1個(gè)字代碼裝入緩存數(shù)組0,line表示行數(shù),word表示字?jǐn)?shù)
BUF[1]=table[word+8+line];//第2個(gè)字代碼裝入緩存數(shù)組1
}
/********************************/
/*將一行數(shù)據(jù)轉(zhuǎn)換出來,然后顯示*/
/********************************/
void yipai()
{
uchar temp,yi;//定義兩個(gè)變量
yi=move;//將要移多少位給變量yi
temp=(BUF[0]<<yi)|(BUF[1]>>(8-yi));/*將第1個(gè)字即數(shù)組0左移yi(yi只是代號(hào),比如1位)位
,然后將第下一個(gè)字即數(shù)組1右移8-yi位,然后或一下,這樣就會(huì)得到要發(fā)送的數(shù)*/
song(~temp);//發(fā)送給74HC595
}
void xian()
{
uchar i;
while(word<24)//需要顯示3個(gè)字,公式=8*N個(gè)字,比如四個(gè)字就是4*8=32
{
for(move=0;move<8;move++)//要移多少位?
{
for(i=0;i<shudu;i++)//一字移動(dòng)的速度
{
for(line=0;line<8;line++)//掃描8次,即完成一個(gè)字的移動(dòng)
{
yixian();//調(diào)用一線子程序
yipai();//調(diào)用數(shù)據(jù)轉(zhuǎn)換子程序
LINE=line;//打開行線,即74HC138行線端
CLKR=1;//在74HC595處鎖存起來
CLKR=0;
CLKR=1;
}
}
}
word=word+8;//一個(gè)字顯示完了,就顯示下一個(gè)字
}
word=0;//清0重新開始
}
/********************************/
/************主程序*************/
/********************************/
void main()
{
while(1)
{
xian();
}
}
四、右移
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define LINE P1//定義行線IO口,即74HC154控制端
#define shudu 120//字移動(dòng)的速度
sbit DATA=P3^5;//74HC595數(shù)據(jù)端
sbit CLK=P3^7;//74HC595移位脈沖端
sbit CLKR=P3^6;//74HC595數(shù)據(jù)鎖存端
uchar move;//移動(dòng)幾位變量
uchar line;//行變量
uint word;//字節(jié)變量
uchar BUF[2];//2組緩存數(shù)組以便動(dòng)態(tài)更改數(shù)據(jù)
uchar code table[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x3C,0x00,0x18,0x00,0x7E,0x00,0x00,
0x08,0x08,0x7F,0x49,0x7F,0x08,0x08,0x08,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};//字模數(shù)組
/********************************/
/**74HC595移位寄存器送數(shù)子函數(shù)***/
/********************************/
void song(uchar z)//帶參數(shù)函數(shù)
{
uchar num,hang;//定義變量
hang=z;//將形參給變量
for(num=0;num<8;num++)//移動(dòng)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ù)移走一位
}
}
/********************************/
/*裝一線數(shù)據(jù)子函數(shù)(即一行數(shù)據(jù))*/
/********************************/
void yixian()
{
BUF[0]=table[word+line];//第1個(gè)字代碼裝入緩存數(shù)組0,line表示行數(shù),word表示字?jǐn)?shù)
BUF[1]=table[word+8+line];//第2個(gè)字代碼裝入緩存數(shù)組1
}
/********************************/
/*將一行數(shù)據(jù)轉(zhuǎn)換出來,然后顯示*/
/********************************/
void yipai()
{
uchar temp,yi;//定義兩個(gè)變量
yi=move;//將要移多少位給變量yi
temp=(BUF[1]<<(8-yi))|(BUF[0]>>yi);/*將第1個(gè)字即數(shù)組0左移yi(yi只是代號(hào),比如1位)位
,然后將第下一個(gè)字即數(shù)組1右移8-yi位,然后或一下,這樣就會(huì)得到要發(fā)送的數(shù)*/
song(~temp);//發(fā)送給74HC595
}
void xian()
{
uchar i;
while(word<24)//需要顯示3個(gè)字,公式=8*N個(gè)字,比如四個(gè)字就是4*8=32
{
for(move=0;move<8;move++)//要移多少位?
{
for(i=0;i<shudu;i++)//一字移動(dòng)的速度
{
for(line=0;line<8;line++)//掃描8次,即完成一個(gè)字的移動(dòng)
{
yixian();//調(diào)用一線子程序
yipai();//調(diào)用數(shù)據(jù)轉(zhuǎn)換子程序
LINE=line;//打開行線,即74HC138行線端
CLKR=1;//在74HC595處鎖存起來
CLKR=0;
CLKR=1;
}
}
}
word=word+8;//一個(gè)字顯示完了,就顯示下一個(gè)字
}
word=0;//清0重新開始
}
/********************************/
/************主程序*************/
/********************************/
void main()
{
while(1)
{
xian();
}
}