本帖最后由 Q_p 于 2017-3-10 20:22 編輯
#include<reg52.h>
sbit T_STR = P2^6; //鎖存引腳,屏上標識位STR
sbit R1 = P0^4; //數據引腳,屏上標識R1
sbit G1 = P2^4; //數據引腳,屏上標識G1
sbit T_CLK = P2^5; //時鐘引腳,屏上標識位CLK
sbit OE = P2^7; //使能引腳,屏上標識EN/OE
unsigned char MoveBitNum,MoveBitNumtemp,IncNum;//移動位數,臨時移動位數,大于一個字節增加字節數
unsigned int HzNum;//漢字個數
unsigned char buff[10];
/*-----------------------------------------------
16x16漢字取模數據
------------------------------------------------*/
unsigned char code hztest[][32]= //取模選擇字節倒序 ,正序得出的字是反的,可以在軟件中設置自動倒敘
{
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, //前面一屏大小的空字符,不顯示,這里根據屏的大小修改,這個是1個漢字屏
//所以寫入1個漢字
0x80,0x00,0x84,0x00,0x88,0x3F,0x48,0x00,0xA1,0x1F,0x82,0x10,0x92,0x12,0x90,0x14,
0xE8,0x7F,0x88,0x10,0x47,0x12,0x44,0x14,0xC4,0x3F,0x04,0x10,0x04,0x0A,0x00,0x04,
0x80,0x00,0x80,0x00,0xFF,0x7F,0x80,0x00,0x80,0x00,0xFE,0x3F,0x12,0x24,0x22,0x22,
0xF2,0x27,0x82,0x20,0x82,0x20,0xFA,0x2F,0x82,0x20,0x82,0x20,0x82,0x28,0x02,0x10,
0x10,0x00,0xD0,0x7F,0x12,0x04,0x12,0x04,0x12,0x04,0x92,0x3F,0x92,0x24,0x92,0x24,
0x92,0x24,0x92,0x24,0x92,0x24,0x90,0x2C,0x88,0x14,0x08,0x04,0x04,0x04,0x02,0x04,
0x20,0x02,0x20,0x02,0xFF,0x7F,0x20,0x02,0x08,0x00,0x90,0x1F,0x92,0x10,0x84,0x10,
0xA4,0x10,0xA0,0x14,0x90,0x08,0x8E,0x40,0x88,0x40,0x88,0x40,0x08,0x7F,0x00,0x00,
0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xFF,0x7F,0x80,0x00,0x80,0x00,
0x40,0x01,0x40,0x01,0x20,0x02,0x20,0x02,0x10,0x04,0x08,0x08,0x04,0x10,0x03,0x60,
0x44,0x10,0x88,0x10,0x88,0x08,0x00,0x04,0xFE,0x7F,0x02,0x40,0x01,0x20,0xF8,0x07,
0x00,0x02,0x80,0x01,0xFF,0x7F,0x80,0x00,0x80,0x00,0x80,0x00,0xA0,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,
};
/*-----------------------------------------------
向595寫入一個字節 單紅色
------------------------------------------------*/
void InputByte( unsigned char DataR1) //寫一個字節
{
unsigned char i;
for(i=8; i>0; i--)
{
R1 = !(DataR1&0x01);
T_CLK = 0;
T_CLK = 1;
DataR1 = DataR1 >> 1;
}
}
/*-----------------------------------------------
向595寫入兩個字節 雙色
------------------------------------------------*/
void Input2Byte( unsigned char DataR1,unsigned char DataG1) //寫一個字節
{
unsigned char i;
for(i=8; i>0; i--)
{
R1 = !(DataR1&0x01);
G1 = !(DataG1&0x01);
T_CLK = 0;
T_CLK = 1;
DataR1 = DataR1 >> 1;
DataG1 = DataG1 >> 1;
}
}
/*-----------------------------------------------
延時程序
------------------------------------------------*/
void Delay(unsigned int t)
{
while(--t);
}
/*-----------------------------------------------
主程序
------------------------------------------------*/
main()
{
unsigned char count;//16行掃描數據,范圍0-15
unsigned int i, j;
unsigned char temp;
while(1)
{
i++;
if(i==100)//更改流動速度,1T單片機和12T單片機速度大約5-8倍,注意更改參數
{
i=0;
MoveBitNum++;
if(MoveBitNum==16)//每次移動完一個漢字大小后循環
{
MoveBitNum=0;
HzNum+=1; //調用下一個漢字
if(HzNum>=50)//需要顯示的漢字個數,包括前面的一屏空字符的個數,后面清屏的空字符不包含在內,這里是(漢字個數+1)
HzNum=0; //完全顯示完后循環調用
}
}
Delay(1);//控制掃描頻率
for(j=0;j<2;j++) //取每個漢字的前2個字節,
{ //漢字個數+1
buff[j+j]=hztest[HzNum+j][count+count]; //每次移動完一個漢字后,選擇下一個漢字
buff[j+j+1]=hztest[HzNum+j][count+count+1];
}
if(MoveBitNum<8) // 判讀移動距離是大于一個字節還是小于一個字節,因為一個字節左移右移最大只能8位
{ IncNum=0; MoveBitNumtemp=MoveBitNum; }
else
{ IncNum=1; MoveBitNumtemp=MoveBitNum-8;}//大于8就減去8得到的數值還是小于8
T_STR=0; //鎖存無效
for(j=0;j<2;j++) //按bit的方式移動緩沖區的內容,然后輸出到595,即取出的數值每個字節左移一定的位數,
{ //后面左移出的數據整合到前面的字節中,保持數據的連續性
temp=(buff[j+IncNum]>>MoveBitNumtemp)|(buff[j+1+IncNum]<<(8-MoveBitNumtemp));//這句比較重要,需要自行拿出2個字節的數據模擬分析
InputByte(temp);//輸出到595
}//8個字節傳輸完鎖存輸出
OE = 1;
P0=15-count;//用P0口的前4位控制16行,屏內部通過4-16譯碼器工作,循環掃描16行
T_STR=1; //鎖存有效,此時一行的數據顯示到屏上
OE = 0;
count++;
if(count==16)
count=0;
}
}
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
sbit shcp=P2^0; // 移位寄存時鐘 1有效
sbit ds=P2^1; // 輸入
sbit stcp=P2^2; // 輸出時鐘 1有效
sbit k1=P3^2;
sbit k2=P3^3;
uchar n=100;
//彩燈循環
uchar data_s[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 逆時針流水燈
0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00, // 閃爍
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01, // 順時針流水燈
0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00};
uchar data_s1[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,
0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,
0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00};
void delay(int x)
{
unsigned a,b;
for(a=x;a>0;a--)
for(b=250;b>0;b--) ;
}
void send(uchar aa) // 74hc595控制
{
uchar c;
for(c=0;c<8;c++) // 掃描每一個字節 0x01為1個 在內部左移
{
ds=aa>>7;
aa<<=1;
shcp=0; // 高電平有效 先賦0 再取1
shcp=1;
}
stcp=0; // 高電平有效 先賦0 再取1
stcp=1;
}
void main()
{ uchar z;
EA=1;
EX0=1;EX1=1;
IT0=1;IT1=1;
while(1)
{ for(z=0;z<48;z++){
send(data_s[z]);
send(data_s1[z]);
delay(n);
}}
}
void dis_1() interrupt 0
{
if(n<240&&k1==0)
n=n+20;
}
void dis_2() interrupt 2
{
if(n>0&&k2==0)
n=n-10;
} |