最近 这几天利用一点时间在Cookie上做了个菜单系统的框架,用的东西很常见——12864,然后拿几个电阻串起来,在cookie的一个模拟口上弄了4个按键。先看效果吧:

 

做这个的过程做了3件事:

一是修改、补充了u1701的库。u1701的库在https://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个按键。这个做了个驱动,这样大家都可以用了,地址在https://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。

第三就是做字符菜单的控制,在这里:https://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里才能看到。