此程序可以實現如下功能:間斷.上移.下移.上拉.下拉等! 硬件說明:行部分采用驛碼器74LS154+PNP三極管驅動,74LS154L輸入部分接P0口的低四位,即P0.0——3 4個端口,列部分采用74HC595移位鎖存器驅動+30R限流電阻,列輸出口接P1.4腳,移位時鐘接P1.5腳,鎖存時鐘接P1.5腳! #include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar hang,lei,cen,num,shu1,shu2,shu3,shu4,shu5,shu6,shu7,shu8;
sbit sdata=P1^4; //輸出定義
sbit clk=P1^5;//移位時鐘定義
sbit sclk=P1^6;//鎖存定義
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,0x08,0x01,0xFC,0x7D,0x08,0x05,0x08,0x45,0xF8,0x29,0x08,0x29,0x08,0x11,0xF8,
0x11,0x44,0x29,0x4C,0x29,0x30,0x45,0x20,0x85,0x10,0x01,0x4E,0x01,0x84,0x01,0x00,
0x08,0x20,0x08,0x28,0x7F,0xFC,0x08,0x20,0x09,0x20,0x01,0x04,0xFF,0xFE,0x01,0x00,
0x01,0x10,0x1F,0xF8,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x1F,0xF0,0x10,0x10,
0x04,0x00,0x25,0xF8,0x25,0x08,0x24,0x90,0x24,0x90,0x24,0x60,0x24,0x20,0x24,0xD0,
0x27,0x0E,0x05,0x04,0x01,0x10,0x3F,0xF8,0x01,0x00,0x01,0x04,0xFF,0xFE,0x00,0x00,
0x08,0x04,0xFD,0xFE,0x09,0x04,0x09,0x04,0x09,0xFC,0x79,0x24,0x48,0x20,0x43,0xFE,
0x42,0x22,0x7A,0x22,0x0B,0xFE,0x0A,0x22,0x08,0x20,0x88,0x24,0x53,0xFE,0x20,0x02,
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
}; //數組一
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,0x04,0xFD,0xFE,0x09,0x04,0x09,0x04,0x09,0xFC,0x79,0x24,0x48,0x20,0x43,0xFE,
0x42,0x22,0x7A,0x22,0x0B,0xFE,0x0A,0x22,0x08,0x20,0x88,0x24,0x53,0xFE,0x20,0x02,
0x04,0x00,0x25,0xF8,0x25,0x08,0x24,0x90,0x24,0x90,0x24,0x60,0x24,0x20,0x24,0xD0,
0x27,0x0E,0x05,0x04,0x01,0x10,0x3F,0xF8,0x01,0x00,0x01,0x04,0xFF,0xFE,0x00,0x00,
0x08,0x20,0x08,0x28,0x7F,0xFC,0x08,0x20,0x09,0x20,0x01,0x04,0xFF,0xFE,0x01,0x00,
0x01,0x10,0x1F,0xF8,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x1F,0xF0,0x10,0x10,
0x00,0x08,0x01,0xFC,0x7D,0x08,0x05,0x08,0x45,0xF8,0x29,0x08,0x29,0x08,0x11,0xF8,
0x11,0x44,0x29,0x4C,0x29,0x30,0x45,0x20,0x85,0x10,0x01,0x4E,0x01,0x84,0x01,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
};//數組二
/**********延時子函數*********/
void delay(uchar z)
{
uchar x,y;//變量定義
for(x=8;x>0;x--)//內循環
for(y=z;y>0;y--);//外循環
}
/**********移位送數子函數*********/
void yi()
{
uchar shu;//局部變量定義
for(shu=8;shu>0;shu--)//循環8次,將數移出
{
if(hang&0x01==1)//與01與一下,以判斷移出的結果
sdata=1; //輸出為1
else//如果hang與完后不為1,就執行下一句
sdata=0;//輸出為0
clk=1;//上升沿
clk=0; //下降
clk=1;//上升
hang>>=1;//將hang這個右移一位
}
} /**********顯示子函數*********/
void xian()
{
lei=0; //將列清0
num=cen;//將暫存數給num
for(shu2=16;shu2>0;shu2--) //循環16次,以得到一個整體的字
{
hang=~table[num];//掃左半屏
yi();//送數
num++; //計數器加1
hang=~table[num];//掃右半屏
yi(); //送數
num++;//計數器加1
sclk=1; //鎖存起來
sclk=0;//下降沿
sclk=1; //上升沿
P0=lei; //將列數給P0口
lei++; //加1后可以緊接著掃下一行
delay(15);//延時一下
}
}
/**********顯示子函數1*********/
//以下子程序和上面完全一樣,不同的是表不同而已
void xian1()
{
lei=0;
num=cen;
for(shu2=16;shu2>0;shu2--)
{
hang=~table1[num];
yi();
num++;
hang=~table1[num];//使用得是TABLE1表
yi();
num++;
sclk=1;
sclk=0;
sclk=1;
P0=lei;
lei++;
delay(15);
}
}
/**********間斷顯示子函數*********/
void jian()
{
num=0;//計數器清0
cen=0;//暫存器清0
for(shu3=6;shu3>0;shu3--)//循環6次,即要顯示6個字
{
for(shu1=40;shu1>0;shu1--)//一個字間隔的時間
xian(); //調用顯示子程序
cen=num;//將數給暫存器存起來,以便記住num的數是多少
}
num=0;//計數器清0
cen=0;//暫存器清0
}
/**********上移子函數*********/
void shangyi()
{
num=0;//計數器清0
cen=0;//暫存器清0
for(shu3=60;shu3>0;shu3--)// //循環60次
{
for(shu1=5;shu1>0;shu1--)// 一個字間隔的時間
xian();//調用顯示子程序
cen=cen+2;//將暫存器數加2,形成上移
}
num=0;
cen=0;
}
/**********下移子函數*********/
void xiayi()
{
num=0;
cen=160;//先給數暫存
for(shu3=80;shu3>0;shu3--) //循環次數
{
for(shu1=5;shu1>0;shu1--)// 一個字間隔的時間
xian1(); //調用顯示子程序
cen=cen-2;//將暫存器數減2,形成下移
}
num=0;//清0
cen=160; //重新賦值
}
/**********上拉幕子函數*********/
void shangla()
{
num=0;//清0
cen=0;//清0
for(shu3=6;shu3>0;shu3--)//6個字循環6次
{
for(shu7=16;shu7>0;shu7--)//一個字掃描需要16次
{
for(shu1=1;shu1>0;shu1--)//一個字間隔時間
xian(); //調用顯示
cen=cen+2;//加2,形成上移
}
for(shu7=80;shu7>0;shu7--) //一個字顯示完了,停下來,即形成拉幕,此句是重點
xian();//調用顯示子程序
}
num=0;//清0
cen=0;//清0
}
/**********下拉幕子函數*********/
void xiala()
{
num=0;
cen=160;
for(shu3=5;shu3>0;shu3--)
{
for(shu6=16;shu6>0;shu6--)
{
for(shu1=1;shu1>0;shu1--)
xian1();
cen=cen-2;
}
for(shu7=80;shu7>0;shu7--)
xian1();
}
num=0;
cen=160;
}
/**********主函數*********/
void main()
{
while(1)
{
for(shu8=2;shu8>0;shu8--)//兩次
jian(); //調用間斷顯示子程序
for(shu8=2;shu8>0;shu8--)
shangyi(); //調用上移顯示子程序
for(shu8=2;shu8>0;shu8--)
xiayi(); //調用下移顯示子程序
for(shu8=2;shu8>0;shu8--)
shangla(); //調用上拉顯示子程序
for(shu8=2;shu8>0;shu8--)
xiala(); //調用下拉顯示子程序
}
}
|