user_func.c
来自「最新版IAR FOR ARM(EWARM)5.11中的代码例子」· C语言 代码 · 共 1,292 行 · 第 1/3 页
C
1,292 行
/*************************************************************************
*
* Used with ICCARM and AARM.
*
* (c) Copyright IAR Systems 2005
*
* File name : user_func.c
* Description : Define common defenition
*
* History :
* 1. Date : Nov. 2, 2005
* Author : Stanimir Bonev
* Description : Create
*
* $Revision: 16170 $
**************************************************************************/
#include "user_func.h"
#define SELECT_CHAR 0x8
#define DEGREE_CHAR 0x1
#define BUTT_LEFT_PIN !GPIO_BitRead(GPIO2,GPIO_PIN_10)
#define BUTT_RIGHT_PIN !GPIO_BitRead(GPIO2,GPIO_PIN_11)
#define BUTT_SELECT_PIN !GPIO_BitRead(GPIO2,GPIO_PIN_12)
#define BUTT_CANCEL_PIN !GPIO_BitRead(GPIO2,GPIO_PIN_13)
#define LED_ALARM_MAX_PIN(Val) GPIO_BitWrite(GPIO0,GPIO_PIN_0,Val?Bit_SET:Bit_RESET)
#define LED_ALARM_MIN_PIN(Val) GPIO_BitWrite(GPIO0,GPIO_PIN_1,Val?Bit_SET:Bit_RESET)
#define LED_WARNING_MAX_PIN(Val) GPIO_BitWrite(GPIO0,GPIO_PIN_2,Val?Bit_SET:Bit_RESET)
#define LED_WARNING_MIN_PIN(Val) GPIO_BitWrite(GPIO0,GPIO_PIN_3,Val?Bit_SET:Bit_RESET)
#define SCREEN_SAVER_RIGHT TRUE
#define SCREEN_SAVER_LEFT FALSE
tButtonObj Bottons[4] =
{
{0,BUTT_RELEASE},
{0,BUTT_RELEASE},
{0,BUTT_RELEASE},
{0,BUTT_RELEASE},
};
Int32U LighToCounter;
Int8U CursorPosHold;
tLightMode LightMode;
tTemperatureUnits TempUnit = CELSIUS;
Flo32 Temperature = 0;
Flo32 AlarmMaxTemp, AlarmMinTemp, WarningMaxTemp, WarningMinTemp;
Boolean AlarmMode, WarningMode, Direction;
Flo32 K = 1.0;
const char * const IlluminationModeStr[] =
{
"Off\x1b\x2",
"Auto\x1b\x2",
"On\x1b\x2",
};
const char * const ActionStateStr[] =
{
"",
"Alarm min",
"Alarm max",
"Warning min",
"Warning max",
};
const MEMU_STING_DEF * const ScreenSaverTable [] =
{
" IAR Embedded \x1b\2 Workbench ARM \x1b\2",
" STMicroelectr. \x1b\2 STR730F \x1b\2",
};
/*************************************************************************
* Function Name: ScreenSaver
* Parameters: MEMU_STING_DEF ** ppVarArg,
* MEMU_IND_DEF * MenuIndex,
* MEMU_TIME_OUT_DEF * MenuTO
* MENU_ANIMATION_TYPE_DEF * AnimationType
* Return: none
* Description: Initialize menu screensaver
*
*************************************************************************/
void ScreenSaver (MEMU_STING_DEF ** ppVarArg,MEMU_IND_DEF * MenuIndex,
MEMU_TIME_OUT_DEF * MenuTO, MENU_ANIMATION_TYPE_DEF * AnimationType)
{
Direction ^= TRUE;
strcpy(*ppVarArg,ScreenSaverTable[Direction?1:0]);
*AnimationType = MEMU_ANIMATION_RIGHT;
}
/*************************************************************************
* Function Name: FindOffSet
* Parameters: const char* Str,Int8U Size
*
* Return: Int8U
*
* Description: Return needed offset to show string in the middle of the LCD
*
*************************************************************************/
Int8U FindOffSet(const char* Str,Int8U Size)
{
if(strlen(Str) < Size-1)
{
Size -= strlen(Str);
return (Size>>1);
}
return 0;
}
/*************************************************************************
* Function Name: ReplaceStr
* Parameters: char* DestStr,const char* SourStr,Int8U Offset,Int8U Size
*
* Return: none
* Description: Replace "Size" number of characters into *DestStr from *SourStr
*
*************************************************************************/
void ReplaceStr(char* DestStr,const char* SourStr,Int8U Offset,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: ButtonsInit
* Parameters: none
* Return: none
* Description: Init buttons
*
*************************************************************************/
void ButtonsInit (void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Init buttons Inputs */
/* GPIO Initialization */
/* GPIO2 Clock Enable */
CFG_PeripheralClockConfig(CFG_CLK_GPIO2 , ENABLE);
/* GPIO2 Configuration */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_TRI_TTL;
GPIO_InitStructure.GPIO_Pins = 0xf<<10;
GPIO_Init (GPIO2, &GPIO_InitStructure);
}
/*************************************************************************
* Function Name: ButtonFilt
* Parameters: Boolean Press, tButton ButInd
* Return: tButtonState
*
* Description: Button filter
*
*************************************************************************/
tButtonState ButtonFilt (Boolean Press,tButton ButInd)
{
tButtonObj * CurrentButton = &Bottons[ButInd];
static Int32U Count;
if (Press)
{
if(++CurrentButton->ButtCount > BUTT_HOLD_LONG_TO)
{
if(CurrentButton->ButtState < BUTT_HOLD_LONG)
{
CurrentButton->ButtState = BUTT_HOLD_LONG;
Count = BUTT_HOLD_LONG_TO + BUTT_REPEAT_TO;
return(BUTT_HOLD_LONG);
}
else if (Count <= CurrentButton->ButtCount)
{
CurrentButton->ButtCount = BUTT_HOLD_LONG_TO;
CurrentButton->ButtState = BUTT_HOLD_LONG;
return(BUTT_HOLD_LONG);
}
}
else if (CurrentButton->ButtCount > BUTT_HOLD_TO)
{
if(CurrentButton->ButtState < BUTT_HOLD)
{
CurrentButton->ButtState = BUTT_HOLD;
Count = CurrentButton->ButtCount + BUTT_REPEAT_TO;
return(BUTT_HOLD);
}
else if (Count <= CurrentButton->ButtCount)
{
Count = CurrentButton->ButtCount + BUTT_REPEAT_TO;
CurrentButton->ButtState = BUTT_HOLD;
return(BUTT_HOLD);
}
}
else if (CurrentButton->ButtCount > BUTT_DEB)
{
if(CurrentButton->ButtState < BUTT_PRESS)
{
CurrentButton->ButtState = BUTT_PRESS;
return BUTT_PRESS;
}
}
}
else
{
if(CurrentButton->ButtCount > BUTT_DEB)
{
CurrentButton->ButtCount = BUTT_DEB;
}
if(CurrentButton->ButtCount)
{
if(--CurrentButton->ButtCount == 0)
{
CurrentButton->ButtState = BUTT_RELEASE;
return BUTT_RELEASE;
}
}
}
return BUTT_STATE_NO_CHANGE;
}
/*************************************************************************
* Function Name: Buttons
* Parameters: none
* Return: Boolean
* Description: Inplement buttons
*
*************************************************************************/
Boolean Buttons (void)
{
Boolean ButtFlag = FALSE;
// Button 1 (Left)
switch(ButtonFilt(!BUTT_LEFT_PIN,ButtonLeft))
{
case BUTT_PRESS:
MenuSetEvent(MENU_EVENT_B_LEFT_PRESS);
ButtFlag = TRUE;
break;
case BUTT_HOLD:
MenuSetEvent(MENU_EVENT_B_LEFT_HOLD);
ButtFlag = TRUE;
break;
case BUTT_HOLD_LONG:
MenuSetEvent(MENU_EVENT_B_LEFT_HOLD_LONG);
ButtFlag = TRUE;
break;
}
// Button 2 (Right)
switch(ButtonFilt(!BUTT_RIGHT_PIN,ButtonRigth))
{
case BUTT_PRESS:
MenuSetEvent(MENU_EVENT_B_RIGHT_PRESS);
ButtFlag = TRUE;
break;
case BUTT_HOLD:
MenuSetEvent(MENU_EVENT_B_RIGHT_HOLD);
ButtFlag = TRUE;
break;
case BUTT_HOLD_LONG:
MenuSetEvent(MENU_EVENT_B_RIGHT_HOLD_LONG);
ButtFlag = TRUE;
break;
}
// Button 3 (Select)
if(ButtonFilt(!BUTT_SELECT_PIN,ButtonSelect) == BUTT_PRESS)
{
MenuSetEvent(MENU_EVENT_B_SELECT_PRESS);
ButtFlag = TRUE;
}
// Button 4 (Cancel)
if(ButtonFilt(!BUTT_CANCEL_PIN,ButtonCancel) == BUTT_PRESS)
{
MenuSetEvent(MENU_EVENT_B_CANCEL_PRESS);
ButtFlag = TRUE;
}
return ButtFlag;
}
/*************************************************************************
* Function Name: LightInit
* Parameters: none
* Return: none
* Description: Init backlight
*
*************************************************************************/
void LightInit(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Init Backlight control pin to output */
/* GPIO Initialization */
/* GPIO2 Clock Enable */
CFG_PeripheralClockConfig(CFG_CLK_GPIO2 , ENABLE);
/* GPIO2 Configuration */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT_PP;
GPIO_InitStructure.GPIO_Pins = 0x1;
GPIO_Init (GPIO2, &GPIO_InitStructure);
LightMode = LightModeAuto;
LighToCounter = 0;
}
/*************************************************************************
* Function Name: LightCntr
* Parameters: Boolean On
*
* Return: none
* Description: Backlight control
*
*************************************************************************/
void LightCntr (Boolean On)
{
GPIO_BitWrite(GPIO2,GPIO_PIN_0,On?Bit_SET:Bit_RESET);
}
/*************************************************************************
* Function Name: IlluminationShow
* Parameters: MEMU_STING_DEF ** ppVarArg,
* MEMU_IND_DEF * MenuIndex,
* MEMU_TIME_OUT_DEF * MenuTO
* MENU_ANIMATION_TYPE_DEF * AnimationType
* Return: none
* Description: Ilumination show
*
*************************************************************************/
void IlluminationShow (MEMU_STING_DEF ** ppVarArg,MEMU_IND_DEF * MenuIndex,
MEMU_TIME_OUT_DEF * MenuTO, MENU_ANIMATION_TYPE_DEF * AnimationType)
{
tLightMode Mode = GetLightMode();
if(**ppVarArg != ' ')
{
if(Mode+1 > LightModeOn)
{
Mode = LightModeOff;
}
else
{
++Mode;
}
SetLightMode(Mode);
}
strcpy(*ppVarArg,IlluminationModeStr[GetLightMode()]);
}
/*************************************************************************
* Function Name: CursorOff
* Parameters: MEMU_STING_DEF ** ppVarArg
* MEMU_IND_DEF * MenuIndex,
* MEMU_TIME_OUT_DEF * MenuTO
* MENU_ANIMATION_TYPE_DEF * AnimationType
* Return: none
* Description: Cursor off
*
*************************************************************************/
void CursorOff (MEMU_STING_DEF ** ppVarArg,MEMU_IND_DEF * MenuIndex,
MEMU_TIME_OUT_DEF * MenuTO, MENU_ANIMATION_TYPE_DEF * AnimationType)
{
HD44780_CursorPosSet(HD44780_CURSOR_OFF, HD44780_CURSOR_NORM,1, 1);
}
/*************************************************************************
* Function Name: TempShow
* Parameters: MEMU_STING_DEF ** ppVarArg,
* MEMU_IND_DEF * MenuIndex,
* MEMU_TIME_OUT_DEF * MenuTO
* MENU_ANIMATION_TYPE_DEF * AnimationType
* Return: none
* Description: Temperature and action state show
*
*************************************************************************/
void TempShow (MEMU_STING_DEF ** ppVarArg,MEMU_IND_DEF * MenuIndex,
MEMU_TIME_OUT_DEF * MenuTO, MENU_ANIMATION_TYPE_DEF * AnimationType)
{
MEMU_STING_DEF Str[16];
tTemperatureUnits CurrentTempUnit = GetTempUnit();
Int8U i,j;
sprintf(Str,"%4.1f",TempConverter(Temperature,KELVIN,CurrentTempUnit));
switch(CurrentTempUnit)
{
case CELSIUS:
strcat(Str,"\x1\x43");
break;
case FAHRENHEIT:
strcat(Str,"\x1\x46");
break;
default:
strcat(Str,"\x1\x4B");
break;
}
j = FindOffSet(Str,16);
for(i = 0; i < j ; ++i)
{
*(*ppVarArg+i) = ' ';
}
*(*ppVarArg+i) = 0;
strcat(Str,"\x1b\2");
strcat(*ppVarArg,Str);
j = FindOffSet(ActionStateStr[GetActionState()],16);
Str[j] = 0;
for(i = 0; i < j; ++i)
{
Str[i] = ' ';
}
strcat(*ppVarArg,Str);
strcat(*ppVarArg,ActionStateStr[GetActionState()]);
strcat(*ppVarArg,"\x1b\x2");
}
/*************************************************************************
* Function Name: GetTempUnit
* Parameters: none
*
* Return: enum
* Description: Return current temperature units
*
*************************************************************************/
tTemperatureUnits GetTempUnit (void)
{
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?