OpenEdv-开源电子网

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

GUI_GetKey() 得不到键值

[复制链接]

9

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2014-3-4
在线时间
0 小时
发表于 2014-7-13 11:26:56 | 显示全部楼层 |阅读模式
5金钱
本来想画一个按钮,按下时显示yes,松开时显示no
按钮按下时有反应
GUI_GetKey() 始终得不到键值,返回值为0,也就无法显示yes和no
求助各位大神!



#include "MY_UI.h"

BUTTON_Handle  hButton_mainmenu[9];

/***** 主菜单 初始化     *****/
void MainMenu_Init()
{
int temp=1;  
int Key=0;
GUI_SetBkColor(GUI_WHITE);
GUI_Clear();
 


hButton_mainmenu[0] = BUTTON_Create(10, 20, 200, 200, GUI_ID_BUTTON0, WM_CF_SHOW); 
BUTTON_SetBkColor(hButton_mainmenu[0],0,GUI_BLUE);   //按钮背景色

if(GUI_GetKey()==GUI_ID_BUTTON0)//按钮按下
        {        
            GUI_SetColor(GUI_BLACK);
            GUI_SetFont(&GUI_Font32B_ASCII);
            if(temp==1)  
          {
              temp=0;
              BUTTON_SetText(hButton_mainmenu[0],"yes");
           }
           else
           {
               temp=1;
               BUTTON_SetText(hButton_mainmenu[0],"no");
            }
        }

Key=GUI_WaitKey(); 

}

实验.rar

1.73 MB, 下载次数: 746

最佳答案

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

回复【7楼】eling13: --------------------------------- 嗯,找到原因了,之前移植触摸屏的驱动有些问题。另外代码改为了: void Menu_task(void *pdata) { GUI_Init(); MainMenu_Init(); while(1) { if(GUI_GetKey()==GUI_ID_BUTTON0)//按钮按下 { LED0=~LED0; } GUI_Exec(); delay_ms(10); } }                 & ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2014-3-4
在线时间
0 小时
 楼主| 发表于 2014-7-13 11:26:57 | 显示全部楼层
回复【7楼】eling13:
---------------------------------
嗯,找到原因了,之前移植触摸屏的驱动有些问题。另外代码改为了:
void Menu_task(void *pdata)
{
GUI_Init();
MainMenu_Init();
while(1)
{
if(GUI_GetKey()==GUI_ID_BUTTON0)//按钮按下
{
LED0=~LED0;
}
GUI_Exec();
delay_ms(10);
}
}                                                             
可以实现点按钮控制LED0,多谢指教!
回复

使用道具 举报

9

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2014-3-4
在线时间
0 小时
 楼主| 发表于 2014-7-13 11:26:57 | 显示全部楼层
移植触摸屏的驱动修改如下,供大家参考(只负责一个触摸点,其他的一样吧):

gt811.c




#include "gt811.h"
#include "ctiic.h"
#include "usart.h"
#include "delay.h"  

//////////////////////////////////////////////////////////////////////////////////  

#define EXTI15_10_IRQChannel         ((u8)0x28)  /* External Line[15:10] Interrupts */
//报错说 EXTI15_10_IRQChannel is undefined,故加了这一条 6/8
//电容触摸屏控制器
_m_ctp_dev ctp_dev=
{
GT811_Init,
GT811_Scan,
0,
0,
0,
0,
0,
0,
};       
//触摸屏配置参数(触摸屏厂家提供)
const u8 GTP_CFG_DATA[]=
{
    0x12,0x10,0x0E,0x0C,0x0A,0x08,0x06,0x04,0x02,0x00,0x05,0x55,0x15,0x55,0x25,0x55,
    0x35,0x55,0x45,0x55,0x55,0x55,0x65,0x55,0x75,0x55,0x85,0x55,0x95,0x55,0xA5,0x55,
    0xB5,0x55,0xC5,0x55,0xD5,0x55,0xE5,0x55,0xF5,0x55,0x1B,0x03,0x00,0x00,0x00,0x13,
    0x13,0x13,0x0F,0x0F,0x0A,0x50,0x30,0x05,0x03,0x64,0x05,0xe0,0x01,0x20,0x03,0x00,
    0x00,0x32,0x2C,0x34,0x2E,0x00,0x00,0x04,0x14,0x22,0x04,0x00,0x00,0x00,0x00,0x00,
    0x20,0x14,0xEC,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x30,
    0x25,0x28,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 
};  

//触摸屏中断处理
void EXTI15_10_IRQHandler(void)
{
  if(CT_INT==0)  //有触摸中断
{   
ctp_dev.tpsta|=0X80;//标记有有效触摸
}  
EXTI->R=1<<10;  //清除LINE10上的中断标志位      

//向GT811写入一次数据
//reg:起始寄存器地址
//buf:数据缓缓存区
//len:写数据长度
//返回值:0,成功;1,失败.
u8 GT811_WR_Reg(u16 reg,u8 *buf,u8 len)
{
u8 i;
u8 ret=0;
CT_IIC_Start();
  CT_IIC_Send_Byte(CT_CMD_WR);    //发送写命令   
CT_IIC_Wait_Ack();
CT_IIC_Send_Byte(reg>>8);    //发送高8位地址
CT_IIC_Wait_Ack();          
CT_IIC_Send_Byte(reg&0XFF);    //发送低8位地址
CT_IIC_Wait_Ack();  
for(i=0;i<len;i++)
{    
     CT_IIC_Send_Byte(buf);   //发数据
ret=CT_IIC_Wait_Ack();
if(ret)break;  
}
    CT_IIC_Stop(); //产生一个停止条件     
return ret; 
}
//从GT811读出一次数据
//reg:起始寄存器地址
//buf:数据缓缓存区
//len:读数据长度   
void GT811_RD_Reg(u16 reg,u8 *buf,u8 len)
{
u8 i;
  CT_IIC_Start();
  CT_IIC_Send_Byte(CT_CMD_WR);    //发送写命令   
CT_IIC_Wait_Ack();
  CT_IIC_Send_Byte(reg>>8);    //发送高8位地址
CT_IIC_Wait_Ack();          
  CT_IIC_Send_Byte(reg&0XFF);    //发送低8位地址
CT_IIC_Wait_Ack();  
  CT_IIC_Start();        
CT_IIC_Send_Byte(CT_CMD_RD);    //发送读命令    
CT_IIC_Wait_Ack();    
for(i=0;i<len;i++)
{    
     buf=CT_IIC_Read_Byte(i==(len-1)?0:1); //发数据   

    CT_IIC_Stop();//产生一个停止条件     
}
//向GT811发送配置参数
//buf:配置参数表指针
//cfg_len:配置参数长度
//返回值:0,成功;1,失败.
u8 GT811_Send_Cfg(u8 * buf,u16 cfg_len)
{
u8 ret=0;
u8 retry=0;
for(retry=0;retry<5;retry++)
{
ret=GT811_WR_Reg(CT_CONFIG_REG,buf,cfg_len);
if(ret==0)break;
delay_ms(10);  
}
return ret;
}
//GT811唤醒
void GT811_Wakeup_Sleep(void)
{
CT_RST=0; //复位
delay_ms(10);
  CT_RST=1; //释放复位     
delay_ms(100);
}     
//GT811初始化
//返回值:初始化结果
//0,初始化成功;
//1,发送配置参数错误
//2,版本错误
u8 GT811_Init(void)
{
  u16 version=0;
u8 temp;
  RCC->APB2ENR|=1<<3; //先使能外设IO ORTB时钟   
  RCC->APB2ENR|=1<<7; //先使能外设IO ORTF时钟   
GPIOB->CRL&=0XFFFFF0FF; //PB2 推挽输出
GPIOB->CRL|=0X00000300;    
GPIOB->ODR|=1<<2;     //PB2 输出高
GPIOF->CRH&=0XFFFFF0FF; //PF10 输入
GPIOF->CRH|=0X00000800;    
GPIOF->ODR|=1<<10;     //PF10 上拉   
  Ex_NVIC_Config(GPIO_F,10,FTIR);  //下降沿触发    
MY_NVIC_Init(3,3,EXTI15_10_IRQChannel,2); //抢占3,子优先级3,组2       
  CT_IIC_Init(); //电容触摸屏部分,IIC初始化
GT811_Wakeup_Sleep();  //唤醒GT811 
   GT811_RD_Reg(0X717,&temp,1); //读取版本高八位
version=(u16)temp<<8; 
GT811_RD_Reg(0X718,&temp,1); //读取版本低八位  
version|=temp;
// printf("version:%x\r\n",version);  //7/10注释掉,未注释时黑屏
if(version==0X2010) //版本正确,发送配置参数

temp=GT811_Send_Cfg((u8*)GTP_CFG_DATA,sizeof(GTP_CFG_DATA));//发送配置参数
}else temp=2; //版本错误
return temp;   
}    
//扫描GT811
//得到的结果保存在ctp_dev结构体内      
u8 GT811_Scan(void)
{    
u8 buf[34];//一次读取34字节
if(ctp_dev.tpsta&0X80)   //有触摸按下
{
   GT811_RD_Reg(CT_READ_XY_REG,buf,34); //一次读取34个字节
ctp_dev.tpsta&=0X60; //清除最低5位和最高位
ctp_dev.tpsta|=buf[0]&0X1F; //查看低5位是否有键按下
if((ctp_dev.tpsta&0X1F)==0)return 0;
ctp_dev.y[0]=480-(((u16)buf[2]<<8)+buf[3]);
ctp_dev.x[0]=((u16)buf[4]<<8)+buf[5];

if((ctp_dev.tpsta&TP_PRES_DOWN)==0)    //之前没有被按下
{  
ctp_dev.tpsta|=TP_PRES_DOWN|TP_CATH_PRES;
ctp_dev.x0=ctp_dev.x[0];
ctp_dev.y0=ctp_dev.y[0];        
}    
}else if(ctp_dev.tpsta&TP_PRES_DOWN)   //之前是被按下的
{
ctp_dev.tpsta&=~TP_PRES_DOWN;    
}

return ctp_dev.tpsta&TP_PRES_DOWN;
    
}





另外定义GUI_TOUCH_MeasureX 的C文件




#include  "GUI.h"  //在这里把GUI_TOUCH_DriverAnalog 里的四个GUI_TOUCH...都搬了过来
#include "GUI_X.h"  //原来的都删去了 6/8
#include "gt811.h"

void GUI_TOUCH_X_ActivateX(void) {

}

void GUI_TOUCH_X_ActivateY(void) {
}

int  GUI_TOUCH_X_MeasureX(void) {
  

 if(ctp_dev.tpsta&0X80)
 {
 return ctp_dev.x[0];
 }else return 0xffff;

}

int  GUI_TOUCH_X_MeasureY(void) {

 if(ctp_dev.tpsta&0X80)
 {
 ctp_dev.scan();
 return ctp_dev.y[0];
 }else return 0xffff;




}
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-7-13 16:15:44 | 显示全部楼层
帮顶.....
回复

使用道具 举报

10

主题

274

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
336
金钱
336
注册时间
2013-12-3
在线时间
0 小时
发表于 2014-7-14 08:44:01 | 显示全部楼层
你这个GUI_WaitKey(); 不放在while(1) 里面? 而且我也没看到过有重绘刷新函数GUI_Exec()啊。
不用谢了……
回复

使用道具 举报

9

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2014-3-4
在线时间
0 小时
 楼主| 发表于 2014-7-14 09:28:55 | 显示全部楼层

--------------------------------已上传代码
回复

使用道具 举报

10

主题

274

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
336
金钱
336
注册时间
2013-12-3
在线时间
0 小时
发表于 2014-7-14 14:44:43 | 显示全部楼层
回复【4楼】liyanda2012:
---------------------------------
上面改成这样就可以了if(GUI_WaitKey()==GUI_ID_BUTTON0) 
后面那个key=GUI_WaitKey();去掉吧。
如果是OS的话 直接去掉Key=GUI_WaitKey(); 然后换上延时函数加 GUI_Exec();   GUI编译太长时间,没跑。
不用谢了……
回复

使用道具 举报

9

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2014-3-4
在线时间
0 小时
 楼主| 发表于 2014-7-15 08:55:10 | 显示全部楼层
回复【5楼】eling13:
---------------------------------
我按您说的改了,发现GUI_WaitKey()返回值还是零。请问还有没有其他原因呢?
回复

使用道具 举报

10

主题

274

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
336
金钱
336
注册时间
2013-12-3
在线时间
0 小时
发表于 2014-7-15 09:22:02 | 显示全部楼层
回复【6楼】liyanda2012:
---------------------------------
不至于吧。 我用模拟器跑了你的那一段按键代码。是可以的。
你的是UCOS系统,第一看下触摸有效没,第二时间延时函数不要太长。
还有你MainMenu_Init() 这个初始化函数,怎么一直放在while里面重复初始化呢。代码不要这样写。
不用谢了……
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-6 06:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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