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

📄 csp.c

📁 在S3C2440上运行的"电子日历“(支持平年,闰年,星期自动调整). 开发环境是RVDS2.2
💻 C
字号:
/**---------------------Copyright (c)-----------------------------------------------------***
***                     Author:Yan Zhangjian                                              ***
***                     jenkinyan@163.com                                                 ***
***                                                                                       ***
***---------------------File Info---------------------------------------------------------***
*** 创 建 人:			颜章健															  ***
*** 创建日期:			2008-03-02														  ***
*** 创建版本:			V1.0.0															  ***
*** 文件描述:			片上外设支持包                         							  ***
***---------------------------------------------------------------------------------------***
*** 修 订 人:																			  ***
*** 修订日期:																			  ***
*** 修订版本:					      													  ***
*** 修订描述																			  ***
***---------------------------------------------------------------------------------------**/
#include	"config.h"
#include	<stdarg.h>

static uint32 uart0GetDataTimeOutCnt;


/********************************************************************************************
*** 函数名称:  GetKey		
*** 函数描述:  读取板上按键键值
*** 入    口:  
*** 出    口:  
********************************************************************************************/
uint8	GetKey(uint32 delay)	// delay:按键取值延时参数。任何延时下都没有抖动
{
	uint8  key,i;
	uint32 tmp,j;

	if((IO1PIN & KEY_BUS) == KEY_BUS)
	{
		return 0;
	}
	else
	{
		tmp = (IO1PIN & KEY_BUS) >> 29;
		key = (unsigned char) tmp | 0xf8;

		if(delay != 0)
		{
			for(i=15; i!=0; i--)
			{
				while((IO1PIN & KEY_BUS) != KEY_BUS);
			}
			for(j=0; j<delay; j++);
		}		
		return ( key );
	}	
}


void	WaitKeyPop(void)
{
	uint8 i;
	for(i=8; i>0; i--)
	{
		while((IO1PIN & KEY_BUS) != KEY_BUS);
	}
}







/********************************************************************************************
*** 函数名称:			
*** 函数描述:			
*** 入    口:			
*** 出    口:			
********************************************************************************************/
void Uart0Init (uint32 baud)
{
/*	uint16 Fdiv;
 
	PINSEL0 = (PINSEL0 & (~(0x03<<0  )))|(0x01<<0);		//P0.00 Use UART0	
	PINSEL0 = (PINSEL0 & (~(0x03<<2  )))|(0x01<<2);		//P0.01 Use UART0

	U0LCR = 0x83;										// DLAB=1,允许设置波特率
	Fdiv  = (Fpclk / 16) / baud;						// 设置波特率
	U0DLM = Fdiv / 256;
	U0DLL = Fdiv % 256;
	U0LCR = 0x03;
*/
	uint16  fdiv;
	float   tout,cnt_tmp;
	
	// UART1设备初始化
	PINSEL0 = (PINSEL0 & (~(0x03<<0  )))|(0x01<<0);	// P0.0 Use UART0
	PINSEL0 = (PINSEL0 & (~(0x03<<2  )))|(0x01<<2);	// P0.1 Use UART0
	
	U0LCR = 0x83;						// DLAB=1,允许设置波特率
	fdiv  = (Fpclk / 16) / baud;		// 设置波特率
	U0DLM = fdiv / 256;
	U0DLL = fdiv % 256;
	U0LCR = 0x03;
	
	
	
	
	// 计算接收超时计数器数值
	// 测试数据:uartGetDataTimeOut = 1579886 in 1 second (@ Fcclk = 44236800Hz)
	
	// 超时时间,单位:微秒
	tout =	(float)1000000				// 以微秒为单位
			* 11						// 一帧数据以11bit计算
			* 20							// 5帧数据的时间内没有数据到达则认为是超时
			/ baud;						// 1bit 的时间	
			
	// 设置接收超时计数器数值
	cnt_tmp = (float)(Fcclk / 44236800) * 1579886 * tout / 1000000;	
	uart0GetDataTimeOutCnt = (uint32)cnt_tmp;


}
/********************************************************************************************
*** 函数名称:			
*** 函数描述:			
*** 入    口:			
*** 出    口:			
********************************************************************************************/
/*
char Uart0GetChar (void)
{
	uint8 rcv_dat;
	while ((U0LSR & 0x01) == 0);
	rcv_dat = U0RBR;
	return (rcv_dat);	
}*/
uint8	Uart0GetChar(char *dat)
{
	uint32 time_out = 0;
	
	while ((U0LSR & 0x01) == 0)
	{
		time_out++;
		if(time_out > uart0GetDataTimeOutCnt)	return 0;
	}
	
	*dat = U0RBR;
	return 1;
}	
	
/********************************************************************************************
*** 函数名称:			
*** 函数描述:			
*** 入    口:			
*** 出    口:			
********************************************************************************************/
/*
void Uart0GetStr (char *s, uint32 len)
{
	while(len--)
	{
		*s++ = Uart0GetChar();
	}
}*/
uint32	Uart0GetStr // 返回实际收到的字符数
(
	char *buf, 			// 接收缓冲区
	uint32 buf_len		// 缓冲区长度
)
{
	uint32 cnt = 0;
	
	while(Uart0GetChar(buf) == 0);
	cnt++;
	
	while(buf_len--)
	{
		if(Uart0GetChar(++buf) == 0)	break;
		cnt++;
	}
	
	return	cnt;
}
	
	
/********************************************************************************************
*** 函数名称:			
*** 函数描述:			
*** 入    口:			
*** 出    口:			
********************************************************************************************/
void Uart0PutChar (char dat)
{
	U0THR = dat;
	while ((U0LSR & 0x40) == 0);			// 等待数据发送完毕
}

/********************************************************************************************
*** 函数名称:			
*** 函数描述:			
*** 入    口:			
*** 出    口:			
********************************************************************************************/
void Uart0PutStr (char *s)
{
	while (*s)
	{
		Uart0PutChar(*s++);					// 发送数据
	}
}

uint8	Uart0RecvNew(void)
{
	if((U0LSR & 0x01) == 0)	return	0;
	else					return	1;
}

uint8	MemCmp(uint8 *m1,uint8 *m2, uint32 len)
{
	while(len--)
	{
		if(*m1 != *m2)	return 0;
		m1++;
		m2++;
	}
	
	return	1;
}


/********************************************************************************************
*** 函数名称:			
*** 函数描述:			
*** 入    口:			
*** 出    口:			
********************************************************************************************/
int Printf(const char *fmt,...)
{
	int	cnt;
    va_list ap;
    char string[256];

    va_start(ap,fmt);
    cnt = vsprintf(string,fmt,ap);
    Uart0PutStr(string);
    va_end(ap);
    
    return	cnt;
}

/********************************************************************************************
*** 					文件结束														  ***	
********************************************************************************************/

⌨️ 快捷键说明

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