|
制作出來的實(shí)物圖如下:
單片機(jī)源程序如下:
完整版請(qǐng)看附件接收端
#include<reg52.h>
#include"24L01.h"
#include"ziku.h"
#include"24c64.h"
extern uchar TxBuf[5];
extern uchar RxBuf[TX_PLOAD_WIDTH];
extern uchar sta;
extern uchar MAX_RT;//重發(fā)次數(shù)溢出中斷,寫1清除中斷,如果MAX_RT產(chǎn)生中斷,必須清楚后系統(tǒng)才能進(jìn)行通
extern uchar RX_DR;//接收數(shù)據(jù)中斷,當(dāng)收到有效數(shù)據(jù)后置1,寫1清除中斷
extern uchar TX_DS;//數(shù)據(jù)發(fā)送完成中斷,寫1清除中斷
uchar a;
uchar xdata xiancun1[96];
uchar xdata xiancun2[96];
uint num2;
uchar b; //接收中斷標(biāo)志(中斷1)
uchar stop=1; //表示移動(dòng)或者暫停移動(dòng)標(biāo)志位
uchar wide=4; //字體寬度標(biāo)志
uchar speed=2; //字體移動(dòng)速度
uchar up=50; //動(dòng)態(tài)掃描上限
uchar down=0; //動(dòng)態(tài)掃描下限
void yanshi(uint x)
{
uint i,j;
for(i=x;i>0;i--)
for(j=3;j>0;j--);
}
void main()
{
uchar i,j=0,k=0,num=6;
uchar cycle; //所轉(zhuǎn)的圈數(shù)標(biāo)志
uchar c; //接收到的命令類型標(biāo)志
uchar d=0; //不滾動(dòng)顯示時(shí),開始顯示漢字的位置
init_24L01(); //24L01init
AT24C64_init();
EA=1;
EX0=0;
EX1=1;
IT0=1;
IT1=1;
P0=0xff;
P1=0xff;
/* for(i=0;i<32;i++)
{
RxBuf=0xaa;
}
for(i=0;i<255;i++)
{
page_write(i*32,RxBuf);
delayms(5);
P0=~P0;
}
P0=0xff; */
for(i=0;i<32;i++)
{
RxBuf=dian;
}
for(i=0;i<5;i++)
{
TxBuf=0x55;
}
// RX_Mode();
TX_Mode(TxBuf);
Check_ACK(1);
delayms(1);
// sta = SPI_Read(STATUS); // 讀狀態(tài)寄存器
// SPI_RW_Reg(WRITE_REG + STATUS, sta|0x70); //清空狀態(tài)寄存器
for(i=0;i<6;i++)
{
sequential_read(32*i,16,xiancun1+16*i);
sequential_read(32*i+16,16,xiancun2+16*i);
}
while(1)
{
RX_Mode();
if(b)
{
EX0=0;
SPI_Read_Buf(RD_RX_PLOAD, RxBuf, TX_PLOAD_WIDTH);
if(RxBuf[0]==0xaa&&RxBuf[1]==0x55) //如果收到的是0xaa,0x55,表示收到的是命令,
{
EA=0;
c=RxBuf[2];
switch(c)
{
case 1: //清除顯示內(nèi)容
for(i=0;i<32;i++)
RxBuf=0;
for(i=0;i<255;i++)
{
page_write(i*32,RxBuf);
delayms(5);
P0=~P0;
}
break;
case 2:stop=!stop;break;
case 3: //字體寬度增加
wide++;
if(wide==10)wide=4;
break;
case 4: //字體寬度減小
wide--;
if(wide==0)wide=4;
break;
case 5: //字體移動(dòng)速度增加
speed--;
if(speed==-1)speed=2;
break; //字體移動(dòng)速度變慢
case 6:
speed++;
if(speed==10)speed=2;
break;
case 7: //不滾動(dòng)顯示時(shí)顯示開始位置確定
d+=6;
if(d>250)d=0;
num=d+7;
for(i=0;i<6;i++)
{
sequential_read(32*(i+d),16,xiancun1+16*i);
sequential_read(32*(i+d)+16,16,xiancun2+16*i);
}
break;
case 8: //不滾動(dòng)顯示時(shí)顯示開始位置確定
d-=6;
if(d<0)d=250;
num=d+7;
for(i=0;i<6;i++)
{
sequential_read(32*(i+d),16,xiancun1+16*i);
sequential_read(32*(i+d)+16,16,xiancun2+16*i);
}
break;
case 9: //接收到的數(shù)據(jù)在24C64中存儲(chǔ)的開始位置
num2=RxBuf[3];
break;
case 10: //動(dòng)態(tài)掃描范圍上限
up=RxBuf[3];
break;
case 11: //動(dòng)態(tài)掃描范圍下限
down=RxBuf[3];
break;
}
EA=1;
} //如果收到的不是命令,則表示收到的是數(shù)據(jù)
else
{ //則存入24c64
page_write(num2,RxBuf);
num2+=32;
TxBuf[0]=num2/32;
TxBuf[1]=num2/32;
TxBuf[2]=0x55; //發(fā)送0x55表示接收到了,并通知主機(jī)要求發(fā)下一幀數(shù)據(jù)
SPI_RW_Reg(WRITE_REG + STATUS, sta|0x70);
TX_Mode(TxBuf);
Check_ACK(1);
}
}
EX0=1;
a=1;
if(b)a=0;
b=0;
while(a);
for(i=0;i<96;i++)
{
P0=~xiancun1;
P1=~xiancun2;
yanshi(wide);
}
P0=0xff;
P1=0xff;
cycle++;
if(cycle>=speed&&stop)
{
cycle=0;
for(i=0;i<95;i++)
{
xiancun1=xiancun1[i+1];
xiancun2=xiancun2[i+1];
}
xiancun1[95]=read_add(32*num+k); //更新第六個(gè)漢字的第16列
xiancun2[95]=read_add(32*num+k+16);
k++;
if(k==16)
{
k=0;
num++;
if(num>=up)
num=down;
}
}
}
}
void int0() interrupt 0
{
a=0;
EX0=0;
}
void int1() interrupt 2
{
sta = SPI_Read(STATUS); // 讀狀態(tài)寄存器
RX_DR=sta>>6&0x01;
if(RX_DR)
{
EX0=0;
a=0; //防止接收到信號(hào)中斷后,a=1;使程序停止
b=1; //表示接收到數(shù)據(jù)
}
SPI_RW_Reg(WRITE_REG + STATUS, sta|0x70);
}
|
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
電機(jī)驅(qū)動(dòng).rar
2019-8-7 21:09 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
461.54 KB, 下載次數(shù): 12, 下載積分: 黑幣 -5
-
-
無線發(fā)射.rar
2019-8-7 21:10 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
897.79 KB, 下載次數(shù): 27, 下載積分: 黑幣 -5
-
-
發(fā)送最終結(jié)果.rar
2019-8-7 21:10 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
67.83 KB, 下載次數(shù): 17, 下載積分: 黑幣 -5
-
-
接收顯示最終.rar
2019-8-7 21:10 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
58.06 KB, 下載次數(shù): 16, 下載積分: 黑幣 -5
|