查看: 3412|回复: 1

[Blazar β-Board开发4]OLED的图形菜单

[复制链接]
  • TA的每日心情
    开心
    2022-8-16 09:50
  • 签到天数: 16 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2017-1-5 09:01:05 | 显示全部楼层 |阅读模式
    分享到:
    还记得曾经用过的mp3就是OLED显示屏的,当时的界面感觉还可以,现在手头有着块板子,刚好可以玩玩图形菜单。
    file:///C:UserslenovoAppDataRoamingTencentUsers308229423QQWinTempRichOleXUXVYNHQXO)5LR@3~3%MK}3.png

    对于玩过emwin的人来说懒得自己写一些什么画线 画圆啊,变色,刷图之类的函数了,一切交给gui,但是emwin移植到这个上边来难免大材小用了,然后就在网上各种找,最后找到了这个精简版的gui,周立功的ZLG/GUI,这个可以去周立功的论坛下载,现在原码不在这个电脑上,回去我整理整理发到评论里。
    首先要做的就是在lcmdrv.c中进行配置,要求提供 初始化,清屏,全屏填充,画点,刷新屏幕的接口。
    其它的都好说,刷新屏幕我这里用了一个[128][8]的数组来作为缓冲。每次画图先画到这个数组中,然后调用刷新的函数,这样避免了中间清屏重新刷的过程,提高了效率,动态效果更好。函数如下
    u8 OLED_GRAM[128][8];
    //更新显存到LCD
    void OLED_Refresh_Gram(void)
    {
    u8 i,n;   
    for(i=0;i<8;i++)  
    {  
    LED_WrCmd(0xb0+i);    //设置页地址(0~7)
    LED_WrCmd(0x00);      //设置显示位置—列低地址
    LED_WrCmd(0x10);      //设置显示位置—列高地址  
    for(n=0;n<128;n++)LED_WrDat(OLED_GRAM[n]);
    }  
    }
    这个改好后,需要配置GUI_CONFIG.H中的一些宏定义,就是一些函数的使能开关,我们在这里打开菜单,窗口管理、图标菜单的功能,
    还要把lcmdrv.h中的lcd像素改成128 和64,具体根据屏幕分辨率修改。

          图形菜单的核心代码如下,核心是uint8 SelectMenuIco(void)选择图形菜单,首先设置图形菜单选择1()这个函数功能就是画三个图标,并且把第一个图标内容取反,及选中状态,
    然后在while(1)中等待按键按下,按键是阻塞函数,之后就通过判断按键的值,来更改图标,或者是否左移右移,MENUICO mainmenu[8];//定义8个图标变量一共用了6个图标,不过我定义了8个,当更改选择的时候重新画图就好,传递图标的取模的数组指针即可,然后调用gui画图标的函数即可。
    int main(void) {        //u8 dir=1;        u8 select;         all_init();        NRF24L01_ModeSet(3);GUI_Initialize();        GUI_SetColor(1,0);//此时是正常显示,若(0,1)则反色显示                GUI_PutString(0,0,"Hello lx !");                  GUI_SetColor(0,1);//此时是正常显示,若(0,1)则反色<span style="font-size: 12.6000003814697px;">显示                 GUI_PutString(64,0,"Hello lx !");                 GUI_SetColor(1,0);                  /* 图标菜单初始化 */MenuIcoInit();         <br>///* 显示窗口 */DrawMainWindow();//GUI_WindowsDraw(windows); // 显示窗口  while(1)        {select = SelectMenuIco(); // 选择菜单        //        select = 3;if(select<8){ <br>        //(*mainmenu[select].Function)(); // 执行功能        switch(select)        {case 0: 功能1();                          break;<br>case 1: 功能2();                          break;case 2: 功能3();<br>                          break;case 3: game();                          break;case 4emoMessage();                    break;case 5: 功能6();                          break;<br>                }                <br>}主函数就如上图所示,刷新菜单的函数在按键值为确定的时候会返回当前选中图标的值,然后就可以在里边写函数了。经过几天的努力,已经完成了2048游戏,就在game功能里,信息的
    功能如下图。这个下次在详细讲,整个工程的画,目前还在调试中,整理好后发评论里。

    MENUICO mainmenu[8];//定义8个图标变量/* 定义三个图标菜单的显示位置 */#define ICO1_X 7#define ICO1_Y 14#define ICO2_X (ICO1_X + 41)#define ICO2_Y ICO1_Y#define ICO3_X (ICO2_X + 41)#define ICO3_Y ICO1_Y/******************************************************************************************** 名称:DrawSelectMenuIco()** 功能:在屏幕指定位置上显示 3 个图标菜单,并实现菜单选择显示。** 入口参数: start 显示 3 个图标菜单的第一个菜单序号** select 当前所选中的菜单序号** disp_all 全部更新控制(非 0 值时,3 个图标菜单重新显示)** 出口参数:无******************************************************************************************/void DrawSelectMenuIco(uint8 start, uint8 select, uint8 disp_all){ static uint8 s_start_no = 255;static uint8 s_select_old = 255;/* 判断是否要全部更新 */if( (s_start_no != start) ||(disp_all != 0) ) // 需全部更新{ s_start_no = start;s_select_old = select;/* 设置图标显示位置 */mainmenu[start].x = ICO1_X;mainmenu[start].y = ICO1_Y;mainmenu[start+1].x = ICO2_X;mainmenu[start+1].y = ICO2_Y;mainmenu[start+2].x = ICO3_X;mainmenu[start+2].y = ICO3_Y;/* 设置选择的图标,然后显示图标 */mainmenu[start].state = 0;mainmenu[start+1].state = 0;mainmenu[start+2].state = 0;mainmenu[select].state = 1;GUI_MenuIcoDraw(&mainmenu[start]);GUI_MenuIcoDraw(&mainmenu[start+1]);GUI_MenuIcoDraw(&mainmenu[start+2]);}else // 只需更新选择{ /* 清除旧的选择 */if(s_select_old<6){ mainmenu[s_select_old].state = 0;GUI_MenuIcoDraw(&mainmenu[s_select_old]);}/* 设置新的选择 */mainmenu[select].state = 1;GUI_MenuIcoDraw(&mainmenu[select]);s_select_old = select;}//GUI_Exec();}/******************************************************************************************** 名称:SelectMenuIco()** 功能:选择图标菜单。在屏幕上同时显示三个图标菜单,然后等待按键操作,** 当确定选择后返回所选的菜单序号(0--7)。** 入口参数:无** 出口参数:返回值即是所选的菜单项(序号)******************************************************************************************/uint8 SelectMenuIco(void){ static uint8 s_menu_start = 0; // 屏幕显示的第一个图标菜单序号static uint8 s_select = 0; // 当前所选择的图标菜单序号uint8 s_disp_sta = 0; // 需要更新显示标志uint8 key;//uint8 err;// 显示当前选择菜单DrawSelectMenuIco(s_menu_start, s_select, 1);while(1){ /* 若更新了选择的菜单项,则调用 DrawSelectMenuIco 显示当前选择菜单 */if(s_disp_sta!=0){ DrawSelectMenuIco(s_menu_start, s_select, 0);s_disp_sta = 0;}GUI_Exec();/* 读取一按键 */key=key_return();//key = OSMboxPend(KeyMbox, 0, &err);/* 分析按键并作相应操作 */switch(key){ case KEY_LEFT:if(s_select!=0){ s_select--; // 选择项左移/* 判断是否需要更新 s_menu_start */if(s_select<s_menu_start){ s_menu_start = s_select;}s_disp_sta = 1; // 需要更新显示}break;case KEY_RIGHT:if(s_select<5){ s_select++; // 选择向右移if((s_select-s_menu_start) > 2){ s_menu_start++;}s_disp_sta = 1; // 需要更新显示}break;case KEY_OK:return(s_select); // 确定,返回所选菜单序号default:break;} // end of switch(key)...} // end of while(1)...}/******************************************************************************************** 名称:MenuIcoInit()** 功能:初始化 mainmenu 结构数组。即初始化各图标变量的成员,如图标** 图形点阵数据指针,图标标题点阵数据指针,相应的功能函数等等。** 入口参数:无** 出口参数:无******************************************************************************************/void MenuIcoInit(void){ int i;extern uint8 const *pic_all[][2];  // 图标资源(pic1--pic8)for(i=0; i<6; i++){ /* 初始化为末选中状态 */mainmenu.state = 0;/* 连接相应的图标数据 */mainmenu.icodat = (uint8 *) pic_all[0];        mainmenu.title =(uint8 *) pic_all[1];/* 连接菜单功能函数 */mainmenu.Function = ( void(*) (void) ) DemoMessage;        }}WINDOWS mainw;/******************************************************************************************** 名称:DrawMainWindow()** 功能:在屏幕上显示一个主窗口,大小为 128x64。** 入口参数:无** 出口参数:无******************************************************************************************/void DrawMainWindow(void){ mainw.x = 0;mainw.y = 0;mainw.with = 128;mainw.hight = 64;mainw.title = (uint8 *) "LX";//&SHY"; // 窗口标题mainw.state = NULL; // 状态栏不显示GUI_WindowsDraw(&mainw); // 显示窗口}
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

    手机版|小黑屋|与非网

    GMT+8, 2024-4-27 00:24 , Processed in 0.136876 second(s), 19 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.