⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bertest.c.bak

📁 c编写的lpc2129控制误码芯片ds2172的代码
💻 BAK
📖 第 1 页 / 共 2 页
字号:
/****************************************************************************
* 名称: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 + -