TA的每日心情 | 郁闷 2024-10-28 10:11 |
---|
签到天数: 1703 天 连续签到: 1 天 [LV.Master]伴坛终老
|
本帖最后由 nemon 于 2013-3-27 19:49 编辑
最近 这几天利用一点时间在Cookie上做了个菜单系统的框架,用的东西很常见——12864,然后拿几个电阻串起来,在cookie的一个模拟口上弄了4个按键。先看效果吧:
做这个的过程做了3件事:
一是修改、补充了u1701的库。u1701的库在http://www.coocox.org/driver_comp/uc1701-single-lcd-controller-driver-c636.html?mc=4&sc=48,用它驱动12864时注意到左边总是少2列像素,后来看驱动代码,把所有的129都改成了127,解决了这个问题。另外,菜单需要用反显的方式表示获得焦点,而u1701库中只有反显1个字符的函数,因此补充了UC1701InverseDispalyStr用于在指定行列显示一串反显字符,定义如下:-
- void UC1701InverseDispalyStr
- (
- unsigned char ucLine,
- unsigned char ucRow,
- char *pcChar
- )
复制代码 第二是用1个模拟口来实现4个按键。这个做了个驱动,这样大家都可以用了,地址在http://www.coocox.org/driver_comp/analogbuttons-c684.html?mc=1&sc=8。注意头文件里定义的analogButtons_Resistances_Number、analogButtons_Resistances_Array分别是电阻个数和电阻值的数组,用法和算法原理见下图:
用的时候先用analogButtonsInit初始化模拟口,然后把前边提到的2个参数喂给函数analogButtonsGetPressedIndex(unsigned int resistances_amount,unsigned int *resistances),就可以取到按下的按键的序号了,注意没有按键按下的话,返回-1。
第三就是做字符菜单的控制,在这里:http://www.coocox.org/driver_comp/charmenu-c685.html?mc=4&sc=24。核心是头文件里的定义,基本能做到代码自明,就不多说了。用法也简单——先准备好存菜单的空间、菜单的结构变量、以及自定义的处理函数:- struct stCosnoleMenu st_CosnoleMenu_buff[13];
- struct stCosnoleMenuRoot stMenu;
- void show_current_menu(struct stCosnoleMenuRoot *stRt);
- void my_command_event(struct stCosnoleMenuRoot *stRt,unsigned int ui_ID);
- void my_submenu_event(struct stCosnoleMenuRoot *stRt,unsigned int ui_ID);
- void my_selected_event(struct stCosnoleMenuRoot *stRt,unsigned int ui_ID);
复制代码 然后初始化:- Cosnole_Menu_Init(&stMenu,st_CosnoleMenu_buff,"back up",my_selected_event,my_command_event,my_submenu_event);//root,id=0
复制代码 再用这个形式向里面添上菜单项:- iCnt=Cosnole_Add_A_Menu(&stMenu,0,0x8,"the 1st menu",MENU_TYPE_COMMAND,MENU_CHECK_TRUE,'1');//1
复制代码 在按下按钮的时候调用对应的菜单函数:- switch(n){
- case -1:
- //do nothing
- break;
- case 0:
- break;
- case 1:
- //key 1
- Cosnole_MenuScorllDown(&stMenu);
- show_current_menu(&stMenu);
- break;
- case 2:
- //key 2
- Cosnole_MenuScorllUp(&stMenu);
- show_current_menu(&stMenu);
- break;
- case 3:
- //key 3
- Cosnole_MenuOnSelected_by_Focus(&stMenu);
- show_current_menu(&stMenu);
- break;
- case 4:
- //key 4
- Cosnole_MenuBackUp(&stMenu);
- show_current_menu(&stMenu);
- break;
- default:
- //do nothing
- break;
- }
复制代码 最后,再补充个福利,为了能比较直观的做好点阵的数组,写了个头文件,不过由于是集成在例子里面的,所以需要安装CoIDE之后,选中了前文提到的3个组件后,在example里才能看到。
|
|