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

📄 lib.c

📁 详细介绍了arm7-at91r40008,的开发全过程
💻 C
📖 第 1 页 / 共 2 页
字号:
//	return(temp);
}
*/
/*------------------------------------------------------------------------
 Procedure:     bcd2bin16 ID:1
 Purpose:       转换BCD码为二进制,用于两个字节.
 Input:         BCD码.
 Output:        转换结果.
 Errors:        输入值过大.
------------------------------------------------------------------------*/
/*
INT16U bcdtobin16(INT16U v)
{
	register INT16U i;
	
	i=(v>>12)*1000;
	i+=((v&0x0f00)>>8)*100;
	i+=((v&0x00f0)>>4)*10;
	i+=v&0x0f;
	return(i);
}
*/
/*------------------------------------------------------------------------
 Procedure:     bin2bcd32 ID:1
 Purpose:       转换二进制为BCD码,用于四个字节.
 Input:         二进制值.
 Output:        转换结果.
 Errors:        输入值过大.
------------------------------------------------------------------------*/
/*
INT32U bin2bcd32(INT32U v)
{
	register INT32U temp=0 ,i,j;
	if (v>99999999){return 0;}
	
	for(i=10000000,j=28;i>=1;i=i/10,j=j-4)
	{
		temp+=(v/i)<<j;
		v-=(v/i)*i;
	}
	return (temp);
}
*/
/*------------------------------------------------------------------------
 Procedure:     bcd2bin32 ID:1
 Purpose:       转换为二进制,用于四个字节.
 Input:         BCD码.
 Output:        转换结果.
 Errors:        输入值过大.
------------------------------------------------------------------------*/
/*
INT32U bcd2bin32(INT32U v)
{
	register INT32U temp,i,j,k;
	
	
	temp=(v>>28)*10000000;
	
	for(i=0xf000000,k=1000000,j=24;k>=1;i=i>>4,j-=4,k=k/10)
	{
		temp+=((v&i)>>j)*k;
				
	}
	return(temp);

}
*/
/*------------------------------------------------------------------------
 Procedure:     LongMul ID:1
 Purpose:       长乘法.
 Input:         
 Output:        
 Errors:        
------------------------------------------------------------------------*/
/*
void LongMul(INT32U a, INT32U b, INT32U* result)
{
	INT16U ah, al, bh, bl;
	INT32U mul1, mul2, mul3;
	ah=(INT16U)(a>>16);
	al=(INT16U)a;
	bh=(INT16U)(b>>16);
	bl=(INT16U)b;
	mul1=(INT32U)al*(INT32U)bl;
	mul2=(INT32U)ah*(INT32U)bl+(INT32U)al*(INT32U)bh;
	mul3=(INT32U)ah*(INT32U)bh;
	
	result[0]=mul1+(mul2<<16);
	result[1]=(mul2>>16)+mul3;
	if((~mul1)<(mul2<<16))
	  result[1]++;
}
*/
/*------------------------------------------------------------------------
 Procedure:     UlongDiv ID:1
 Purpose:       无符号长除法.
 Input:         
 Output:        
 Errors:        
------------------------------------------------------------------------*/
/*
void UlongDiv(INT32U* a, INT16U c, INT32U* result)
{
	INT16U ah, al, bh, bl;
	INT32U quot1, quot2, quot3, quot4;
	INT32U rem1, rem2, rem3, rem;
	INT32U temp;

  	ah = (INT16U)(a[0]>>16);
	al = (INT16U)a[0];
	bh = (INT16U)(a[1]>>16);
	bl = (INT16U)a[1];

	quot1=bh/c;
	rem1=bh%c;
	temp=bl+(rem1<<16);

	quot2=temp/c;
	rem2=temp%c;

	temp=ah+(rem2<<16);
	quot3=temp/c;
	rem3=temp%c;
	temp=al+(rem3<<16);
	quot4=temp/c;
	rem=temp%c;
	
	result[2]=(quot1<<16)+quot2;
	result[1]=rem;
	result[0]=(quot3<<16)+quot4;
}
*/
/*------------------------------------------------------------------------
 Procedure:     delay_us ID:1
 Purpose:       微秒级延时程序.适用于AVRmega系列单片机。
 		用于操作系统没有初始化时的延时
 Input:         
 Output:        
 Errors:        
------------------------------------------------------------------------*/
/*
void delay_us(int time)
{
	do
	{
		time--;
	}	
  	while (time>1);
}
*/  
/*------------------------------------------------------------------------
 Procedure:     delay_us ID:1
 Purpose:       毫秒级延时程序.适用于AVRmega系列单片机。
 		用于操作系统没有初始化时的延时
 Input:         
 Output:        
 Errors:        
------------------------------------------------------------------------*/
/*
void delay_ms(INT32U time)
{
	while(time!=0)
	{		
		delay_us(1000);
		time--;
	}
}
*/


/*------------------------------------------------------------------*/
/*函数名称:MyPow()													*/
/*函数功能:乘方计算,x的y次方										*/
/*------------------------------------------------------------------*/
INT32U MyPow(INT32U x, INT32U y)
{
	INT32U	i, rc=1;
	
	for (i=0; i<y; i++)
		rc *= x;

	return (rc);
}


/////////////////////////////////////////////////////////////////////////////
//								串口处理部分
/////////////////////////////////////////////////////////////////////////////
BOOL RReadx(INT16U Addr, INT8U Port)
{
	char	pbuf[10];
	char    answer[]="THISISXX!X";
	INT8U   i, j;
	INT16U rp;
	
	if(Port == COM1)
	{
		rp = (Usart0.RRxc_Rd + RXC_BUFF_SIZE - 9) % RXC_BUFF_SIZE;
		for(i=0; Usart0.Rxc_Wr!=rp; i++)
		{
			if (Usart0.Rxc_Buff[rp] == 'I')
			{
				if ((((rp+RXC_BUFF_SIZE) - Usart0.Rxc_Wr) % RXC_BUFF_SIZE) < 10)
				{
					return (FALSE);
				}
				
				for (j=0; j<10; j++)
					pbuf[j] = Usart0.Rxc_Buff[ (rp+j) % RXC_BUFF_SIZE ];
			
				if (!strncmp(pbuf, "ISTHIS", 6))
				{
					if ((pbuf[6] == (Addr&0xFF)) && (pbuf[7] == ((Addr>>8)&0xFF)))
					{
						if (pbuf[8] == '?')
						{
							//判断校验码
							answer[6] = Addr&0xFF;
							answer[7] = (Addr>>8)&0xFF;
							answer[9] = SendVerifyHead((INT8U*)&answer[0],9);
							OSTimeDlyHMSM(0, 0, 0, 200);
							WriteX((INT8U*)answer,10,Port);
							OSTimeDlyHMSM(0, 0, 0, 500);
							WriteX((INT8U*)answer,10,Port);
							rp = (rp + 1) % RXC_BUFF_SIZE;
							Usart0.RRxc_Rd = (rp + 9) % RXC_BUFF_SIZE;
							return (TRUE);
						}
						else
						{
							rp = (rp + 1) % RXC_BUFF_SIZE;
							continue;
						}	
					}
					else
					{
						rp = (rp + 1) % RXC_BUFF_SIZE;
						continue;
					}
				}
				else
				{
					rp = (rp + 1) % RXC_BUFF_SIZE;
					continue;
				}
			}
			else
			{
				rp = (rp + 1) % RXC_BUFF_SIZE;
			}
		}
		Usart0.RRxc_Rd = rp;
	}
	else if(Port == COM2)
	{
		rp = (Usart1.RRxc_Rd + RXC_BUFF_SIZE - 9) % RXC_BUFF_SIZE;
		for(i=0; Usart1.Rxc_Wr!=rp; i++)
		{
			if (Usart1.Rxc_Buff[rp] == 'I')
			{
				if ((((rp+RXC_BUFF_SIZE) - Usart1.Rxc_Wr) % RXC_BUFF_SIZE) < 10)
				{
					return (FALSE);
				}
				
				for (j=0; j<10; j++)
					pbuf[j] = Usart1.Rxc_Buff[ (rp+j) % RXC_BUFF_SIZE ];
			
				if (!strncmp(pbuf, "ISTHIS", 6))
				{
					if ((pbuf[6] == (Addr&0xFF)) && (pbuf[7] == ((Addr>>8)&0xFF)))
					{
						if (pbuf[8] == '?')
						{
							//判断校验码
							answer[6] = Addr&0xFF;
							answer[7] = (Addr>>8)&0xFF;
							answer[9] = SendVerifyHead((INT8U*)&answer[0],9);
							OSTimeDlyHMSM(0, 0, 0, 200);
							WriteX((INT8U*)answer,10,Port);
							OSTimeDlyHMSM(0, 0, 0, 500);
							WriteX((INT8U*)answer,10,Port);
							rp = (rp + 1) % RXC_BUFF_SIZE;
							Usart1.RRxc_Rd = (rp + 9) % RXC_BUFF_SIZE;
							return (TRUE);
						}
						else
						{
							rp = (rp + 1) % RXC_BUFF_SIZE;
							continue;
						}	
					}
					else
					{
						rp = (rp + 1) % RXC_BUFF_SIZE;
						continue;
					}
				}
				else
				{
					rp = (rp + 1) % RXC_BUFF_SIZE;
					continue;
				}
			}
			else
				rp = (rp + 1) % RXC_BUFF_SIZE;
		}
		Usart1.RRxc_Rd = rp;
	}
	else
		return FALSE;
	
	return FALSE;
}

/*------------------------------------------------------------------------
 Procedure:     OnRx 
 Purpose:       按DF9000维护规约进行帧校验. 抛弃前面的干扰字符
 Input:
 Output:
 Errors:        帧非法.假设帧连续,且会结束出现帧尾.
------------------------------------------------------------------------*/
int Readx(INT8U *pbuf, INT16U count, INT8U port)
{
	INT16U i;
	INT16U rp;
	
	if(port == COM1)
	{
		rp = Usart0.Rxc_Rd;
		for(i=0; (i<count)&&(Usart0.Rxc_Wr!=rp); i++)
		{
			*(pbuf+i) = Usart0.Rxc_Buff[rp++];
			rp = rp%RXC_BUFF_SIZE;
			
		}
	}
	else if(port == COM2)
	{
		rp = Usart1.Rxc_Rd;
		for(i=0; (i<count)&&(Usart1.Rxc_Wr!=rp); i++)
		{
			*(pbuf+i) = Usart1.Rxc_Buff[rp++];
			rp = rp%RXC_BUFF_SIZE;
		}
	}
	else 	return -1;
	
	return i;
	
}
/*------------------------------------------------------------------------
 Procedure:     SCIWrite ID:1
 Purpose:       SCI写入.
 Input:         
 Output:
 Errors:        
------------------------------------------------------------------------*/
int WriteX(INT8U *pbuf, INT16U count, INT8U port)
{
	INT16U	i;	
	if (count == 0)
		return 0;
	
	if(port == COM1)
	{
		if ((PortInfo[0].Medium == 1) || (PortInfo[0].Medium == 3) || (PortInfo[0].Medium == 7))
		{
			for(i=0; i<4; i++)
			{
				Usart0.Txc_Buff[Usart0.Txc_Wr] = 0xFE;
				Usart0.Txc_Wr++;
				Usart0.Txc_Wr = Usart0.Txc_Wr%TXC_BUFF_SIZE;
			}
		}
		
		for(i=0; i<count; i++)
		{
			Usart0.Txc_Buff[Usart0.Txc_Wr] = *(pbuf+i);
			Usart0.Txc_Wr++;
			Usart0.Txc_Wr = Usart0.Txc_Wr%TXC_BUFF_SIZE;
		}
		
		//启动发送
		OSTimeDly (PortInfo[0].RTSONDelay);		
		US0_IER |= US_TXEMPTY;//开启UDRE中断
	}
	else if(port == COM2)
	{
		if ((PortInfo[1].Medium == 1) || (PortInfo[1].Medium == 3) || (PortInfo[1].Medium == 7))
		{
			for(i=0; i<4; i++)
			{
				Usart1.Txc_Buff[Usart1.Txc_Wr] = 0xFE;
				Usart1.Txc_Wr++;
				Usart1.Txc_Wr = Usart1.Txc_Wr%TXC_BUFF_SIZE;
			}
		}
		
		for(i=0; i<count; i++)
		{
			Usart1.Txc_Buff[Usart1.Txc_Wr] = *(pbuf+i);
			Usart1.Txc_Wr++;
			Usart1.Txc_Wr = Usart1.Txc_Wr%TXC_BUFF_SIZE;
		}

		//启动发送
		OSTimeDly (PortInfo[1].RTSONDelay);
		US1_IER |= US_TXEMPTY;//开启UDRE中断
	}
	else return -2;
	
	return i;
}

/*------------------------------------------------------------------------
 Procedure:     CComm::lseek ID:1
 Purpose:       更新读指针
 Input:			
 Output:
 Errors:
------------------------------------------------------------------------*/
void lseek(INT8U port, INT16U offset)
{
	if(port == COM1)
	{
		Usart0.Rxc_Rd = (Usart0.Rxc_Rd+offset)%TXC_BUFF_SIZE;
	}
	else if(port ==COM2)
	{
		Usart1.Rxc_Rd = (Usart1.Rxc_Rd+offset)%TXC_BUFF_SIZE;
	}
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -