查看: 4884|回复: 7

[报名/申请] 【LPC800申请】验证我的新方案(菜单系统和底层驱动)

[复制链接]
  • TA的每日心情
    开心
    2022-5-13 12:47
  • 签到天数: 95 天

    连续签到: 1 天

    [LV.6]常住居民II

    3

    主题

    475

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1533
    最后登录
    2022-8-15
    发表于 2016-9-28 12:54:41 | 显示全部楼层 |阅读模式
    本帖最后由 cos12a-21701 于 2016-11-17 12:41 编辑

    之前研究了两种菜单系统的写法,把它核心COPY了出来,再做了些一整合,整出一个新的菜单。正在琢磨用什么单片机验证一下。刚好可用LPC800飙一下,据说它的功能强大,操作方便,正好不用花太多的精力去折腾硬件,拿来就飙。
    再加上我刚入手的RFID模块,用它来验证我的底层驱动,读写卡,喔!RC522这个也是用的NXP家的芯片。
    把这两者结合起来,说不定还会做出个什么创意的东东来,哈哈哈 !就看我的脑洞大开了。活动不断,又升级到了LPC824lite板,刚申请到到,再杀入一个菜单系统,对菜单感兴趣的可以一起探讨一下。
    链接如下:
    【LPC824lite申请】比较我菜单系统方案https://www.nxpic.org.cn/module/ ... 5&fromuid=21701




    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-2-13 08:29
  • 签到天数: 20 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    531

    主题

    2048

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    210
    最后登录
    2018-8-14
    发表于 2016-9-30 09:56:25 | 显示全部楼层
    恭喜你通过,优惠券已经发送到你的商城账户,请下单购买(操作如下)
    https://www.nxpic.org.cn/module/forum/thread-606413-1-1.html
    签到 签到
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2022-5-13 12:47
  • 签到天数: 95 天

    连续签到: 1 天

    [LV.6]常住居民II

    3

    主题

    475

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1533
    最后登录
    2022-8-15
     楼主| 发表于 2016-10-13 12:30:11 | 显示全部楼层
    收到,先晒开箱图:

    1

    1

    2

    2

    3

    3

    4

    4

    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2022-5-13 12:47
  • 签到天数: 95 天

    连续签到: 1 天

    [LV.6]常住居民II

    3

    主题

    475

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1533
    最后登录
    2022-8-15
     楼主| 发表于 2016-10-18 12:54:09 | 显示全部楼层
    本帖最后由 cos12a-21701 于 2016-10-18 12:55 编辑

    这么久了也就发了几张图片,可能大家还以为我在忽悠呢,其实我一直在努力。那就先将我的菜单的数据结构和调用函数先放上来大家可以先理解一下。
    我觉得最好是回想一下链表,不是有专家说:程序绝大多数问题的解决方法都可以用链表来达到吗?
    直接粘贴代码吧:
    说明一下:此代码是在其它开源程序基础上改编而成,数据结构等未作更新,仅用作学习之用,不可用于商业用途。
    如有侵权,请通知我。
    /**
            ****************** (C) ^^^^^^^^^^^^^^^^^^^^^^^^******************
            * @file            menu.h
            * @author           cos12a@163.com
            * @version         V1.0.0
            * @date            10/10/2016
            * @brief           This file contains all the functions prototypes for the
            *                  menu navigation firmware driver.
      ******************************************************************************
      * @attention
      *
      *
      ******************************************************************************
      */

    /* Define to prevent recursive inclusion -------------------------------------*/
    #ifndef __MENU_H
    #define __MENU_H

    /* Includes ------------------------------------------------------------------*/
    #include "key.h"

    /* Private types ------------------------------------------------------------*/

    /* Private typedef -----------------------------------------------------------*/
    typedef void (* tMenuFunc)(void);
    typedef const struct  sMenuItem *  tMenuItem;
    typedef const struct  sMenu * tMenu;

    struct sMenuItem
    {
      uint8_t* pszTitle;
      tMenuFunc pfMenuFunc;
      tMenuFunc pfUpDownMenuFunc;
      tMenu psSubMenu;
    };

    struct sMenu
    {
      uint8_t* pszTitle;
      tMenuItem psItems;
      uint8_t nItems;
    };



    /* Private constants --------------------------------------------------------*/

    /* Exported types ------------------------------------------------------------*/
    /* Exported constants --------------------------------------------------------*/

    #define  MAX_DISPLAY_ITEMS     3

    #define  MAX_MENU_LEVELS       4

    /* Module private variables --------------------------------------------------*/



    /* Exported macro ------------------------------------------------------------*/
    #define countof(a) (sizeof(a) / sizeof(*(a)))

    /* Private functions ---------------------------------------------------------*/
    /* Exported functions ------------------------------------------------------- */

    void IdleFunc_bak(void);
    void ReturnFunc(void);
    void IdleFunc(void);
    void DisplayMenu(void);
    void Menu_Init(void);


    void ShowMenuIcons(void);
    void UpFunc(void);
    void DownFunc(void);
    void SelFunc(void);


    #endif /* __MENU_H */

    /******************* (C) COPYRIGHT 2016 *****END OF FILE****/

    /**
            ****************** (C) ^^^^^^^^^^^^^^^^^^^^^^^^******************
            * @file            menu.h
            * @author           cos12a@163.com
            * @version         V1.0.0
            * @date            10/10/2016
            * @brief           This file contains all the functions prototypes for the
            *                  menu navigation firmware driver.
      ******************************************************************************
      * @attention
      *
      *
      ******************************************************************************
      */

    #include "includes.h"
    #include "menu.h"
    #include "menu_table.c"



    /* Module private variables --------------------------------------------------*/


    static uint8_t MenuItemIndex = 0, nMenuLevel = 0;
    static uint8_t ItemNumb[MAX_MENU_LEVELS];

    static tMenuItem psMenuItem, psCurrentMenuItem;
    static tMenu psPrevMenu[MAX_MENU_LEVELS];
    static tMenu psCurrentMenu;
    static uint8_t display_con = 0;

    /*
    *********************************************************************************************************
    *                                         LOCAL FUNCTION PROTOTYPES
    *********************************************************************************************************
    */
    void DisplayMenuItems(void);

    /**
      * @brief  Initializes the navigation menu.
      * @param  None
      * @retval None
      */
    void Menu_Init(void)
    {
      psCurrentMenu = &MainMenu;
      psPrevMenu[nMenuLevel] = psCurrentMenu;
      psMenuItem = MainMenuItems;

      /* Initializes the Menu state machine */
      MenuItemIndex = 0;
      display_con = 0;
      nMenuLevel = 0;
    }



    /**
      * @brief  Displays the current menu Title.
      * @param  None
      * @retval None
      */
    void DisplayMenuTitle(void)
    {
      clear_all();                                             /* 清屏 */
      Display_LCD_String(0, psCurrentMenu->pszTitle, 1);      /* 显示菜单标题 */

    }

    /**
      * @brief  Displays the current menu.
      * @param  None
      * @retval None
      */
    void DisplayMenu(void)
    {
      DisplayMenuTitle();
      DisplayMenuItems();
    }
    /**
      * @brief  Displays the current menu.
      * @param  None
      * @retval None
      */
    void DisplayMenuItems(void)
    {
      uint32_t Line = 0, index = 0;

      tMenuItem psMenuItem2;

      // clear_all();                                             /* 清屏 */

            Write_LCD_Command(0x90);
            for(Line=0;Line<16;Line++)         //清除第二行
            {
                    Write_LCD_Data(0x20);  
            }
            Write_LCD_Command(0x88);
            for(Line=0;Line<16;Line++)         //清除第三行
            {
                    Write_LCD_Data(0x20);  
            }  
            Write_LCD_Command(0x98);
            for(Line=0;Line<16;Line++)         //清除第四行
            {
                    Write_LCD_Data(0x20);  
            }
      con_disp((display_con+1),0);                      /* 清除前一个反白项目 */
      display_con = MenuItemIndex%3;
      con_disp((display_con+1), 1);                   /* 将当前菜单项目反白 */
      index = MenuItemIndex-display_con;
      for(Line = 1; Line < 4; Line ++){
        psMenuItem2 = &(psCurrentMenu->psItems[index]);
        Display_LCD_String(Line, psMenuItem2->pszTitle, 1);
        if(++index >= (psCurrentMenu->nItems)) break;
      }
      // }
      /* Get the current menu */
      psMenuItem = &(psCurrentMenu->psItems[MenuItemIndex]);  

      // con_disp((display_con+1), 1);        /* 将当前菜单项目反白 */


    }




    /**
      * @brief  Idle function.
      * @param  None
      * @retval None
      */
    void IdleFunc(void)
    {
      /* Nothing to execute: return */
      return;
    }


    /**
      * @brief  Idle function.
      * @param  None
      * @retval None
      */
    void IdleFunc_bak(void)
    {
      /* Nothing to execute: return */
      return;
    }



    /**
      * @brief  This function is executed when any of "UP" push-butttons is pressed.
      * @param  None
      * @retval None
      */
    void UpFunc(void)
    {
      uint8_t con_temp = 0;

      psMenuItem = &psCurrentMenu->psItems[MenuItemIndex];
      con_disp(display_con+1,0);
      display_con = MenuItemIndex%3;

      if(MenuItemIndex > 0)
      {
        MenuItemIndex--;
      }
      else
      {
        MenuItemIndex = psCurrentMenu->nItems - 1;
      }

      if((display_con == 0)&&( psCurrentMenu->nItems > MAX_DISPLAY_ITEMS)){
        DisplayMenuItems();
      }else{
        display_con = MenuItemIndex%3;
        psMenuItem = &psCurrentMenu->psItems[MenuItemIndex];
        con_disp(display_con+1,1);                 /* 反选当前菜单项目 */
      }  

      ItemNumb[nMenuLevel] = MenuItemIndex;

    }


    /**
      * @brief  This function is executed when any of "DOWN" push-butttons is pressed.
      * @param  None
      * @retval None
      */
    void DownFunc(void)
    {
             uint8_t con_temp = 0;
      psMenuItem = &psCurrentMenu->psItems[MenuItemIndex];
      con_disp((display_con+1),0);      /* 清除上一个菜单项目的返选 */

      /* Test on the MenuItemIndex value before incrementing it */
      if(MenuItemIndex >= ((psCurrentMenu->nItems)-1))
      {
        MenuItemIndex = 0;
      }
      else
      {
        MenuItemIndex++;
      }  

      display_con = MenuItemIndex%3;

      if((display_con == 0)&&( psCurrentMenu->nItems > MAX_DISPLAY_ITEMS)){
        DisplayMenuItems();
      }else{
        psMenuItem = &psCurrentMenu->psItems[MenuItemIndex];
        con_disp((display_con+1),1);                 /* 反选当前菜单项目 */
      }  

      ItemNumb[nMenuLevel] = MenuItemIndex;     /* 保存当前项目索引 */

    }


    /**
      * @brief  This function is executed when "SEL" push-button is pressed.
      * @param  None
      * @retval None
      */
    void SelFunc(void)
    {
      psCurrentMenuItem = psMenuItem;           /* 将原菜单项目提升为当前菜单 */

      if(psMenuItem->psSubMenu != '\0')         /* 是否还有子菜单,则进入下一个子菜单 */
      {
        /* Update the current Item by the submenu */
        MenuItemIndex = 0;                      /* 索引号从0开始 */
        psCurrentMenu = psMenuItem->psSubMenu;  /* 传递,当前菜单的子项目 */
        /* 传递,子项目内所对应下一次菜单项目 */
        psMenuItem = &(psCurrentMenu->psItems)[MenuItemIndex];
        DisplayMenuTitle();                     /* 显示菜单标题 */
        DisplayMenuItems();                     /* 显示子菜单项目 */
        nMenuLevel++;                           /* 菜单层数,加一层 */
        psPrevMenu[nMenuLevel] = psCurrentMenu; /* 暂存当前层的菜单项目 */
       /* 如果进入下一层菜单则退出,不执行函数 */
      } else{    /* 如果没有子菜单则执行函数 */
        psCurrentMenuItem->pfMenuFunc();  
      }
    }

    /**
      * @brief  This function is executed when the "RETURN" menu is selected.
      * @param  None
      * @retval None
      */
      /* 返回上一个菜单 */
    void ReturnFunc(void)
    {
      psMenuItem->pfUpDownMenuFunc();       /* 执行UpDown对应函数 */

      if(nMenuLevel == 0)                   /* 层数不能变为零 */
      {
        nMenuLevel++;
      }
    /* 读取保存的上一个菜单项目 */
      psCurrentMenu = psPrevMenu[nMenuLevel-1];
      /* 获取菜单子项目 */
      psMenuItem = &psCurrentMenu->psItems[0];
      ItemNumb[nMenuLevel] = 0;     /* 将返回前的菜单索引项目缓存清零 */
      MenuItemIndex = 0;            /* 将返回前的菜单索引清零 */
      nMenuLevel--;                 /* 菜单层数减少一层 */
      MenuItemIndex = ItemNumb[nMenuLevel]; /* 获得上一次记录的索引号 */

      DisplayMenuTitle();
      DisplayMenuItems();                /* 显示子菜单项目 */

    }


    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2022-5-13 12:47
  • 签到天数: 95 天

    连续签到: 1 天

    [LV.6]常住居民II

    3

    主题

    475

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1533
    最后登录
    2022-8-15
     楼主| 发表于 2016-10-20 23:38:21 | 显示全部楼层
    LPC800使用感受:
    1.将板子做成与DIP40IC尺寸非常小巧,方便了使用,也方便进行扩展。
    见下面图片,将之前吃灰的51开板找出来,居然也能装上跑起来,着实方便了不少。
    2.当菜单已经移植可以跑起来,见下面效果。
    本来是要配合按键使用,但为了演示,取消了按键,写了一个自动按键输入,逐层展示菜单。
    视频需稍后。





    3.移植菜单系统的过程中,也是走了不少弯路。本想用LCD128X64做显示,无奈唯一的一块屏出现问题,只好更换Nokia5110屏,此屏在读写速度上虽然比LCD128X64快,但太小,看起来不太方便。

    对于编程序来说,没有一份原理图和编程手册来说是多么的困难,特别是像我这样刚刚接触到的新MCU.
    还好有坛友直接在分享了官网的资料。还有例程,还有IAR IDE的。
    详见地址:https://www.nxpic.org.cn/module/ ... mp;highlight=LPC824
    直接找了个Example_Multi_Timer_Blinky应用的样例,将时间打循环调快一点,加入Nokia5110驱动和菜单程序,在主程序内循环刷新更新菜单即可。
    程序和项目工程需稍后。

    1

    1

    2

    2
    LPC824_11.jpg
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2022-5-13 12:47
  • 签到天数: 95 天

    连续签到: 1 天

    [LV.6]常住居民II

    3

    主题

    475

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1533
    最后登录
    2022-8-15
     楼主| 发表于 2016-10-20 23:55:47 | 显示全部楼层
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2022-5-13 12:47
  • 签到天数: 95 天

    连续签到: 1 天

    [LV.6]常住居民II

    3

    主题

    475

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1533
    最后登录
    2022-8-15
     楼主| 发表于 2016-10-21 12:36:24 | 显示全部楼层
    本帖最后由 cos12a-21701 于 2016-10-21 12:42 编辑

    LPC800到手后,接好数据线,是不是发现有个CP2102USB转串口驱动一直安装不了。
    上传一个驱动文件: CP210x_VCP_Win_XP_S2K3_Vista_7.rar (5.08 MB, 下载次数: 8)
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2022-5-13 12:47
  • 签到天数: 95 天

    连续签到: 1 天

    [LV.6]常住居民II

    3

    主题

    475

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1533
    最后登录
    2022-8-15
     楼主| 发表于 2016-10-21 12:41:14 | 显示全部楼层
    现附上基于LPC800的菜单项目工程,开发环境为IAR IDE 7.7版本请多多指教: LPC824_menu.rar (932.89 KB, 下载次数: 10)
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-9-11 09:58 , Processed in 0.096906 second(s), 27 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表