📄 user_func.c
字号:
/*************************************************************************
*
* 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 + -