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

📄 sample_mai__.c

📁 AVR单片机的菜单制作工具
💻 C
📖 第 1 页 / 共 5 页
字号:

/*******************************************************************************
** 函数名称: GUI_Pop_Stack                                                    **
** 功能描述: GUI变量出栈,恢复当前的GUI变量                                   **
** 输入参数: 无                                                               **
** 输出参数: 无                                                               **
*******************************************************************************/
void GUI_Pop_Stack(void)
{
    BYTE *pMenuGui = MENU_GUI_MEMORY_END;
    BYTE i;

    for (i=0; i<MENU_GUI_SIZE; i++)
    {
        *pMenuGui-- = MENU_Stack[--MENU_StackIndex];
    }
}

/*******************************************************************************
** 函数名称: IntToStr                                                         **
** 功能描述: 把数值转换成字符串,并返回长度                                   **
** 输入参数: BYTE *Buffer : 字符串缓冲区                                      **
**           WORD Value   : 需要转换的值                                      **
** 输出参数: BYTE         : 字符串长度                                        **
*******************************************************************************/
BYTE IntToStr(BYTE *Buffer, WORD Value)
{
    WORD V[INT16_MAX_NUM]={10000,1000,100,10,1};
    BYTE i,j;

    j=0;
    for (i=0; i<INT16_MAX_NUM - 1; i++)
    {
        Buffer[j]='0';
        while (Value >= V[i])
        {
            Buffer[j]++;
            Value -= V[i];
        }
        if (Buffer[0]>'0')
        {
            j++;
        }
    }

    Buffer[j]='0' + Value;
    return (j+1);
}

/*******************************************************************************
** 函数名称: GetIntLen                                                        **
** 功能描述: 计算数值的长度                                                   **
** 输入参数: WORD Value   : 需要计算的数值                                    **
** 输出参数: BYTE         : 数值的长度                                        **
*******************************************************************************/
BYTE GetIntLen(WORD Value)
{
    WORD V[INT16_MAX_NUM]={10000,1000,100,10,1};
    BYTE i,j;

    j=1;
    for (i=0; i<INT16_MAX_NUM; i++)
    {
        if (Value >= V[i])
        {
            j = INT16_MAX_NUM - i;
            break;
        }
    }

    return (j);
}

/*******************************************************************************
** 函数名称: GUI_GetControlValue                                              **
** 功能描述: 将菜单项所对应的控制项的值取出到全局变量MENU_Result里            **
** 输入参数: BYTE MENU_ID        : 对应的菜单项ID                             **
** 输出参数: 控制值的大小(1 = 8Bit, 2 = 16Bit)                                **
*******************************************************************************/
BYTE GUI_GetControlValue(BYTE MENU_ID)
{
    flash BYTE *SubMenuDefine;
    BYTE Type;
    BYTE ControlValue;
    BYTE ControlWidth;

    SubMenuDefine = SUBMENUDEFINE(MENU_ID);
    Type = SubMenuDefine[SubMenuDefine_Type] & 0x0F;

    if (Type == MENU_INPUT)
    {
        ControlValue = SubMenuDefine[SubMenuDefine_InputControl];
        ControlWidth = SubMenuDefine[SubMenuDefine_InputWidth];
    }
    else if (Type == MENU_RADIOMENU)
    {
        ControlValue = SubMenuDefine[SubMenuDefine_RadioControl];
        ControlWidth = 1;
    }
    else
    {
        ControlValue = 0;
        ControlWidth = 2;
    }

    if (ControlValue == 0 )
    {
        MENU_Result.Word = 0;
        GetManualValue(MENU_ID, (WORD*)(&MENU_Result));
    }
    else if (ControlValue < CONTROL_COUNT)
    {
        if (ControlWidth == 1)
        {
            MENU_Result.Word = 0;
            MENU_Result.Byte = MENU_Control[ControlValue];
        }
        else if (ControlWidth == 2)
        {
            MENU_Result.Word = *(WORD *)(&MENU_Control[ControlValue]);
        }
        else
        {
            MENU_Result.Word = 0;
        }
    }
    else
    {
        MENU_Result.Word = 0;
    }
    return ControlWidth;
}

/*******************************************************************************
** 函数名称: GUI_SetControlValue                                              **
** 功能描述: 将全局变量MENU_Result里的值保存到菜单项所对应的控制项内存里      **
** 输入参数: BYTE MENU_ID        : 对应的菜单项ID                             **
** 输出参数: 无                                                               **
*******************************************************************************/
void GUI_SetControlValue(BYTE MENU_ID)
{
    flash BYTE *SubMenuDefine;
    BYTE Type;
    BYTE ControlValue;
    BYTE ControlWidth;

    SubMenuDefine = SUBMENUDEFINE(MENU_ID);
    Type = SubMenuDefine[SubMenuDefine_Type] & 0x0F;

    if (Type == MENU_INPUT)
    {
        ControlValue = SubMenuDefine[SubMenuDefine_InputControl];
        ControlWidth = SubMenuDefine[SubMenuDefine_InputWidth];
    }
    else if (Type == MENU_RADIOMENU)
    {
        ControlValue = SubMenuDefine[SubMenuDefine_RadioControl];
        ControlWidth = 1;
    }
    else
    {
        ControlValue = 0;
        ControlWidth = 2;
    }

    if (ControlValue == 0 )
    {
        SetManualValue(MENU_ID, (WORD*)(&MENU_Result));
    }
    else if (ControlValue < CONTROL_COUNT)
    {
        if (ControlWidth == 1)
        {
            MENU_Control[ControlValue] = MENU_Result.Byte;
        }
        else if (ControlWidth == 2)
        {
            *(WORD *)(&MENU_Control[ControlValue]) = MENU_Result.Word;
        }
    }
}

void GUI_SaveControlStatus(BYTE Flag1, BYTE Flag2)
{
    if ((MENU_Control[0] & 0xF0) == Flag1)
    {
        MENU_Control[0]++;
        if ((MENU_Control[0] & 0x0F) == 0x03)
        {
            MENU_Control[0] = Flag2;
        }
    }
    else
    {
        MENU_Control[0] = 0x00;
    }
}

/*******************************************************************************
** 函数名称: GUI_WriteCaption                                                 **
** 功能描述: 显示菜单项的标题文字                                             **
** 输入参数: BYTE MenuItemID : 菜单名称ID                                     **
**           BYTE WriteSpace : 是否要填充后面的空白                           **
** 输出参数: BYTE            : Caption的长度                                  **
*******************************************************************************/
BYTE GUI_WriteCaption(BYTE MenuItemID,BYTE Format)
{
    flash BYTE *Caption;
    flash BYTE *SubMenuDefine;
    BYTE Result=0;
    BYTE i = 0;

    SubMenuDefine = SUBMENUDEFINE(MenuItemID);
    i = SubMenuDefine[SubMenuDefine_Type] >> 4;
    Caption = SubMenuDefine + i;
    i = Caption[0];

    if (i==0)
    {
        MenuItemID = Caption[1];
        Caption = SUBMENUDEFINE(MenuItemID);
        i = Caption[0] >> 4;
        Caption+=i;
        i = Caption[0];
    }
    Result = i;
    Caption++;


    if ((SubMenuDefine[SubMenuDefine_Type] & 0x0F) == MENU_INPUT)
    {
        Format |= SubMenuDefine[SubMenuDefine_InputShowValue] & FORMAT_SHOW_VALUE;
    }
    else
    {
        Format &= ~FORMAT_SHOW_VALUE;
    }

    LCD_HideCursor();

    if (Format & FORMAT_SHOW_VALUE)
    {
        BYTE Buffer[5];
        BYTE Len=0;

        GUI_GetControlValue(MenuItemID);
        Len=IntToStr(Buffer,MENU_Result.Word);

        while (i--)
        {
            if ((Caption[0]=='=') && (Caption[1]=='#') && (Len>0))
            {
                BYTE j;
                for (j=0; j<Len; j++)
                {
                    LCD_PutChar(Buffer[j]);
                }
                Result+=Len;
                Result-=2;
                Caption+=2;

                if (i)    {i--;}
                if (i==0) {break;}
            }
            else
            {
                LCD_PutChar(*Caption++);
            }
        }
    }
    else if ((MenuItemID == 0)&&(Format == ~FORMAT_SHOW_VALUE))
    {
        while (i--)
        {
            LCD_PutChar(~(*Caption++));
        }
    }
    else
    {
        while (i--)
        {
            LCD_PutChar(*Caption++);
        }
    }

    if ((Format & FORMAT_SHOW_SPACE) && (Result < CAPTION_LENGTH))
    {
        while (Result < CAPTION_LENGTH)
        {
            LCD_PutChar(0x20);
            Result++;
        }
    }

    return Result;
}

/*******************************************************************************
** 函数名称: GUI_MenuNo                                                       **
** 功能描述: 把菜单序号转换成字符                                             **
** 输入参数: BYTE No:序号                                                     **
** 输出参数: 无                                                               **
*******************************************************************************/
BYTE GUI_MenuNo(BYTE No)
{
    if ((No >= 0) && (No <= 9))
    {
        return No + '0';
    }
    else if ((No >= 10) && (No <= 36))
    {
        return No - 10 + 'A';
    }
    else
    {
        return '?';
    }
}

/*******************************************************************************
** 函数名称: GUI_ChooseRadioMenu                                              **
** 功能描述: 选择单选菜单,单选菜单有对应的控制值                             **
** 输入参数: 无                                                               **
** 输出参数: 无                                                               **
*******************************************************************************/
void GUI_ChooseRadioMenu(void)
{
    if (MENU_Status & STATUS_UPDATETITLE)
    {
        flash BYTE *SubMenuDefine;
        BYTE i;
        SubMenuDefine = SUBMENUDEFINE(MENU_Selected);

        GUI_Push_Stack();

        #if (LCD_SUPPORT_ICON == FALSE)
        LCD_WriteCGRAM(ICONROM_RADIO_UP, ICON_RADIO_UP, 0);
        LCD_WriteCGRAM(ICONROM_RADIO_UPDOWN, ICON_RADIO_UPDOWN, 0);
        LCD_WriteCGRAM(ICONROM_RADIO_DOWN, ICON_RADIO_DOWN, 0);
        #endif

        LCD_Position(1,1);
        GUI_WriteCaption(MENU_Selected, FORMAT_SHOW_SPACE);

⌨️ 快捷键说明

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