user_func.c

来自「最新版IAR FOR ARM(EWARM)5.11中的代码例子」· C语言 代码 · 共 1,298 行 · 第 1/3 页

C
1,298
字号
/*************************************************************************
 *
 *    Used with ICCARM and AARM.
 *
 *    (c) Copyright IAR Systems 2005
 *
 *    File name   : user_func.c
 *    Description : User function module
 *
 *    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(GPIO5,GPIO_PIN_8)
#define BUTT_RIGHT_PIN                !GPIO_BitRead(GPIO5,GPIO_PIN_9)
#define BUTT_SELECT_PIN               !GPIO_BitRead(GPIO5,GPIO_PIN_12)
#define BUTT_CANCEL_PIN               !GPIO_BitRead(GPIO6,GPIO_PIN_6)

#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    STR731F     \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 GPIO5_InitStructure;
GPIO_InitTypeDef GPIO6_InitStructure;
  /* Init buttons Inputs */
  /* GPIO Initialization */
  /* GPIO5/GPIO6 Clock Enable */
  CFG_PeripheralClockConfig(CFG_CLK_GPIO5 , ENABLE);
  CFG_PeripheralClockConfig(CFG_CLK_GPIO6 , ENABLE);
  /* GPIO5/GPIO6 Configuration */
  GPIO5_InitStructure.GPIO_Mode = GPIO_Mode_IN_TRI_TTL;
  GPIO5_InitStructure.GPIO_Pins = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_12;
  GPIO_Init (GPIO5, &GPIO5_InitStructure);

  GPIO6_InitStructure.GPIO_Mode = GPIO_Mode_IN_TRI_TTL;
  GPIO6_InitStructure.GPIO_Pins = GPIO_PIN_6;
  GPIO_Init (GPIO6, &GPIO6_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: Imlement 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 */
  /* GPIO6 Clock Enable */
  CFG_PeripheralClockConfig(CFG_CLK_GPIO6 , ENABLE);
  /* GPIO6 Configuration */
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT_PP;
  GPIO_InitStructure.GPIO_Pins = GPIO_PIN_0;
  GPIO_Init (GPIO6, &GPIO_InitStructure);
  LightMode = LightModeAuto;
  LighToCounter = 0;
}

/*************************************************************************
 * Function Name: LightCntr
 * Parameters: Boolean On
 *
 * Return: none
 * Description: Backlight control
 *
 *************************************************************************/
void LightCntr (Boolean On)
{
  GPIO_BitWrite(GPIO6,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: Illumination 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

⌨️ 快捷键说明

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