📄 simboard.c
字号:
#include "52init.h"
#include "iic.h"
#include "Lcd.h"
//#include "inittable.h"
sfr P4 = 0xE8;
unsigned int idata ii;
sbit Rst4221=P1^3;
sbit LampEn =P1^6;
sbit BootSyn=P3^2;
sbit BootClk=P3^4;
sbit BootTx =P3^5;
sbit BootRx =P1^7;
sbit SpiSyn=P3^3;
sbit SpiClk=P4^3;
sbit SpiTx =P2^7;
sbit SpiRx =P2^6;
uchar idata EepromDat;
uchar idata systimer=100;
uint idata LcdBlink=600;
uchar idata SendNum=64;
uchar xdata RecBuf[0xc0];
uchar xdata SecBootTab[64];
uint idata CopyNum;
uint idata BlockStart;
uint idata BlockEnd;
uchar LoopTime=20;
uchar StartDisLine=0;
uint xdata RecBufDis[64];
uchar xdata SendDatBuf[128];
bit bSerialCMD=0;
uchar xdata ch=0;
uchar xdata CmdStart=0;
uchar xdata bufreceive[5];
uchar xdata dskey[4];
uchar xdata StartLoad=0;
uchar xdata LoadComBuf[64];
uchar xdata CommRecNum=0;
uchar xdata OneBlockEnd=0;
uint xdata filelenth=0;
uint xdata BlockCnt=0;
void tdelay(uchar delay_num) //22.1184 the loop time is 0.543us
{
uchar i,k; //delay_num 0.1ms/num
for(i=delay_num;i>0;i--)
{
for(k=100;k>0;k--)
{;}
}
}
void timer_int(void) interrupt 1
{
TH0=0xb8; //m=65536-22.1184*10^6*time/12;time=10ms;m=b800;
TL0=0x00;
if(systimer>0)
{
systimer--;
}
if(LcdBlink>0)
{
LcdBlink--;
}
if(LoopTime>0)
{
LoopTime--;
}
}
void serial(void) interrupt 4
{
uchar error;
if(RI==1)
{
RI=0;
if(StartLoad==0)
{
if(SBUF==0xbb)
{
ch=0;
CmdStart=1;
}
else
{
if(CmdStart==1)
{
ch++;
if(ch<=3)
{
dskey[ch]=SBUF;
}
if(ch==3)
{
CmdStart=0;
error=dskey[1]^dskey[2];
if(error==dskey[3])
{
filelenth=dskey[1];
filelenth<<=8;
filelenth+=dskey[2];
StartLoad=1;
TI=0;
SBUF=0xbb;
}
else
{
TI=0;
SBUF=0xfe; /*error*/
}
}
}
}
}
else
{
if(CommRecNum<64)
{
SecBootTab[CommRecNum]=SBUF;
CommRecNum++;
}
if(CommRecNum==64)
{
CommRecNum=0;
OneBlockEnd=1;
}
}
}
else
{
TI=0;
if(SendNum<63)
{
SendNum++;
SBUF=RecBuf[SendNum];
}
}
}
void Rst4221D(void)
{
Rst4221=0;
tdelay(5);
Rst4221=1;
}
/*******************************/
/*SPI程序发送接收程序*/
/*******************************/
void SpiBusWr(uint WrData)
{
uchar i;
uint Spitemp;
SpiSyn=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
Spitemp=WrData;
for(i=0;i<16;i++)
{
Spitemp&=0x8000;
if(Spitemp==0x8000)
{
SpiTx=1;
SpiClk=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SpiClk=1;
WrData<<=1;
}
else
{
SpiTx=0;
SpiClk=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SpiClk=1;
WrData<<=1;
}
Spitemp=WrData;
}
SpiSyn=1;
}
unsigned long int SpiBusRd(void)
{
uchar i;
unsigned long int Spitemp;
bit Rdbit;
SpiSyn=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
Spitemp=0xffffffff;
for(i=0;i<32;i++)
{
SpiClk=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SpiClk=1;
SpiRx=1;
Rdbit=SpiRx;
Spitemp<<=1;
if(Rdbit==1)
{Spitemp|=0x00000001;}
else
{Spitemp&=0xfffffffe;}
}
SpiSyn=1;
return(Spitemp);
}
/*******************************/
uchar sRd1Byte(void)
{
uchar i,RdDatTemp;
bit Rdbit;
RdDatTemp=0x00;
for(i=0;i<8;i++)
{
BootRx=1;
BootClk=0;
BootClk=1;
Rdbit=BootRx;
RdDatTemp<<=1;
if(Rdbit==1)
{RdDatTemp|=0x01;}
else
{RdDatTemp&=0xfe;}
}
return(RdDatTemp);
}
void sWr1Byte(uchar WrDatP)
{
uchar WrDatPTmp,i;
WrDatPTmp=WrDatP;
for(i=0;i<8;i++)
{
WrDatPTmp&=0x80;
if(WrDatPTmp==0x80)
{
BootTx=1;
}
else
{
BootTx=0;
}
BootClk=0;
BootClk=1;
WrDatP<<=1;
WrDatPTmp=WrDatP;
}
}
void EepromWrEn(void)
{
BootSyn=1;
BootSyn=0;
sWr1Byte(0x06);
BootSyn=1;
}
void EepromWrDi(void)
{
BootSyn=1;
BootSyn=0;
sWr1Byte(0x04);
BootSyn=1;
}
uchar EepromRdReg(void)
{
uchar RdTemp;
BootSyn=1;
BootSyn=0;
sWr1Byte(0x05);
RdTemp=sRd1Byte();
BootSyn=1;
return(RdTemp);
}
void EepromWrReg(uchar RegP)
{
BootSyn=1;
BootSyn=0;
sWr1Byte(0x01);
sWr1Byte(RegP);
BootSyn=1;
}
void ChkWIP(void)
{
uchar BusyTemp;
BusyTemp=EepromRdReg();
while(BusyTemp==0x01)
{
BusyTemp=(BusyTemp&0x01);
}
}
void EepromWr(uint WrAddr)
{
uint Tmp;
uchar WrDatTmp;
uint i;
EepromWrEn();
BootSyn=1;
BootSyn=0;
sWr1Byte(0x02);
Tmp=WrAddr;
WrDatTmp=(Tmp>>8);
sWr1Byte(WrDatTmp);
Tmp=WrAddr;
WrDatTmp=(Tmp&0x00ff);
sWr1Byte(WrDatTmp);
for(i=0;i<64;i++)
{
WrDatTmp=SecBootTab[i];
sWr1Byte(WrDatTmp);
}
BootSyn=1;
ChkWIP();
}
uchar EepromRd(uint RdAddr)
{
uint Tmp;
uchar WrDatTmp;
uchar RdDatTmp;
BootSyn=1;
BootSyn=0;
sWr1Byte(0x03);
Tmp=RdAddr;
WrDatTmp=(Tmp>>8);
sWr1Byte(WrDatTmp);
Tmp=RdAddr;
WrDatTmp=(Tmp&0x00ff);
sWr1Byte(WrDatTmp);
RdDatTmp=sRd1Byte();
BootSyn=1;
return(RdDatTmp);
}
void serialInit(void)
{
/*TMOD 00100001B M1M0=10 T1: MODE 2, 8 bit reload;M1M0=01 T0, MODE 1, 16 bit counter/Timer*/
SCON=0x50; /* 0101000B(SM0 SM1 SM2 REN TB8 RB8 TI RI): Mode 1, T&R */
PCON=0x80; /* SMOD=1 K=2, SMOD=0 K=1*/
TH1=0xfd; /* 0xFF;(22.118Mhz); Fref=(K*Fosc)/(32*12*(256-TH1))=38400 */
TL1=0xfd;
TR1=1; /* (TCON) timer 1 control 1=run, 0=stop*/
ES=1; /* 1=serial interrupt enable, 0=serial interrupt disable*/
}
void DataSend(void)
{
uint kk=0;
SendNum=0x00;
for(kk=0;kk<64;kk++)
{
RecBuf[kk]=EepromRd(BlockStart+kk);
}
TI=0;
SBUF=RecBuf[0x00];
}
void DisLcd(void)
{
uchar i;
unsigned long int ReadDatTmp;
if(LcdBlink==0)
{
LcdBlink=25;
SpiBusWr(0x0805);
tdelay(10);
ReadDatTmp=SpiBusRd();
while((ReadDatTmp!=0xfff0fff0)&&(StartLoad==0))
{
tdelay(5);
ReadDatTmp=SpiBusRd();
}
SpiBusWr(0x0806);
tdelay(2);
for(i=0;i<64;)
{
ReadDatTmp=SpiBusRd();
RecBufDis[i]=(ReadDatTmp>>16);
RecBufDis[i+1]=(ReadDatTmp&0x0000ffff);
i=i+2;
}
for(i=0;i<64;i++)
{
if(RecBufDis[i]<8)
{;}
else if((RecBufDis[i]>=8)&&(RecBufDis[i]<24))
{
RecBufDis[i]=8+((RecBufDis[i]-8)>>1);
}
else if((RecBufDis[i]>=24)&&(RecBufDis[i]<56))
{
RecBufDis[i]=16+((RecBufDis[i]-24)>>2);
}
else if((RecBufDis[i]>=56)&&(RecBufDis[i]<120))
{
RecBufDis[i]=24+((RecBufDis[i]-56)>>3);
}
else if((RecBufDis[i]>=120)&&(RecBufDis[i]<248))
{
RecBufDis[i]=32+((RecBufDis[i]-120)>>4);
}
else if((RecBufDis[i]>=248)&&(RecBufDis[i]<504))
{
RecBufDis[i]=40+((RecBufDis[i]-248)>>5);
}
else if((RecBufDis[i]>=504)&&(RecBufDis[i]<1016))
{
RecBufDis[i]=48+((RecBufDis[i]-504)>>6);
}
else if((RecBufDis[i]>=1016)&&(RecBufDis[i]<2040))
{
RecBufDis[i]=56+((RecBufDis[i]-1016)>>7);
}
if(RecBufDis[i]>63)
{RecBufDis[i]=63;}
PicBuf[i]=RecBufDis[i];
}
PicFft();/*
for(i=0;i<64;i++)
{
SendDatBuf[2*i]=(RecBufDis[i]>>8);
SendDatBuf[2*i+1]=(RecBufDis[i]&0x00ff);
}
SendNum=0;
TI=0;
SBUF=SendDatBuf[0];*/
}
}
void DisRmon(void)
{
if(LoopTime==0)
{
LoopTime=60;
StartDisLine++;
if(StartDisLine==64)
{StartDisLine=0;}
LcdCmdWr(1,StartDisLine|0xc0);
}
}
void WrBlockDatInRom(void)
{
BlockStart=BlockCnt*0x40;
BlockEnd =BlockStart+0x40;
EepromWr(BlockStart);
tdelay(40);
}
main(void)
{
/*LampEn=0;*/
BootSyn=1;
BootClk=0;
BootTx=0;
BootRx=0;
tdelay(255);
tdelay(255);
tdelay(255);
tdelay(255);
TMOD=0x21;
TH0=0x0c;
TL0=0xdc;
ET0=1;
TR0=1;
serialInit();
EA=1;
LcdInit();
LcdClear();
DisEcho();DisEq();DisFFT();DisLMS();
Rst4221D();
iic4221wr(0x00,0x00);
iic4221wr(0x01,0x00);
iic4221wr(0x02,0x4a);
iic4221wr(0x03,0x00);
iic4221wr(0x04,0x00);
iic4221wr(0x05,0x65);
/*
EepromWrReg(0x00);
for(BlockNum=0;BlockNum<122;BlockNum++)
{
BlockStart=BlockNum*0x40;
BlockEnd =BlockStart+0x40;
for(CopyNum=BlockStart;CopyNum<BlockEnd;CopyNum++)
{
SecBootTab[CopyNum-BlockStart]=BootTab[CopyNum];
}
EepromWr(BlockStart);
tdelay(40);
}
EepromWrDi();
*/
while(1)
{
DisLcd();
DisRmon();
if(OneBlockEnd==1)
{
OneBlockEnd=0;
if(BlockCnt==0)
{
EepromWrReg(0x00);
WrBlockDatInRom();
BlockCnt++;
}
else if(BlockCnt<filelenth)
{
WrBlockDatInRom();
BlockCnt++;
}
if(BlockCnt==filelenth)
{
EepromWrDi();
BlockCnt=0;
StartLoad=0;
}
TI=0;
SBUF=0xfa;
//DataSend();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -