搜索
bottom↓
回复: 61

占用资源小的简单GUI的实现。对于类似51资源有限的单片机和点陈LCD比较实用。

[复制链接]

出0入4汤圆

发表于 2009-12-10 09:49:39 | 显示全部楼层 |阅读模式
先上二张图片,手机拍的不好,呵呵

(原文件名:反白显示.JPG)


(原文件名:方块游戏.JPG)


(原文件名:Ctrl.JPG)

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入4汤圆

 楼主| 发表于 2009-12-10 09:52:33 | 显示全部楼层
源码:

点击此处下载 ourdev_512675.rar(文件大小:23K) (原文件名:lwGUI.rar)

出0入4汤圆

 楼主| 发表于 2009-12-10 10:03:20 | 显示全部楼层
移植:将GUI_hw.c 中接口函数替换即可.

功能:其它画线就不用讲了,菜单编程简单说明一下.程序亮点也在此(自认为)
//----------------------------------------------------------------------------------
//菜单结构
typedef struct
{
    INT8U           x;           //菜单框架左上角X坐标
    INT8U           y;           //菜单框架左上角Y坐标
    INT8U           width;       //菜单框架宽度
    INT8U           height;      //菜单框架高度

    INT8U         itemTop;       //显示菜单框中最上面项
    INT8U         sItem;         //当前选择项
    INT8U         itemMax;       //最大顶数

    const char    *title;        //菜单标题
    const BMP     **pbmp;        //菜单项位图列表
    const char    ***ptext;      //菜单项文本列表

    void(*Paint)(void);          //重绘菜单
    void(*MegProc)(INT8U);       //消息处理
}MENU;

1.每个菜单项都有一个重绘菜单函数void(*Paint)(void); 通过它可画出想要的任何菜单样式。源码中画了大图标菜单和选择条菜单样式。每个菜单都有一个消息响应函数void(*MegProc)(INT8U); 传入消息如上页下页返回等操作。
2.定义菜单中的项采用分开方式编程,可读性强如:
//==================================================================================
//定义菜单字符串
const char  *sCtrl        = "控制";
const char  *sSet         = "设置";
const char  *sGame        = "游戏";
const char  *sHelp        = "帮助";

const char  *sCtrl2       = "智能插座       ";
const char  *sCtrl3       = "浴缸           ";
const char  *sCtrl4       = "脸盆           ";
const char  *sCtrl5       = "空调           ";
//==================================================================================
//定义菜单文本
const char **MMenuText[]  ={&sCtrl,&sSet,&sGame,&sHelp};
const char **SCtrlText[]  ={&sCtrl2,&sCtrl3,&sCtrl4,&sCtrl5};
//==================================================================================
//定义菜单位图列表
const BMP   *MMenuBmp[]   ={&ctrl,&set,&game,&help};
//==================================================================================
//声明菜单消息处理事件
void MMegProc(INT8U meg);
void SCtrlMegProc(INT8U meg);
//==================================================================================
//定义菜单项
MENU MMenu=
{
   0,
   0,
   128,
   48,
   0,
   0,
   4,
   "Main menu",
   MMenuBmp,
   MMenuText,
   GUI_MenuBmpPaint,
   MMegProc
};
MENU SCtrl=
{
   0,
   0,
   128,
   48,
   0,
   0,
   4,
   "控制",
   0,
   SCtrlText,
   GUI_MenuPaint,
   SCtrlMegProc
};
//----------------------------------------------------------------------------------
//                                主菜单消息处理
//描述:        处理主菜单消息
//参数:meg :消息
//返回:        无
//----------------------------------------------------------------------------------
void MMegProc(INT8U meg)
{   
    if(meg==KEY_UP)
    {
        if(MMenu.sItem>0)
            MMenu.sItem--;
        else                 
            MMenu.sItem = MMenu.itemMax-1;
    }
    else if(meg==KEY_DOWN)
    {
        if(MMenu.sItem<(MMenu.itemMax-1))
            MMenu.sItem++;
            
        else                 
            MMenu.sItem = 0;
    }
    else if(meg==KEY_EN)
    {
        if(MMenu.sItem==0)
        {
            pCMenu=&SCtrl;
            GUI_Clear();
        }
        if(MMenu.sItem==2)
        {
            TetrisMain();
            GUI_Clear();
            BuzzerOn;
            OSTimeDly(5);
            BuzzerOff;
        }
    }
    else if(meg==KEY_CLR)
    {
        GUI_Clear();
        pCMenu = 0;         
        return;
    }       
    pCMenu->Paint();
}
//----------------------------------------------------------------------------------
//                                控制菜单消息处理
//描述:        处理控制菜单菜单消息
//参数:meg :消息
//返回:        无
//----------------------------------------------------------------------------------
void SCtrlMegProc(INT8U meg)
{          
    if(meg==KEY_UP)
    {
        if(SCtrl.sItem>0)
            SCtrl.sItem--;
        else                 
            SCtrl.sItem = SCtrl.itemMax-1;

        if(SCtrl.sItem<SCtrl.itemTop)
            SCtrl.itemTop--;
        if(SCtrl.sItem>SCtrl.itemTop+1)
            SCtrl.itemTop= SCtrl.sItem-1;
        pCMenu->Paint();
    }
    else if(meg==KEY_DOWN)
    {
        if(SCtrl.sItem<(SCtrl.itemMax-1))
            SCtrl.sItem++;
            
        else                 
            SCtrl.sItem = 0;

        if(SCtrl.sItem>1)
            SCtrl.itemTop=SCtrl.sItem-1;
        else              
            SCtrl.itemTop=0;
        pCMenu->Paint();
    }
    else if(meg==KEY_CLR)
    {
        pCMenu=&MMenu;
        GUI_Clear();
        pCMenu->Paint();
    }   
    else LCD_Refresh();  
}
//==================================================================================

出0入4汤圆

 楼主| 发表于 2009-12-10 10:18:05 | 显示全部楼层
看来没什么用呀,自认为对认识图形用户界面编程还是有帮助的。自已顶一下吧?

出0入0汤圆

发表于 2009-12-10 10:43:03 | 显示全部楼层
有用呀,我特意登陆顶一下

出0入0汤圆

发表于 2009-12-10 11:18:05 | 显示全部楼层
手机登录中。每顶一次要好些流量,先mark,开电脑了看看。

出0入0汤圆

发表于 2009-12-10 11:24:26 | 显示全部楼层
LZ的照片实在是台朦胧了,不过感谢楼主的共享

出0入0汤圆

发表于 2009-12-10 11:50:15 | 显示全部楼层
mark,感谢楼主

出0入4汤圆

 楼主| 发表于 2009-12-10 12:13:15 | 显示全部楼层
这个程序是用在流明ARM系列测试的,带有ucos操作系统,上ucGUI太占用空间了,所以简简实现菜单功能。最初就是想做一个移植方便的简单界面操作程序。大部分菜单采用的常量操作点用空间小,做了常用的字体和小型汉字库。自已用起来感觉方便,对于本论坛的菜单编程序都有所了解,自认为有独特之处。将菜单数据和菜单显示分开,程序可读性较强。在不同的LCD上移植方便。特对于资源少的单片机做界面编程可简化大量工作。不过还不太完整。望大家做完整一些。

出0入0汤圆

发表于 2009-12-10 12:15:32 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-12-10 12:48:59 | 显示全部楼层
MARK GUI

出0入0汤圆

发表于 2009-12-10 13:05:48 | 显示全部楼层
顶~~~

出0入0汤圆

发表于 2009-12-10 13:28:23 | 显示全部楼层
不错,写的很清晰。
不过很多地方也是参考别人的做,其实可以独创一些东西哦

出0入4汤圆

 楼主| 发表于 2009-12-10 14:07:26 | 显示全部楼层
是的参考了过些别人,但还是有很多还是多原创的。思路借用过ZLG的,看过很多GUI比如ucGUI,流明图形化库,微芯的GUI,这些都去了解过。总觉得有些不合我的要求。这些都采用了消息循环处理,功能强大但占用资源多。在小型点阵LCD中大都不会有触摸屏,这种应用中这的方案自认为比较方便。当初的目的就是为了这类程序做个通用微型界面操作。

出0入0汤圆

发表于 2009-12-10 19:10:12 | 显示全部楼层
不错,顶下!

出0入0汤圆

发表于 2009-12-10 19:34:54 | 显示全部楼层
MARK

出0入0汤圆

发表于 2009-12-10 22:27:07 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-12-10 22:44:02 | 显示全部楼层
很好,顶下!

出0入0汤圆

发表于 2009-12-10 23:24:40 | 显示全部楼层
PSP of mark

出0入0汤圆

发表于 2009-12-21 22:31:08 | 显示全部楼层
和zlg-gui的很像

出0入0汤圆

发表于 2009-12-22 01:06:39 | 显示全部楼层
mARK

出0入0汤圆

发表于 2009-12-22 08:20:00 | 显示全部楼层
学习一下啊。谢。

出0入0汤圆

发表于 2010-1-1 13:59:40 | 显示全部楼层
I love

出0入0汤圆

发表于 2010-1-1 15:30:28 | 显示全部楼层
顶GUI

出0入0汤圆

发表于 2010-1-1 17:11:00 | 显示全部楼层
MARK!!!!

出0入0汤圆

发表于 2010-1-1 18:14:09 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-1-1 20:20:27 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-1-1 23:23:33 | 显示全部楼层
好帖,留着以后做界面用,以前的一次界面玩惨了

出0入0汤圆

发表于 2010-1-1 23:30:09 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-1-2 08:26:53 | 显示全部楼层
mrak

出0入0汤圆

发表于 2010-1-2 09:39:09 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-1-2 23:13:50 | 显示全部楼层
记号

出0入0汤圆

发表于 2010-1-3 20:09:28 | 显示全部楼层
楼主可以公布一个测试的工程文件吗

出0入0汤圆

发表于 2010-1-3 21:51:26 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-1-3 21:53:29 | 显示全部楼层
顶你~~

出0入0汤圆

发表于 2010-2-4 23:22:48 | 显示全部楼层
.

出0入0汤圆

发表于 2010-2-4 23:30:11 | 显示全部楼层
MARK!GUI!

出0入0汤圆

发表于 2010-2-5 07:57:03 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-2-5 08:11:33 | 显示全部楼层
谢谢楼主,mark

出0入0汤圆

发表于 2010-2-5 08:22:56 | 显示全部楼层
mark!

出0入0汤圆

发表于 2010-2-5 09:14:10 | 显示全部楼层
好东西mark

出0入0汤圆

发表于 2010-2-6 12:53:45 | 显示全部楼层
mark!

出0入0汤圆

发表于 2010-2-6 21:52:18 | 显示全部楼层
个人认为这不能称之为GUI,是个菜单的框架,跟下面的这个相似,当然也可以认为是另外一种思路的实现
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=798580&bbs_page_no=1&search_mode=3&search_text=liandao&bbs_id=9999
"一个占用内存极少的菜单系统的实现"
当时就是在51的128BYTE的内存下实现的。
演示+文档+源代码
。。。

Demo (原文件名:menu.gif)

出0入0汤圆

发表于 2011-5-20 15:56:19 | 显示全部楼层
附件下载不了                       
                       
       

出0入0汤圆

发表于 2011-5-20 16:15:24 | 显示全部楼层
mark!~

出0入0汤圆

发表于 2011-10-8 14:02:09 | 显示全部楼层
MARK!!!!!

出0入0汤圆

发表于 2011-10-9 09:38:35 | 显示全部楼层
楼主用的是不是ST7920控制的液晶模块?
头像被屏蔽

出0入0汤圆

发表于 2012-10-24 16:09:09 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2012-10-24 16:29:31 | 显示全部楼层
这个好啊

出0入0汤圆

发表于 2012-12-5 01:37:44 | 显示全部楼层
感谢了,看看再说

出0入0汤圆

发表于 2013-4-7 17:14:33 | 显示全部楼层

谢谢楼主,mark

出0入0汤圆

发表于 2013-4-22 22:44:53 | 显示全部楼层
需要备用

出0入0汤圆

发表于 2013-4-22 23:07:15 | 显示全部楼层
学习学习,有没有版本更新

出0入0汤圆

发表于 2013-6-17 23:11:49 | 显示全部楼层
MARK,这个做单片机简单控制时有用

出0入0汤圆

发表于 2013-6-17 23:14:53 | 显示全部楼层
顶你~~

出0入0汤圆

发表于 2013-6-23 21:25:14 来自手机 | 显示全部楼层
好东西 留用

出0入0汤圆

发表于 2013-6-23 21:29:46 | 显示全部楼层
感谢楼主的共享

出0入0汤圆

发表于 2013-6-23 22:01:45 | 显示全部楼层
好东西

出0入0汤圆

发表于 2013-9-1 15:37:04 | 显示全部楼层
学过了……

出0入0汤圆

发表于 2013-9-1 16:49:40 | 显示全部楼层
非常有用,顶一下!

出0入0汤圆

发表于 2013-9-1 19:02:25 来自手机 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2018-9-23 09:10:59 | 显示全部楼层
学习了,谢谢
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 17:32

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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