OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7742|回复: 8

请教ucGUI显示问题

[复制链接]

5

主题

31

帖子

1

精华

高级会员

Rank: 4

积分
865
金钱
865
注册时间
2013-10-13
在线时间
73 小时
发表于 2014-5-23 17:17:39 | 显示全部楼层 |阅读模式
5金钱
本人在stm32的MINI板上移植了GUI3.9,本人初学ucGUI。创建了 3个按钮,一个ListBox,一个Frame,遇到了一个比较怪的现象,每次初始化屏幕显示效果都不太一样,有的时候会是正常的,有的时候屏幕就花了,图片为证,复位后屏幕正常的概率较低,比如初始化10次,可能只有2次或者3次显示是正常的,试请教这是什么原因?


[mw_shl_code=c,true]这个是main.c的所有函数 #include "sys.h" #include "usart.h" #include "delay.h" #include "led.h" #include "timer.h" #include "gui.h" #include "touch.h" #include "WM.h" #include "button.h" #include "progbar.h" #include "CHECKBOX.h" #include "listbox.h" #include "framewin.h" // ----------------------------------------------- // const GUI_ConstString table[]={"english","Deutsch","Franch","Japanese","Italian",NULL}; #define countof(Array)(sizeof(Array)/sizeof(Array[0])) // ----------------------------------------------- // GUI_PID_STATE STATE; //该变量为GUI触屏的x y位置存储坐标(内部已将其换算为屏幕坐标了) int bar; PROGBAR_Handle hBar; BUTTON_Handle hButton,hbut1,hbut2;//按钮句柄 CHECKBOX_Handle hbox; int temp1,temp2,temp3,temp4; FRAMEWIN_Handle hFrame; BUTTON_Handle hButton1; BUTTON_Handle hButton2; // ----------------------------------------------- // void Progbar(void) { GUI_DispStringAt("PROGRESS BAR",100,0); hBar = PROGBAR_Create(100,20,100,20,WM_CF_SHOW); PROGBAR_SetBarColor(hBar,0,GUI_BLUE); PROGBAR_SetBarColor(hBar,1,GUI_YELLOW); } // ----------------------------------------------- // // ----------------------------------------------- // void Listbox(void) { int i; int Entries = countof(table)-1; LISTBOX_Handle hlist; int ySize = GUI_GetYSizeOfFont(&GUI_Font13B_1)*Entries; hlist = LISTBOX_Create(table,10,10,60,ySize+10,WM_CF_SHOW); for(i=0;i<Entries-1;i++) { GUI_Delay(500); LISTBOX_IncSel(hlist); WM_Exec(); } for(i=0;i<Entries-1;i++) { GUI_Delay(500); LISTBOX_DecSel(hlist); WM_Exec(); } } // // void Button_Init(void) { hButton=BUTTON_Create(10,100,40,20,GUI_ID_OK,WM_CF_SHOW);//创建一个按钮 hbut1=BUTTON_Create(10,120,40,20,2,WM_CF_SHOW);//创建一个按钮 hbut2=BUTTON_Create(10,140,40,20,3,WM_CF_SHOW);//创建一个按钮 BUTTON_SetText(hButton, "Click"); BUTTON_SetText(hbut1, "Click"); BUTTON_SetText(hbut2, "Click"); } // // void MessageBox(void) { WM_SetBkWindowColor(GUI_WHITE); GUI_MessageBox("aa","bb",GUI_MESSAGEBOX_CF_MOVEABLE); } // // void Touch_Process(void) { // TIM3->CR1&=0xfe; //关闭定时器3 GUI_TOUCH_GetState(&STATE); GUI_DispStringAt("x:", 0, 200); GUI_DispDec(STATE.x, 3); GUI_DispStringAt("y:", 0, 250); GUI_DispDec(STATE.y, 3); if (STATE.Pressed == 1) { GUI_CURSOR_SetPosition(STATE.x,STATE.y); GUI_CURSOR_Show(); } // TIM3->CR1|=0x01; //使能定时器3 } // // void Button_Process(void) { switch( GUI_GetKey()) { case 1:if(temp1==1) { temp1=0; BUTTON_SetText(hButton,"yes"); } else { temp1=1; BUTTON_SetText(hButton,"no"); } break; case 2:if(temp2==1) { temp2=0; BUTTON_SetText(hbut1,"yes"); } else { temp2=1; BUTTON_SetText(hbut1,"no"); } break; case 3:if(temp3==1) { temp3=0; BUTTON_SetText(hbut2,"yes"); } else { temp3=1; BUTTON_SetText(hbut2,"no"); } break; case 4: if(temp4==1) { temp4=0; BUTTON_SetText(hButton1, "Open LED"); } else { temp4=1; BUTTON_SetText(hButton1, "Close LED"); } break; case 5: break; } } // void Frame(void) { hFrame = FRAMEWIN_Create("test", 0, WM_CF_SHOW, 80, 150, 80, 100); GUI_Delay(10); hButton1 = BUTTON_CreateAsChild(10, 20, 60, 30, hFrame, 4, WM_CF_SHOW); BUTTON_SetText(hButton1, "1"); GUI_Delay(10); hButton2 = BUTTON_CreateAsChild(10, 60, 60, 30, hFrame, 5, WM_CF_SHOW); BUTTON_SetText(hButton2, "2"); GUI_Delay(10); // WM_Paint(hButton2); } // // void Frame_Process(void) { } // // int main(void) { Stm32_Clock_Init(9);//系统时钟设置 delay_init(72); //延时初始化 uart_init(72,9600); //串口1初始化 LED_Init(); Timerx_Init(71,1000); StartTouch(); GUI_Init(); GUI_SetBkColor(GUI_WHITE); GUI_SetColor(GUI_BLACK); GUI_Clear(); GUI_SetFont(&GUI_Font8x16); Button_Init(); // Progbar(); Listbox(); // MessageBox(); Frame(); while(1) { // PROGBAR_SetValue(hBar,bar/10); GUI_Delay(10); Touch_Process(); Button_Process(); } } 以下是定时器里的程序,用于刷新触摸屏的坐标 #include "timer.h" #include "led.h" #include "gui.h" ////////////////////////////////////////////////////////////////////////////////// //本程序只供学习使用,未经作者许可,不得用于其它任何用途 //Mini STM32开发板 //通用定时器 驱动代码 //正点原子@ALIENTEK //技术论坛:www.openedv.com //修改日期:2010/12/03 //版本:V1.0 //版权所有,盗版必究。 //Copyright(C) 正点原子 2009-2019 //All rights reserved ////////////////////////////////////////////////////////////////////////////////// extern int bar; extern int temp4; //定时器3中断服务程序 void TIM3_IRQHandler(void) { if(TIM3->SR&0X0001)//溢出中断 { // LED1=!LED1; GUI_TOUCH_Exec(); bar+=1; if(bar>=1000) { bar=0; } if(temp4==1) { if(bar%100==0) { LED0=~LED0; } } else { LED0=1; } } TIM3->SR&=~(1<<0);//清除中断标志位 } //通用定时器中断初始化 //这里时钟选择为APB1的2倍,而APB1为36M //arr:自动重装值。 //psc:时钟预分频数 //这里使用的是定时器3! void Timerx_Init(u16 arr,u16 psc) { RCC->APB1ENR|=1<<1;//TIM3时钟使能 TIM3->ARR=arr; //设定计数器自动重装值//刚好1ms TIM3->SC=psc; //预分频器7200,得到10Khz的计数时钟 //这两个东东要同时设置才可以使用中断 TIM3->DIER|=1<<0; //允许更新中断 TIM3->DIER|=1<<6; //允许触发中断 TIM3->CR1|=0x01; //使能定时器3 MY_NVIC_Init(1,3,TIM3_IRQChannel,2);//抢占1,子优先级3,组2 } //TIM3 PWM部分 //正点原子@ALIENTEK //2010/6/2 //PWM输出初始化 //arr:自动重装值 //psc:时钟预分频数 void PWM_Init(u16 arr,u16 psc) { //此部分需手动修改IO口设置 RCC->APB1ENR|=1<<1; //TIM3时钟使能 GPIOA->CRH&=0XFFFFFFF0;//PA8输出 GPIOA->CRH|=0X00000004;//浮空输入 GPIOA->CRL&=0X0FFFFFFF;//PA7输出 GPIOA->CRL|=0XB0000000;//复用功能输出 GPIOA->ODR|=1<<7;//PA7上拉 TIM3->ARR=arr;//设定计数器自动重装值 TIM3->SC=psc;//预分频器不分频 TIM3->CCMR1|=7<<12; //CH2 PWM2模式 TIM3->CCMR1|=1<<11; //CH2预装载使能 TIM3->CCER|=1<<4; //OC2 输出使能 TIM3->CR1=0x8000; //ARPE使能 TIM3->CR1|=0x01; //使能定时器3 } [/mw_shl_code]




后来调试又发现只要把触摸的定时器关掉就不会花屏了,请问这又是怎么一回事?触摸屏有回调函数得到它的坐标吗?

GUI_Template_V1.4.rar

1.02 MB, 下载次数: 737

最佳答案

查看完整内容[请看2#楼]

回复【5楼】huabit: ---------------------------------回调函数说白了就是一中消息传输机制。回调函数中包含了各种事件以及各种事件的处理方法,只要有一个事件触发了ucgui就会调用回调函数处理该事件。button按下触发事件,按下后要做什么,这个要做什么就是回调函数来处理的。这种方式在ucos ii和蓝牙4.0协议栈中应用的非常多,主要是避免很多函数发生冲突。 ---------------------------------
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2014-4-2
在线时间
1 小时
发表于 2014-5-23 17:17:40 | 显示全部楼层
回复【5楼】huabit:
---------------------------------回调函数说白了就是一中消息传输机制。回调函数中包含了各种事件以及各种事件的处理方法,只要有一个事件触发了ucgui就会调用回调函数处理该事件。button按下触发事件,按下后要做什么,这个要做什么就是回调函数来处理的。这种方式在ucos ii和蓝牙4.0协议栈中应用的非常多,主要是避免很多函数发生冲突。
---------------------------------
回复

使用道具 举报

7

主题

67

帖子

0

精华

初级会员

Rank: 2

积分
156
金钱
156
注册时间
2013-8-24
在线时间
16 小时
发表于 2014-5-23 18:13:18 | 显示全部楼层
干嘛不用回调函数
回复

使用道具 举报

9

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2014-4-2
在线时间
1 小时
发表于 2014-5-23 18:31:05 | 显示全部楼层
使用回调函数处理
回复

使用道具 举报

5

主题

31

帖子

1

精华

高级会员

Rank: 4

积分
865
金钱
865
注册时间
2013-10-13
在线时间
73 小时
 楼主| 发表于 2014-5-23 19:19:54 | 显示全部楼层
回复【2楼】407741522:
---------------------------------
谢谢您的回答,我刚刚入门,不太懂,能否详细解释一下,或者一些参考资料
回复

使用道具 举报

5

主题

31

帖子

1

精华

高级会员

Rank: 4

积分
865
金钱
865
注册时间
2013-10-13
在线时间
73 小时
 楼主| 发表于 2014-5-23 19:20:03 | 显示全部楼层
回复【3楼】wqflyy:
---------------------------------
我刚刚入门,不太懂,能否详细解释一下,或者一些参考资料
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-5-23 22:22:58 | 显示全部楼层
可能会有干扰吧,呵呵,不太懂ucGUI,帮顶.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

7

主题

67

帖子

0

精华

初级会员

Rank: 2

积分
156
金钱
156
注册时间
2013-8-24
在线时间
16 小时
发表于 2014-5-26 18:13:22 | 显示全部楼层
回复【4楼】huabit:
---------------------------------
不好意思,刚刚看到,你多看看ucgui的用户手册吧,那里面很多东西
回复

使用道具 举报

2

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2014-7-11
在线时间
0 小时
发表于 2014-7-28 16:00:54 | 显示全部楼层
帮顶,正好在学习ucGUI
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-4 15:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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