📄 bertest.c.bak
字号:
/****************************************************************************
* 名称:BER_ResultCalculate()
* 功能:计算误码率
* 入口参数:uint32 BitSum:比特总数;uint32 ErrSum: 错码总数
* 出口参数:uint32 误码率计算结果,最高8位为整数部分,次高2个8位为小数部分,最低8位为阶码
****************************************************************************/
uint32 BER_ResultCalculate(uint32 BitSum,uint32 ErrSum)
{
fp32 TempResult;
uint32 BerRateResult;
uint8 BerExp=0; //阶数
uint8 BerInt=0; //整数部分
uint8 BerDec=0; //小数部分
if(BitSum==0)
return 0x00000000;
TempResult=(fp32)ErrSum/(fp32)BitSum;
if(TempResult>1)
{
return 0x00010000;
}
else if(TempResult!=0)
{
while(TempResult<1)
{
TempResult*=10;
BerExp++;
}
BerDec=(uint8)((uint16)(TempResult*100)%100);
BerInt= (uint8)TempResult;
BerRateResult=(uint32)(BerInt<<16)|(uint32)(BerDec<<8)|(uint32)BerExp;
return BerRateResult;
}
else
return 0;
}
/****************************************************************************
* 名称:BER_ResultDisplay()
* 功能:显示误码率
* 入口参数:uint32 Ber:误码率
* 出口参数:无
****************************************************************************/
void BER_ResultDisplay(uint32 Ber)
{
uint8 BerExp=0; //阶数
uint8 BerInt=0; //整数部分
uint8 BerDec=0; //小数部分
uint8 BerDec1,BerDec2;
if(Ber==0)
{
GUI_WriteWord(0,0, 8,16,WordsLib_Num[0],1);
}
else
{
BerExp=(uint8)Ber;
BerInt=(uint8)(Ber>>16);
BerDec=(uint8)(Ber>>8);
BerDec1=BerDec/10;
BerDec2=BerDec%10;
GUI_WriteWord(0,0, 8,16,WordsLib_Num[BerInt],1);
GUI_WriteWord(0,8, 8,16,WordsLib_Dot,1);
GUI_WriteWord(0,16, 8,16,WordsLib_Num[BerDec1],1);
GUI_WriteWord(0,24, 8,16,WordsLib_Num[BerDec2],1);
GUI_WriteARowWord(0,32, 8,16,WordsLib_E_[0],1,2);
GUI_WriteWord(0,48, 8,16,WordsLib_Num[BerExp],1);
}
}
/****************************************************************************
* 名称:DelayNS()
* 功能:长软件延时
* 入口参数:dly 延时参数值越大,延时越久
* 出口参数:无
****************************************************************************/
void Delay(uint32 dly)
{
uint32 i;
for(; dly>0; dly--)
for(i=0; i<50; i++);
}
/****************************************************************************
* 名 称:GUI_SendCom()
* 功 能: 发送一字节命令
* 入口参数:dat 要发送的命令
* 出口参数:无
* 说 明:A0=0 发送命令
****************************************************************************/
void GUI_SendCom( uint8 COM )
{
uint8 Data;
Data = ~COM;
IO0DIR |= LCDDB | LCDCS | LCDA0 | LCDWR | LCDRD;
IO0CLR = LCDA0;
Delay(1);
IO0CLR = LCDCS; //片选lcd,低电平有效
Delay(1);
IO0CLR = LCDWR; //控制lcd写命令
IO0SET = LCDRD;
if(COM==0x00)
{
IO0CLR = LCDDB;
}
else
{
IO0SET = COM << LCDNUM; // 从P0.10~P0.17输出
IO0CLR = (Data << LCDNUM);
}
Delay(1);
IO0SET = LCDCS;
IO0SET = LCDRD;
IO0SET = LCDWR; // LCDWR = 1
IO0CLR = LCDDB;
}
/****************************************************************************
* 名 称:GUI_SendDat()
* 功 能: 发送一字节命令
* 入口参数:dat 要发送的数据
* 出口参数:无
* 说 明:A0=1 发送数据
****************************************************************************/
void GUI_SendDat( uint8 Dat )
{
uint8 Data;
Data = ~Dat;
IO0DIR |= LCDDB|LCDCS | LCDA0 | LCDWR | LCDRD;
IO0SET = LCDA0;Delay(1);
IO0CLR = LCDCS;Delay(1); //片选lcd,低电平有效
IO0CLR = LCDWR; //控制lcd写数据
IO0SET = LCDRD;
if(Dat==0x00)
{
IO0CLR=(0XFF<<LCDNUM);
}
else
{
IO0SET = Dat << LCDNUM; // 从P0.10~P0.17输出
IO0CLR = (Data << LCDNUM);
}
Delay(1);
IO0SET = LCDCS;
IO0SET = LCDRD;
IO0SET = LCDWR; // LCDWR = 1
IO0CLR = LCDDB;
}
/****************************************************************************
* 名 称:GUI_LcdInit()
* 功 能:初始化lcd
* 入口参数:无
* 出口参数:无
* 说 明:目标器件为:LMS0192B-1型液晶屏
****************************************************************************/
void GUI_LcdInit(void)
{
GUI_SendCom( 0xAB );
GUI_SendCom( 0xA2 );
GUI_SendCom( 0xA1 );
GUI_SendCom( 0xC8 );
GUI_SendCom( 0x40 );
GUI_SendCom( 0xa4 );
GUI_SendCom( 0xa6 );
GUI_SendCom( 0x2F );
GUI_SendCom( 0x27 );
GUI_SendCom( 0x81 );
GUI_SendCom( 0x13 );
GUI_SendCom( 0xAF );
GUI_SendCom( 0xB0 );
GUI_SendCom( 0x12 );
GUI_SendCom( 0x04 );
}
/****************************************************************************
* 名 称:GUI_WriteWord_1616()
* 功 能: 在屏上指定页和指定列写一个16*16的字符
* 入口参数:Page :起始页;
* Col :起始列;
* Word :字符的起始数据指针
* Reverse :反现标志,非零有效
* 出口参数:无
* 说 明:目标器件为:LMS0192B-1型液晶屏
****************************************************************************/
void GUI_WriteWord_1616(uint8 Page,uint8 Col, const uint8 *Word,uint8 Reverse)
{
uint8 ColData,PageData;
uint8 ColRam;
if((Col<159)&&(Page<7))
{
ColRam=Col+0x24;
for(ColData=0;ColData<16;ColData++) //列循环。
{
for(PageData=0;PageData<2;PageData++) //跳上下页。
{
GUI_SendCom(0xb0+Page+PageData);
GUI_SendCom(0x00|((ColData+ColRam)&0x0f));
GUI_SendCom(0x10|((ColData+ColRam)>>4));
if(Reverse)
GUI_SendDat(~Word[16*PageData+ColData]);
else
GUI_SendDat(Word[16*PageData+ColData]);
}
}
}
}
/****************************************************************************
* 名 称:GUI_WriteWord()
* 功 能: 在屏上指定页和指定列写一个指定宽高的字符
* 入口参数:Page :起始页;
* Col :起始列;
* Width :字宽
* High :字高(必须为8的整数倍)
* Word :字符的起始数据指针
* Reverse :反现标志,非零有效
* 出口参数:无
* 说 明:目标器件为:LMS0192B-1型液晶屏
****************************************************************************/
void GUI_WriteWord(uint8 Page,uint8 Col, uint8 Width,uint8 High,const uint8 *Word,uint8 Reverse)
{
uint8 ColData,PageData;
uint8 ColRam;
if((Col<159)&&(Page<7))
{
ColRam=Col+0x24;
for(ColData=0;ColData<Width;ColData++) //列循环。
{
for(PageData=0;PageData<(High/8);PageData++) //跳上下页。
{
GUI_SendCom(0xb0+Page+PageData);
GUI_SendCom(0x00|((ColData+ColRam)&0x0f));
GUI_SendCom(0x10|((ColData+ColRam)>>4));
if(Reverse)
GUI_SendDat(~Word[Width*PageData+ColData]);
else
GUI_SendDat(Word[Width*PageData+ColData]);
}
}
}
}
/****************************************************************************
* 名 称:GUI_WriteARowWord()
* 功 能: 在屏上指定页和指定列写一行指定宽高的字符
* 入口参数:Page :起始页;
* Col :起始列;
* Width :字宽
* High :字高(必须为8的整数倍)
* Word :字符的起始数据指针
* Reverse :反现标志,非零有效
* Num :字符个数
* 出口参数:无
* 说 明:
****************************************************************************/
void GUI_WriteARowWord(uint8 Page,uint8 Col,uint8 Width,uint8 High, const uint8 *Word,uint8 Reverse,uint8 Num)
{
uint8 Temp;
for(Temp=0;Temp<Num;Temp++)
{
GUI_WriteWord(Page,Col+Temp*Width,Width,High,Word+Temp*Width*(High/8),Reverse);
}
}
/****************************************************************************
* 名 称:GUI_WriteARowWord_1616()
* 功 能: 在屏上指定页和指定列写一行16*16的字符
* 入口参数:Page :起始页;
* Col :起始列;
* Word :字符的起始数据指针
* Reverse :反现标志,非零有效
* Num :字符个数
* 出口参数:无
* 说 明:
****************************************************************************/
void GUI_WriteARowWord_1616(uint8 Page,uint8 Col, const uint8 *Word,uint8 Reverse,uint8 Num)
{
uint8 Temp;
for(Temp=0;Temp<Num;Temp++)
{
GUI_WriteWord_1616(Page,Col+Temp*16,Word+Temp*32,Reverse);
}
}
/****************************************************************************
* 名 称:GUI_ClrScreen()
* 功 能: 整屏清除
* 入口参数:无
* 出口参数:无
* 说 明:目标器件为:LMS0192B-1型液晶屏
****************************************************************************/
void GUI_ClrScreen(void)
{
uint8 Page,Col;
for(Page=0;Page<=7;Page++)
{
GUI_SendCom(0xb0 + Page);
GUI_SendCom(0x12);
GUI_SendCom(0x04);
for(Col=0;Col<=159;Col++)
{
GUI_SendDat(0x00);
}
}
}
/****************************************************************************
* 名称:main()
* 功能:
****************************************************************************/
int main(void)
{
uint32 Temp;
PINSEL0 = 0x00000000; // 设置所有管脚连接GPIO
PINSEL1 = 0x00000000;
PINSEL2 = 0x00000004;
IO1DIR = FPGA_RESET|MPU_TEST|LCDBACKLIGHT; // 设置FPGA_RESET和MPU_TEST控制口为输出
IO1SET = FPGA_RESET;
Delay(100);
IO1CLR = FPGA_RESET; // 复位FPGA
Delay(50);
IO1SET=LCDBACKLIGHT; // 点亮LCD背光
Delay(50);
GUI_LcdInit();
//Delay(50);
GUI_ClrScreen();
BER_Init();
BER_PseudorandomCommDdeal(0x05); //模板长度为2**3-1
//BER_RepetitiveCommDdeal(0x03); //01交替码
BER_InsertErr(7);
Delay(5000);
BER_ResultLoad();
Temp=BER_ResultCalculate(BerResult[0],BerResult[1]);
BER_ResultDisplay(Temp);
Delay(500000);
while(1)
{;
GUI_ClrScreen();
BER_IntDeal();
Delay(5000);
GUI_LcdInit();
//Delay(5000);
/*GUI_ClrScreen();
Delay(50000);
GUI_WriteARowWord_1616(1,80,WordsLib_Ber[0],0,3);
GUI_WriteARowWord(6,8, 16,16,WordsLib_Ber[0],1,3);
GUI_WriteARowWord(4,8, 8,16,WordsLib_Num[1],1,5);
Delay(50000);*/
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -