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

📄 user_func.c

📁 深圳优龙公司LPC2148开发板(与iar公司开发板基本相同)的原理图和配套样例程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/*************************************************************************
 *
 *    Used with ICCARM and AARM.
 *
 *    (c) Copyright IAR Systems 2003
 *
 *    File name   : main.c
 *    Description : Define main module
 *
 *    History :
 *    1. Data   	 : Feb 12, 2005
 *  	 Author 	 : Stanimir Bonev
 *  	 Description : Create
 *
 *    $Revision: 1.3 $
**************************************************************************/
#include "user_func.h"

#define SCREEN_SAVER_INC  TRUE    /* Index increment */
#define SCREEN_SAVER_DEC  FALSE   /* Index decrement */

#define MAX_ADC_FREQ	  4500000 /* Max Adc frequence */

LPC_INT8U ButtCount1, ButtCount2, ButtCount3, ButtCount4, ButtFlags;

LPC_BOOL LightState;

LPC_INT8U Index;
LPC_BOOL Direction;

const char IllumAlwaysOff[] = " Off";
const char IllumAuto[] = " Auto";
const char IllumAlwaysOn[] = " On";

const char * const IlluminationModeStr[] =
{
	IllumAlwaysOff, IllumAuto, IllumAlwaysOn,
};

const LPC_INT8U ScreenSaverTO[] =
{
	2 * TICK_PER_SECOND, 0.15 * TICK_PER_SECOND, 0.15 * TICK_PER_SECOND, 0.15 * TICK_PER_SECOND, 0.15 * TICK_PER_SECOND,
	0.15 * TICK_PER_SECOND, 0.15 * TICK_PER_SECOND, 0.15 * TICK_PER_SECOND, 0.15 * TICK_PER_SECOND,
	0.15 * TICK_PER_SECOND, 0.15 * TICK_PER_SECOND, 0.15 * TICK_PER_SECOND, 0.15 * TICK_PER_SECOND,
	0.15 * TICK_PER_SECOND, 0.15 * TICK_PER_SECOND, 2 * TICK_PER_SECOND,
};

const MEMU_STING_DEF ScreenSaver0[] = "  IAR Embedded  \2 Workbench-ARM  \2";
const MEMU_STING_DEF ScreenSaver1[] = "   IAR Eedded   \2  Worknch-ARM   \2";
const MEMU_STING_DEF ScreenSaver2[] = "    IAR dded    \2   Worch-ARM    \2";
const MEMU_STING_DEF ScreenSaver3[] = "     IARded     \2    Woh-ARM     \2";
const MEMU_STING_DEF ScreenSaver4[] = "      IAed      \2     W-ARM      \2";
const MEMU_STING_DEF ScreenSaver5[] = "       Id       \2      WRM       \2";
const MEMU_STING_DEF ScreenSaver6[] = "                \2       M        \2";
const MEMU_STING_DEF ScreenSaver7[] = "                \2                \2";
const MEMU_STING_DEF ScreenSaver8[] = "       PM       \2                \2";
const MEMU_STING_DEF ScreenSaver9[] = "      PARM      \2                \2";
const MEMU_STING_DEF ScreenSaver10[] = "     Ph ARM     \2                \2";
const MEMU_STING_DEF ScreenSaver11[] = "    Phii ARM    \2                \2";
const MEMU_STING_DEF ScreenSaver12[] = "   Phiemi ARM   \2       L        \2";
const MEMU_STING_DEF ScreenSaver13[] = "  Philiemi ARM  \2      L48       \2";
const MEMU_STING_DEF ScreenSaver14[] = " Philipsemi ARM \2     LP148      \2";
const MEMU_STING_DEF ScreenSaver15[] = "Philips Semi ARM\2    LPC2148     \2";

const MEMU_STING_DEF * const ScreenSaverTable[] =
{
	ScreenSaver0, ScreenSaver1, ScreenSaver2, ScreenSaver3, ScreenSaver4, ScreenSaver5, ScreenSaver6, ScreenSaver7,
	ScreenSaver8, ScreenSaver9, ScreenSaver10, ScreenSaver11, ScreenSaver12, ScreenSaver13, ScreenSaver14,
	ScreenSaver15,
};

/*************************************************************************
 * Function Name: ScreenSaverInit
 * Parameters: MEMU_STING_DEF * pVarArg,
 *  		   MEMU_IND_DEF * MenuIndex,
 *  		   MEMU_TIME_OUT_DEF * MenuTO
 * Return: none
 * Description: Initialize menu screensaver
 *
 *************************************************************************/
void ScreenSaverInit( MEMU_STING_DEF* pVarArg , MEMU_IND_DEF* MenuIndex , MEMU_TIME_OUT_DEF* MenuTO )
{
	Index = 0;
	Direction = SCREEN_SAVER_INC;
	ScreenSaver( pVarArg , MenuIndex , MenuTO );
}

/*************************************************************************
 * Function Name: ScreenSaver
 * Parameters: MEMU_STING_DEF * pVarArg,
 *  		   MEMU_IND_DEF * MenuIndex,
 *  		   MEMU_TIME_OUT_DEF * MenuTO
 * Return: none
 * Description: Initialize menu screensaver
 *
 *************************************************************************/
void ScreenSaver( MEMU_STING_DEF* pVarArg , MEMU_IND_DEF* MenuIndex , MEMU_TIME_OUT_DEF* MenuTO )
{
	Index &= 0xF;
	*MenuTO = ScreenSaverTO[Index];
	strcpy( pVarArg , ScreenSaverTable[Index] );
	if ( Direction == SCREEN_SAVER_INC )
	{
		++Index;
	}
	else
	{
		--Index;
	}
	if ( Index == 15 )
	{
		Direction = SCREEN_SAVER_DEC;
	}
	else if ( Index == 0 )
	{
		Direction = SCREEN_SAVER_INC;
	}
}


/*************************************************************************
 * Function Name: SysTimeUpdate
 * Parameters: onen
 * Return: none
 * Description: Set flag sys_time_update
 *
 *************************************************************************/
void SysTimeUpdate( void )
{
	SysTimeUpdateFlag = 1;
}

/*************************************************************************
 * Function Name: Alarm
 * Parameters: none
 * Return: none
 * Description: Set flag alarm
 *
 *************************************************************************/
void Alarm( void )
{
	SysAlarmFlag = 1;
}

/*************************************************************************
 * Function Name: FindOffSet
 * Parameters: const char* Str,
 *  		   LPC_INT8U  Size
 * Return: LPC_INT8U
 * Description: Return needed offset to show string in the middle of the LCD
 *
 *************************************************************************/
LPC_INT8U FindOffSet( const char* Str , LPC_INT8U  Size )
{
	if ( strlen( Str ) < Size - 1 )
	{
		Size -= strlen( Str );
		return ( Size >> 1 );
	}
	return 0;
}
/*************************************************************************
 * Function Name: FindOffSet
 * Parameters: const char* Str,
 *  		   LPC_INT8U  Size
 * Return: LPC_INT8U
 * Description: Return needed offset to show string in the middle of the LCD
 *
 *************************************************************************/
void ReplaceStr( char* DestStr , const char* SourStr , LPC_INT8U  Offset , LPC_INT8U  Size )
{
	if ( ( SourStr == NULL ) || ( DestStr == NULL ) || ( Size == 0 ) || ( strlen( DestStr ) <= Offset ) )
	{
		return;
	}
	DestStr += Offset;
	while ( *SourStr )
	{
		*DestStr = *SourStr;
		++SourStr;++DestStr;
		if ( --Size == 0 )
		{
			break;
		}
	}
}
/*************************************************************************
 * Function Name: GetTimeAndData
 * Parameters: MEMU_STING_DEF * pVarArg,
 *  		   MEMU_IND_DEF * MenuIndex,
 *  		   MEMU_TIME_OUT_DEF * MenuTO
 * Return: none
 * Description: Set flag alarm
 *
 *************************************************************************/
void GetTimeAndData( MEMU_STING_DEF* pVarArg , MEMU_IND_DEF* MenuIndex , MEMU_TIME_OUT_DEF* MenuTO )
{
	LPC_Rtc_Time_t CurrTime;
	LPC_Rtc_Date_t CurrData;
	char Temp[20];
	RTC_GetTime( &CurrTime );
	FormatTime( TimeFormat , &CurrTime , Temp );
	ReplaceStr( pVarArg , Temp , FindOffSet( Temp , 16 ) , 16 );
	RTC_GetDate( &CurrData );
	FormatDate( DataFormat , &CurrData , Temp );
	ReplaceStr( pVarArg + 17 , Temp , FindOffSet( Temp , 16 ) , 16 );
	HD44780_CursorPosSet( HD44780_CURSOR_OFF , HD44780_CURSOR_BLINK , 1 , 1 );
}


/********************************************************************************************************************
【函数名称】void LEDs_Init( void )
【功能描述】LED初始化
【参数输入】无
【参数返回】无
********************************************************************************************************************/
void LEDs_Init( void )
{
	/* pin P1_16-23 is IO port */
	PINSEL2 = PINSEL2 & ( ~( 1 << 3 ) ) ;

	/* pin P1_16-23 outputs */
	IO1DIR_bit.P0_16 = 1;
	IO1DIR_bit.P0_17 = 1;
	IO1DIR_bit.P0_18 = 1;
	IO1DIR_bit.P0_19 = 1;
	IO1DIR_bit.P0_20 = 1;
	IO1DIR_bit.P0_21 = 1;
	IO1DIR_bit.P0_22 = 1;
	IO1DIR_bit.P0_23 = 1;

	LEDs_Set( 0x55 ) ;
}

/********************************************************************************************************************
【函数名称】void LEDs_Set( unsigned char m )
【功能描述】LED显示设置
【参数输入】无
【参数返回】无
********************************************************************************************************************/
void LEDs_Set( unsigned char m )
{
	if ( m & 0x01 )
		IO1CLR_bit.P0_16 = 1;
	else
		IO1SET_bit.P0_16 = 1;

	if ( m & 0x02 )
		IO1CLR_bit.P0_17 = 1;
	else
		IO1SET_bit.P0_17 = 1;

	if ( m & 0x04 )
		IO1CLR_bit.P0_18 = 1;
	else
		IO1SET_bit.P0_18 = 1;

	if ( m & 0x08 )
		IO1CLR_bit.P0_19 = 1;
	else
		IO1SET_bit.P0_19 = 1;

	if ( m & 0x10 )
		IO1CLR_bit.P0_20 = 1;
	else
		IO1SET_bit.P0_20 = 1;

	if ( m & 0x20 )
		IO1CLR_bit.P0_21 = 1;
	else
		IO1SET_bit.P0_21 = 1;

	if ( m & 0x40 )
		IO1CLR_bit.P0_22 = 1;
	else
		IO1SET_bit.P0_22 = 1;

	if ( m & 0x80 )
		IO1CLR_bit.P0_23 = 1;
	else
		IO1SET_bit.P0_23 = 1;
}


/********************************************************************************************************************
【函数名称】void LEDs_Disp_Test( void )
【功能描述】LED显示测试
【参数输入】无
【参数返回】无
********************************************************************************************************************/
void LEDs_Disp_Test( void )
{
	unsigned char Temp ;
	#define FEQ_TIMER		900
	unsigned short FEQ = FEQ_TIMER ;
	

	UART_PutStringByPolling( UART0 , "\nLEDs Display Test\n" );
	UART_PutStringByPolling( UART0 , "'ESC' key to exit\n" );

	while( 1 )
	{
		for ( Temp = 0; Temp < 8; Temp++ )
		{
			LEDs_Set( 1 << Temp ) ;
			
			for ( FEQ = 0; FEQ < FEQ_TIMER; FEQ++ )
			{
				if( UART_GetKeyByPolling( UART0 ) == ESC_KEY )
				{
					LEDs_Set( 0xaa ) ;
					return ;
				}
				else
					Dly100us( ( void * ) ( 1 ) ) ;		//延时
			}
		}

		for ( Temp = 0; Temp < 8; Temp++ )
		{
			LEDs_Set( 1 << ( 7 - Temp ) ) ;
			
			for ( FEQ = 0; FEQ < FEQ_TIMER; FEQ++ )
			{
				if( UART_GetKeyByPolling( UART0 ) == ESC_KEY )
				{
					LEDs_Set( 0xaa ) ;
					return ;
				}
				else
					Dly100us( ( void * ) ( 1 ) ) ;		//延时
			}
		}
	}
	
}


/****************************************************************************
* 名称:PWM5_Set( U32 CYCLE_DATA, U32 DUTY_CYCLE_DATA )
* 功能:使用PWM5输出占空比可调的PWM波形。
* 参数说明:CYCLE_DATA表示PWM的周期是多少,范围是1--100000,对应于10us;
			DUTY_CYCLE_DATA占空比是多少,范围是1--100000,对应于0.001% - 100%
****************************************************************************/
void PWM2_Set( unsigned int CYCLE_DATA , unsigned int DUTY_CYCLE_DATA )
{
	PINSEL0_bit.P0_7 = 2;

	PWMTCR = 0x02;				// 停止定时器,PWM禁止,复位定时器
	PWMPR = 0x00;				// 不分频,计数频率为Fpclk
	PWMMCR = 0x02;				// 设置PWMMR0匹配时复位PWMTC
	PWMMR0 = CYCLE_DATA * ( FCCLK / 100000 );		// 设置PWM周期
	PWMMR2 = DUTY_CYCLE_DATA * ( FCCLK / 100000 );		// 设置PWM占空比

	PWMLER = 0x5;				// PWMMR0、PWMMR2锁存
	PWMPCR = PWMPCR | ( 1 << 10 ) ;	// 允许PWM2输出,单边PWM
	PWMTCR = 0x09;				// 启动定时器,PWM使能
}

void PWM2_Stop( void )
{
	PWMMCR = PWMMCR | ( 1 << 8 ) ;
}		//停止PWM2

/****************************************************************************
【功能说明】PWM模式控制蜂鸣器
****************************************************************************/
void Beep( unsigned int time )
{
	PWM2_Set( 100 , 50 ) ;
	Dly100us( ( void * ) ( time * 10 ) ) ;		//延时
	PWM2_Stop() ;
}

/****************************************************************************
【功能说明】PWM模式控制蜂鸣器测试
****************************************************************************/
void PWM2_Beep_Test( void )
{
	U16 CYCLE = 100;
	U8 key;		

	UART_PutStringByPolling( UART0 , "\nPWM5 Test( Beep ) !\n" ) ;
	UART_PutStringByPolling( UART0 , "\nPress +/- to increase/reduce the frequency of beep !\n" ) ;
	UART_PutStringByPolling( UART0 , "Press 'ESC' to Exit this test program !\n" );

	PWM2_Set( CYCLE , ( CYCLE / 2 ) ) ;

	while ( 1 )
	{
		key = UART_GetKeyByPolling( UART0 ) ;

		if ( key != 0 )
		{
			UART_PutCharByPolling( UART0 , key ) ;

			if ( key == ESC_KEY )
			{
				PWM2_Stop() ;
				return ;
			}

			if ( ( key == '+' ) || ( key == '-' ) )
			{
				if ( key == '+' )
					if ( CYCLE > 0 )
						CYCLE -- ;
				if ( key == '-' )
					if ( CYCLE < 10000 )
						CYCLE ++ ;

				PWM2_Set( CYCLE , ( CYCLE / 2 ) ) ;
			}
		}
	}
}

/*************************************************************************
 * Function Name: ButtonsInit
 * Parameters: none
 * Return: none
 * Description: Init buttons
 *
 *************************************************************************/
void ButtonsInit( void )
{
	/* pin P0_5,6,15,16 is IO port */
	PINSEL0_bit.P0_5 = 0;
	PINSEL0_bit.P0_6 = 0;
	PINSEL0_bit.P0_15 = 0;
	PINSEL1_bit.P0_16 = 0;

	/* Init buttons Inputs */
	IO0DIR_bit.P0_5 = 0 ;
	IO0DIR_bit.P0_6 = 0 ;
	IO0DIR_bit.P0_15 = 0 ;
	IO0DIR_bit.P0_16 = 0 ;

	/* Init button's variable */
	ButtFlags = 0 ;
	ButtCount1 = 0 ;
	ButtCount2 = 0 ;
	ButtCount3 = 0 ;
	ButtCount4 = 0 ;
}

/*************************************************************************
 * Function Name: Buttons
 * Parameters: none
 * Return: none
 * Description: Inplement buttons
 *
 *************************************************************************/
void Buttons( void )
{
	if ( !IO0PIN_bit.P0_5 )
	{
		if ( ButtCount1 > BUTT_DEB )
		{
			if ( ( ButtFlags & BUTT_FLAG_1 ) == 0 )
			{
				ButtFlags |= BUTT_FLAG_1 + BUTT_EVENT_1;
			}
		}
		else
		{
			++ButtCount1;
		}
	}
	else
	{
		if ( ButtCount1 == 0 )
		{
			if ( ButtFlags & BUTT_FLAG_1 )
			{
				ButtFlags &= ~BUTT_FLAG_1;
			}
		}
		else
		{
			--ButtCount1;
		}
	}

	//************************************************************************
	if ( !IO0PIN_bit.P0_6 )
	{
		if ( ButtCount2 > BUTT_DEB )
		{
			if ( ( ButtFlags & BUTT_FLAG_2 ) == 0 )

⌨️ 快捷键说明

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