谢谢分享。
一直都是用的第一种的方法写的菜单,很方便,能写N多层也能很方便的在各个菜单界面跳转。
正好 ...
请问你用第一种方法时,有没有实现通过按键输入设置参数的功能? lklhzu 发表于 2015-3-3 15:40
请问你用第一种方法时,有没有实现通过按键输入设置参数的功能?
设置参数提供几个选项供用户选择而不是用键盘输入的方法实现的,因为设置的参数很简单,可以预先列出来让用户选择。 creep 发表于 2015-3-3 15:48
设置参数提供几个选项供用户选择而不是用键盘输入的方法实现的,因为设置的参数很简单,可以预先列出来让 ...
好的,我的要设置时间、日期等参数,从矩阵键盘输入,正头疼呢,不知从何下手! lklhzu 发表于 2015-3-3 15:51
好的,我的要设置时间、日期等参数,从矩阵键盘输入,正头疼呢,不知从何下手! ...
我设置时间是通过3个按键实现的,UP,DOWN,OK,上下按键实现加1减1,OK按键确认.通过UP,DOWN,在时分秒之间转换选择。
如果是矩阵键盘也可以实现直接输入吧,这样应该更简单。 creep 发表于 2015-3-3 15:57
我设置时间是通过3个按键实现的,UP,DOWN,OK,上下按键实现加1减1,OK按键确认.通过UP,DOWN,在时分秒之 ...
请教下,通过按键输入参数的话需要修改哪些函数?在不影响菜单结构的前提下怎样实现数据的动态输入和显示?兄台能否只把按键参数设置部分的代码或框架供参考下。 lklhzu 发表于 2015-3-3 16:07
请教下,通过按键输入参数的话需要修改哪些函数?在不影响菜单结构的前提下怎样实现数据的动态输入和显示 ...
我只是简单的实现了时间日期的调整并不是直接输入,所以可能和你的情况不同。
这个菜单结构的每个按键都对应了相应的函数,你根据自己的需要去修改相应的按键按下的函数,比如某个按键按下是输入1,该函数就实现输入显示1到LCD上。 creep 发表于 2015-3-3 16:21
我只是简单的实现了时间日期的调整并不是直接输入,所以可能和你的情况不同。
这个菜单结构的每个按键都 ...
好的,3Q,我摸索着试试! {:handshake:}思路学习了,感觉很不错 mark,同行,顶一个。 学习学习 laujc 发表于 2015-2-11 10:16
很想知道界面是用什么软件设计的
niosII fpga软核 顶起~~~~~~~ feilongdz 发表于 2014-10-12 16:33
不太明白
头像碉堡了。 标记,谢谢分享~ {:lol:}不太懂。。 {:handshake:}mark一下:液晶多级菜单实现加强版 收藏着。。 rootxie 发表于 2014-10-17 12:39
第一个也好实现啊,通过传参数,参数有类型 按键类型 触摸类型 另外还有事件类型同时附上值即可 ...
楼主通过传参数,可以用代码示例一下吗? 本帖最后由 chen849928055 于 2017-2-16 10:14 编辑
其它的界面都是这样写的,然后主函数只要这样就行了:
TBasicWindow *CurrentWin = &MainWin;
//如果有两个页面,这里要这样写吗?TBasicWindow *CurrentWin = &SecondWin;
void main(void)\
{
TKEY_EVENT event;
while(1)
{
GetKey(&event);
CurrentWin->key_process(&event);
}
} chen849928055 发表于 2017-2-16 10:10
其它的界面都是这样写的,然后主函数只要这样就行了:
TBasicWindow *CurrentWin = &MainWin;
//如果有 ...
是的 每一个界面都有一个.c文件
void MainDraw();
TKEY MainKeyMap(unsigned int x, unsigned int y);
void MainKeyDisplay(TKEY event, unsigned short int TouchStatus);
void MainKeyProcess(TKEY_EVENT *event);
TBasicWindow MainWin = {
draw: MainDraw,
key_map: MainKeyMap,
key_display:MainKeyDisplay,
key_process: MainKeyProcess,
};
每个界面都有共同的属性,界面显示在draw里,界面按键坐标在key_map里,界面按键效果(弹起按下)在key_display里,按键处理在key_process里,当然界面切换也在key_process里,如下。
void MainKeyProcess(TKEY_EVENT *event)
{
static TKEY PressKey = KEY_NULL;
switch(event->key){
case MAIN_PATIENT:
if(event->TouchStatus){
PressKey = MAIN_PATIENT;
MainKeyDisplay(PressKey, DOWN);
}
else{
MainKeyDisplay(PressKey, UP);
if(PressKey != MAIN_PATIENT) break;
PressKey = KEY_NULL;
CurrentWin = &PatientWin;
CurrentWin->draw();
}
break;
}
} chun2495 发表于 2017-2-16 16:30
是的 每一个界面都有一个.c文件
每一个界面又有一个.C文件,两个界面时该怎么写,没看到他们怎么联系的
typedef struct{
u8 KeyStateIndex; //µ±Ç°×´Ì¬Ë÷ÒýºÅ
u8 KeyUpState; //°´ÏÂ"ÏòÉÏ"¼üʱתÏòµÄ״̬Ë÷ÒýºÅ
u8 KeyDnState; //°´ÏÂ"ÏòÏÂ"¼üʱתÏòµÄ״̬Ë÷ÒýºÅ
u8 KeyPoState; //°´ÏÂ"µçÔ´"¼üʱתÏòµÄ״̬Ë÷ÒýºÅ
u8 KeyBkState; //°´ÏÂ"·µ»Ø"¼üʱתÏòµÄ״̬Ë÷ÒýºÅ
u8 KeyOkState; //°´ÏÂ"È·ÈÏ"¼üʱתÏòµÄ״̬Ë÷ÒýºÅ
u8 KeySetState; //°´ÏÂ"×éºÏ"¼üʱתÏòµÄ״̬Ë÷ÒýºÅ
u8 KeyLState; //°´ÏÂ"³¤°´"¼üʱתÏòµÄ״̬Ë÷ÒýºÅ
void (*CurrentOperate)(); //µ±Ç°×´Ì¬Ó¦¸ÃÖ´ÐеŦÄܲÙ×÷
} KbdTabStruct;
KbdTabStruct KeyTab={
// |-----------> Index
// | Down
// | |Up
// | | |Power
// | | | |Back
// | | | | |Enter
// | | | | | |SETUP
// | | | | | | |K_Long
// | | | | | | | | |--->¹¦Äܺ¯Êý
{0, 34, 34,34, 34,34, 34, 34,InitDisplay_0}, // 待机界面
{1,3,3,2, 34, 12, 145, 6,MainInterface_3}, //主界面
{2, 33, 33,2, 33, 33, 33, 33,DspMenuOFF_4}, //关机界面
}
这种方式时我还知道界面之间怎么联系的,你那个没看出从一个界面怎么跳转到另一个界面的. chen849928055 发表于 2017-2-16 17:47
每一个界面又有一个.C文件,两个界面时该怎么写,没看到他们怎么联系的
typedef struct{
u8 KeySta ...
switch(event->key){
case MAIN_PATIENT:
if(event->TouchStatus){
PressKey = MAIN_PATIENT;
MainKeyDisplay(PressKey, DOWN);
}
else{
MainKeyDisplay(PressKey, UP);
if(PressKey != MAIN_PATIENT) break;
PressKey = KEY_NULL;
CurrentWin = &PatientWin;
CurrentWin->draw();
}
break;
}
红字表示将Patient界面赋值给了当前界面,然后显示Patient界面的Draw,这就是界面的跳转呀,因为在跳转时第一个动作都是重绘(draw)这个界面。 chun2495 发表于 2017-2-17 10:20
switch(event->key){
case MAIN_PATIENT:
if(event->TouchStatus){
void MainKeyProcess(TKEY_EVENT *event)你这个按键处理函数,是放在while里周期性调用的吧.这个函数还要显示,放中断里估计不行,显示花的时间有点久
chen849928055 发表于 2017-2-17 10:37
void MainKeyProcess(TKEY_EVENT *event)你这个按键处理函数,是放在while里周期性调用的吧.这个函数还要 ...
对 我用的是触摸屏的扫描方式 chun2495 发表于 2017-2-17 10:56
对 我用的是触摸屏的扫描方式
你的触摸那一块用的什么芯片,做了长按组合按连击之类的处理吧. chen849928055 发表于 2017-2-17 11:08
你的触摸那一块用的什么芯片,做了长按组合按连击之类的处理吧.
电容屏,IIC接口的,只是单击处理。 chun2495 发表于 2017-2-16 16:30
是的 每一个界面都有一个.c文件
TBasicWindow *CurrentWin = &MainWin;
TBasicWindow *CurrentWin = &SecondWin;
TBasicWindow *CurrentWin = &ThirdWin;
TBasicWindow *CurrentWin = &FourthWin;
假如有四个界面以上这四句是都写在主函数这里,还是分别写在各个界面的.c文件里
void main(void)\
{
TKEY_EVENT event;
while(1)
{
GetKey(&event);
CurrentWin->key_process(&event);
}
} chen849928055 发表于 2017-2-17 16:26
TBasicWindow *CurrentWin = &MainWin;
TBasicWindow *CurrentWin = &SecondWin;
TBasicWindow *Curren ...
1,主函数里只定义一个 CurrentWin,然后开机后的第一个界面赋值给他 TBasicWindow *CurrentWin = &MainWin;
其他界面(.c)是没有current的。
2,界面切换时,只是将其他的界面(.c)赋值给current界面就行了
CurrentWin = &SecondWin;
CurrentWin->draw();
3,每个界面(.c)定义自己的内容
TBasicWindow MainWin = {
draw: MainDraw,
key_map: MainKeyMap,
key_display:MainKeyDisplay,
key_process: MainKeyProcess,
};
4,定义一个source.h文件,专门包含这些界面的名称,然后每个界面(.c)都能互相调用了。
extern TBasicWindow MainWin;
extern TBasicWindow SecondWin;
extern TBasicWindow ThirdWin;
...
chun2495 发表于 2017-2-17 17:20
1,主函数里只定义一个 CurrentWin,然后开机后的第一个界面赋值给他 TBasicWindow *CurrentWin = &MainW ...
哦哦!明白了,谢谢 chun2495 发表于 2017-2-17 17:20
1,主函数里只定义一个 CurrentWin,然后开机后的第一个界面赋值给他 TBasicWindow *CurrentWin = &MainW ...
你触摸驱动IC使用的FT5X06系列的吗?需要向厂家要一些IC的注册信息之类的吗?又没什么注意事项,这类片子厂家一般提供驱动demo不. chen849928055 发表于 2017-2-20 10:46
你触摸驱动IC使用的FT5X06系列的吗?需要向厂家要一些IC的注册信息之类的吗?又没什么注意事项,这类片子厂 ...
我用的是无驱动的电容屏 接口为IIC,直接按照格式读取坐标就行。 楼主,你的菜单程序是不是每个界面都有个KeyProcess函数,而每个界面刷新函数draw都是在KeyProcess里被调用的,那你定义的结构体的draw函数就没多大意义 NIC 发表于 2017-2-28 08:58
楼主,你的菜单程序是不是每个界面都有个KeyProcess函数,而每个界面刷新函数draw都是在KeyProcess里被调用 ...
draw只是在跳转界面时显示一次的,类似于初始化,然后就等待触发事件。keyprocess里面的draw是:跳转到其他界面时先draw一下,
CurrentWin = &ManagementWin;
CurrentWin->draw();
这是静态调用界面的,如果是动态调用,只需要CurrentWin = &ManagementWin;就行了。 我也不太明白 xuekcd 发表于 2017-2-28 10:24
我也不太明白
面向对象的思想,界面看成一个对象,他们的共同属性有draw keyprocess keymap等 mark收藏 get_coord(c);
if(c && !send)//楼主这里有触摸按下 你这里的 !send什么意思
{
X = c;
Y = c;
TouchStatus = DOWN;
}
if(!c) //这里没按键按下了,还把上一次的坐标保存下来做什么用的
{
X = c;
Y =c;
TouchStatus = UP;
} chen849928055 发表于 2017-4-13 15:44
get_coord(c);
if(c && !send)//楼主这里有触摸按下 你这里的 !send什么意思
{
send 是一个标志 对整体没意义 不用关心
点击一个按键有按下 移动 弹起,如果进行了移动操作,那就需要记录第一次的按下坐标,按下和弹起坐标相同才能触发事件。 chun2495 发表于 2017-4-13 16:23
send 是一个标志 对整体没意义 不用关心
点击一个按键有按下 移动 弹起,如果进行了移动操作,那就需要记 ...
你这里没看到按下和弹起的坐标作比较 chen849928055 发表于 2017-4-13 16:34
你这里没看到按下和弹起的坐标作比较
在 这里
void MainKeyProcess(TKEY_EVENT *event)
{
static TKEY PressKey = KEY_NULL;//记录第一次按下的按键
switch(event->key){
case MAIN_REVIEW:
if(event->TouchStatus){//按键按下
PressKey = MAIN_REVIEW;//记录第一次按下触摸屏的按键
MainKeyDisplay(PressKey, DOWN);//按键按下
}
else{//按键弹起
MainKeyDisplay(PressKey, UP);//弹起先前一次按下的按键,不一定是MAIN_PATIENT
if(PressKey != MAIN_REVIEW) break;//两次按键不一致则不执行
//begin (按下和弹起都是PATIENT,则执行PATIENT的按键处理)
CurrentWin = &ManagementWin;
CurrentWin->draw();
//end
}
break;
...
} chun2495 发表于 2017-4-13 16:41
在 这里
void MainKeyProcess(TKEY_EVENT *event)
{
是的,之前看了,没想到按下弹起坐标作比较.如果长按 ,连击的操作在这上面还好扩展不 chen849928055 发表于 2017-4-13 16:51
是的,之前看了,没想到按下弹起坐标作比较.如果长按 ,连击的操作在这上面还好扩展不 ...
可以呀 底层都是自己写的 想怎么操作都可以 本帖最后由 chen849928055 于 2017-4-13 17:39 编辑
chun2495 发表于 2017-4-13 16:55
可以呀 底层都是自己写的 想怎么操作都可以
好的,还有那种滑动操作,上滑"+",下滑"-";滑动判断是不是下一个坐标大于上一个坐标几个像素点就认为是滑动,每滑动几个像素点就更新一次上一个坐标值.没见过别人滑动怎么处理的,不知道我这思路对不?
突然发现FT5306这个寄存器可以读值来确定是否是滑动的值,来确定朝哪里滑动的
This register describes the gesture of a valid touch.
AddressBit AddressRegister NameDescription
Op,01h7:0Gesture ID Gesture ID
0x10 Move UP
0x14 Move Left
0x18 Move Down
0x1C Move Right
0x48 Zoom In
0x49 Zoom Out
0x00 No Gesture
chen849928055 发表于 2017-4-13 17:04
好的,还有那种滑动操作,上滑"+",下滑"-";滑动判断是不是下一个坐标大于上一个坐标几个像素点就认为是滑动 ...
要是能读芯片寄存器来确定那就更简单了,getkey里直接调用就行,在
typedef struct _key_{
TKEY key;
unsigned int TouchStatus;
}TKEY_EVENT;
添加unsigned int Move;通过按下 弹起 临时值来判断Move
keyprocess里做相应处理就行。 chun2495 发表于 2017-4-13 18:04
要是能读芯片寄存器来确定那就更简单了,getkey里直接调用就行,在
添加unsigned int Move;通过按下 弹 ...
不用添加unsigned int Move吧,直接TouchStatus 对应UPDOWNMOVE好了 chen849928055 发表于 2017-4-13 18:24
不用添加unsigned int Move吧,直接TouchStatus 对应UPDOWNMOVE好了
按下弹起TouchStatus 还是有的 你是在弹起时才能判断滑动 chun2495 发表于 2017-4-14 09:31
按下弹起TouchStatus 还是有的 你是在弹起时才能判断滑动
滑动不是在没弹起时就可以判断了吗?弹起时滑动都结束了,如果要是做滑动效果,在滑的过程中,相应的程序就要有响应的,比如你上滑数字逐渐变大,下滑数字逐渐变小 chen849928055 发表于 2017-4-14 14:12
滑动不是在没弹起时就可以判断了吗?弹起时滑动都结束了,如果要是做滑动效果,在滑的过程中,相应的程序就要 ...
嗯 两种方式都存在,具体看你的情况来写 本帖最后由 chen849928055 于 2017-4-24 13:42 编辑
chun2495 发表于 2017-2-16 16:30
是的 每一个界面都有一个.c文件
楼主你好!有两个问题问你一下:
1..\MenuWin\menu.c(61): warning:#940-D: missing return statement at end of non-void function "MainKeyMap"
自己一直了下,发现有这个警告,自己搞不定了.MainKeyMap这个函数没看到在哪里调用的?警告是不是和这个有关系?
TKEY MainKeyMap(unsigned int x, unsigned int y)
{
if((x > 95*0&& x <= 95*0) && (y > 685 && y < 790)) return MAIN_REVIEW;
else if((x > 95*1&& x <= 95*1) && (y > 685 && y < 790)) return MAIN_PRINT;
else if((x > 95*2&& x <= 95*2) && (y > 685 && y < 790)) return MAIN_SAVE;
else return KEY_NULL;
}这里是不是要改为这样
2.main.c(56): error:#20: identifier "CurrentWin" is undefined,CurrentWin在menu.c文件里定义了,在main.c文件里还需要
怎么定义. chen849928055 发表于 2017-4-24 13:32
楼主你好!有两个问题问你一下:
1..\MenuWin\menu.c(61): warning:#940-D: missing return statement at ...
1, 在最后需要return KEY_NULL;
2,不要在menu.c中定义currentwin,只在main里定义,然后在extern_window_declare.h中extern出去其他界面直接引用就行了。 本帖最后由 chen849928055 于 2017-4-24 14:04 编辑
chun2495 发表于 2017-4-24 13:41
1, 在最后需要return KEY_NULL;
2,不要在menu.c中定义currentwin,只在main里定义,然后在extern_windo ...
TKEY MainKeyMap(unsigned int x, unsigned int y)
{
if((x > 95*0&& x <= 95*0) && (y > 685 && y < 790)) return MAIN_REVIEW;
if((x > 95*1&& x <= 95*1) && (y > 685 && y < 790)) return MAIN_PRINT;
if((x > 95*2&& x <= 95*2) && (y > 685 && y < 790)) return MAIN_SAVE;
return KEY_NULL;
}这里是不是要改为这样
改好了,感谢! chen849928055 发表于 2017-4-24 13:52
TKEY MainKeyMap(unsigned int x, unsigned int y)
{
if((x > 95*0&& x685 && y < 790)) return...
1,对
2,TBasicWindow *CurrentWin = &MainWin;你用source.h引用就行了
extern TBasicWindow MainWin;
extern TBasicWindow *CurrentWin; chun2495 发表于 2017-4-24 14:04
1,对
2,TBasicWindow *CurrentWin = &MainWin;你用source.h引用就行了
extern TBasicWindow MainWin;
void MainKeyDisplay(TKEY event, unsigned short int TouchStatus);你的这个函数做的什么功能?跟随按键操作变化的显示内容吗? chen849928055 发表于 2017-4-24 14:13
void MainKeyDisplay(TKEY event, unsigned short int TouchStatus);你的这个函数做的什么功能?跟随按键 ...
是 chun2495 发表于 2017-4-24 14:21
是
显示界面后,再刷新就刷新一页上有变化的地方把,你这里是在哪个函数处理的,不是每次刷新把一整页全刷新了吧 chen849928055 发表于 2017-4-24 14:28
显示界面后,再刷新就刷新一页上有变化的地方把,你这里是在哪个函数处理的,不是每次刷新把一整页全刷新了 ...
在keyprocess里处理 刷新局部,页刷新实在切换页时的draw里做的 chun2495 发表于 2017-4-24 14:31
在keyprocess里处理 刷新局部,页刷新实在切换页时的draw里做的
keyprocess这里的局部是不是指跟着按键操作刷新的?如果主页显示实时的温度值,温度变化,实时显示的数字就变化,这种变化可在keyprocess里有处理 chen849928055 发表于 2017-4-24 14:46
keyprocess这里的局部是不是指跟着按键操作刷新的?如果主页显示实时的温度值,温度变化,实时显示的数字就 ...
是的 别忘了做出效果给我看看{:smile:} chun2495 发表于 2017-4-24 14:58
是的 别忘了做出效果给我看看
好的,做出效果发你看,谢谢你的耐心指导... 感觉你的ASCII码的字符好圆滑,怎么做到的 chen849928055 发表于 2017-4-24 17:00
感觉你的ASCII码的字符好圆滑,怎么做到的
PS水平多高 界面就有多漂亮 chun2495 发表于 2017-4-24 17:26
PS水平多高 界面就有多漂亮
你时间的数字不是可变化的吗?应该是刷新的字符吧,我现在其他的都是刷图片,希望数字刷字符,不然要截图的数字太多了 chen849928055 发表于 2017-4-24 17:46
你时间的数字不是可变化的吗?应该是刷新的字符吧,我现在其他的都是刷图片,希望数字刷字符,不然要截图的数 ...
对呀 ,点阵做出来显示的时候带上背景颜色就行了。 chun2495 发表于 2017-4-25 09:08
对呀 ,点阵做出来显示的时候带上背景颜色就行了。
字摸4软件生成的字符感觉锯齿好严重,看着你这字符挺圆滑的,你这字符没做类似win的抗锯齿化处理吗? chen849928055 发表于 2017-4-25 09:12
字摸4软件生成的字符感觉锯齿好严重,看着你这字符挺圆滑的,你这字符没做类似win的抗锯齿化处理吗? ...
ps做的 不只是点阵取模 chun2495 发表于 2017-4-25 09:35
ps做的 不只是点阵取模
1.ps做的不就是是刷新的图片数字1到9吗?我就知道这个方法刷新的字符很圆滑,还有就只是显示点阵取模的字符,有点粗糙.
2.MainKeyDisplay(PressKey, DOWN);这个函数给看一下,看看这里面怎么处理的 chen849928055 发表于 2017-4-25 11:36
1.ps做的不就是是刷新的图片数字1到9吗?我就知道这个方法刷新的字符很圆滑,还有就只是显示点阵取模的字符 ...
void MainKeyDisplay(TKEY event, unsigned short int TouchStatus)
{
switch(event){
case MAIN_PATIENT :ButtonMenu(520, 160*0, LanguageTranslate("患者"), COLOR_WHITE, TouchStatus); break;
case MAIN_REVIEW:ButtonMenu(520, 160*1, LanguageTranslate("查看"),COLOR_WHITE, TouchStatus); break;
default: break;
}
} 触摸屏多级菜单! 先收藏,有空好好学习,谢谢楼主的分享!! 先收藏,有时间研究一下,谢谢 收藏下,make~~~ mark,以后备用 LCD菜单MARK
页:
1
[2]