OpenEdv-开源电子网

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

想设计一个触摸按键方案,在调用生成按键函数时总是死在里面,请原子哥看下

[复制链接]

18

主题

238

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1823
金钱
1823
注册时间
2014-8-5
在线时间
211 小时
发表于 2015-7-6 17:27:32 | 显示全部楼层 |阅读模式
5金钱
本人想设计一个触摸按键显示的方案,数据结构如下:
[mw_shl_code=c,true]__packed typedef struct { u8 K_ID; //按键索引 u16 x; //按钮左端坐标 u16 y; //按钮顶端坐标 u16 width; //宽度 u16 height; //高度 u8 state; //按键状态 bit0 按下标记 1按下 0无 bit2 1已 经按下标记 bit7 1按键有效 其它保留 u16 K_Color; //边框色 也为没有按下时字体背景色 u16 KF_Coler; //边框与字体之间区域背景色 u16 NB_Coler; //按下时字体背景色 u16 FONT_Coler; //字体色 u8 * txt; //按键显示文本 }Touch_key;[/mw_shl_code]
现在两种状态显示已实现(弹起及按下状态),按键扫描及有效按下已实现。但在调用创建按键函数时,总是死在里面,个人觉得可能是指针的问题。

原先设计的数据结构为:
__packed typedef struct
{
  u8   K_ID;                   //按键索引
u16  x;         //按钮左端坐标
u16  y;                      //按钮顶端坐标
u16  width;     //宽度
u16  height;     //高度
  u8   state;                  //按键状态    bit0 按下标记 1按下 0无  bit2  1已经按下标记  bit7 1按键有效  其它保留 
u16  K_Color;                //边框色      也为没有按下时字体背景色
  u16  KF_Coler;               //边框与字体之间区域背景色   
u16  NB_Coler;               //按下时字体背景色
u16  FONT_Coler;             //字体色
const u8 * txt;                   //按键显示文本
}Touch_key;

在赋予按键显示文本时进入死循环,改成u8 * 还是没有解决。请各位帮忙看下

画弹起按钮
[mw_shl_code=c,true]void TCH_PLAY_OFF(Touch_key* T_KEY) //画按键 { u16 COLCR_BF=POINT_COLOR; u16 COLOR_BJ=BACK_COLOR; u8 i=0; LCD_Fill(T_KEY->x,T_KEY->y,T_KEY->x+T_KEY->width,T_KEY->y+T_KEY->height,T_KEY->KF_Coler); //画填充区 画背景 POINT_COLOR=T_KEY->K_Color; //装载边框颜色 for(i=0;i<Touch_key_WH;i++) { LCD_DrawRectangle(T_KEY->x+i,T_KEY->y+T_KEY->height-i,T_KEY->x+T_KEY->width-i,T_KEY->y+i); //画边框 } BACK_COLOR= T_KEY->K_Color; //字体背景色 POINT_COLOR=T_KEY->FONT_Coler; //装载字体颜色 LCD_ShowString(T_KEY->x+2*Touch_key_WH,T_KEY->y+2*Touch_key_WH, T_KEY->width-Touch_key_WH,T_KEY->height-Touch_key_WH,16,(u8 *)T_KEY->txt); POINT_COLOR=COLCR_BF; //颜色还原 BACK_COLOR=COLOR_BJ; }[/mw_shl_code]

画按下状态按钮
[mw_shl_code=c,true]void TCH_PLAY_ON(Touch_key* T_KEY) //画按键按下状态 { u16 COLCR_BF=POINT_COLOR; u16 COLOR_BJ=BACK_COLOR; u8 i=0; LCD_Fill(T_KEY->x,T_KEY->y,T_KEY->x+T_KEY->width,T_KEY->y+T_KEY->height,T_KEY->KF_Coler); //画填充区 画背景 POINT_COLOR=T_KEY->K_Color; //装载边框颜色 for(i=0;i<Touch_key_WH;i++) { LCD_DrawRectangle(T_KEY->x+i,T_KEY->y+T_KEY->height-i,T_KEY->x+T_KEY->width-i,T_KEY->y+i); //画边框 } BACK_COLOR= T_KEY->NB_Coler; //字体背景色 POINT_COLOR=T_KEY->FONT_Coler; //装载字体颜色 LCD_ShowString(T_KEY->x+2*Touch_key_WH,T_KEY->y+2*Touch_key_WH, T_KEY->width-Touch_key_WH,T_KEY->height-Touch_key_WH,16,(u8 *)T_KEY->txt); POINT_COLOR=COLCR_BF; //颜色还原 BACK_COLOR=COLOR_BJ; }[/mw_shl_code]
按键扫描
[mw_shl_code=c,true]//T_KEY 检测按键 //X, Y 当前按下的坐标 //sta 触摸屏状态 //返回0 有效按下 1无 u8 TCH_Scan(Touch_key* T_KEY,u16 x,u16 y,u8 sta) //按键扫描 返回0 有效按下 1无 { u8 num=1; if((T_KEY->state&0x80)==0) //上次有效操作完成了 { if(sta&TP_PRES_DOWN) //有按键按下了 { if((x>T_KEY->x)&&(x<(T_KEY->x+T_KEY->width))&&(y>T_KEY->y)&&(y<(T_KEY->y+T_KEY->height)))//当前按下为按键内 按下标记置位 { if((T_KEY->state&0x01)==0) //之前没有按下 { T_KEY->state|=0x01|0x02; //按下标志 及已经按下 标志置位 TCH_PLAY_ON(T_KEY); //画按下按键 } } else //按键外 清除按键按下标记 { if(T_KEY->state&0x01) //之前被按下 只是移动后离开有效区域 { T_KEY->state&=~(0x01|0x02); //清除 按下标志 及已经按下 标志 TCH_PLAY_OFF(T_KEY); //画按键弹起 } } } else //没有按键按下 清除按下标记 { if(T_KEY->state&0x01) //如果之前有按在 有效区域 则有效操作标记置位 { T_KEY->state&=~0x01; //清除按键按下标记 TCH_PLAY_OFF(T_KEY); //画按键弹起 T_KEY->state|=0x80; //按键有效操作 num=0; } } } return num; }[/mw_shl_code]


创建按钮  一直进入死循环
[mw_shl_code=c,true]//d_x,d_y 按钮左上角顶点坐标 //TXT 按钮文本 //K_Color 边框颜色及没有按下时字体背景色 //KF_Coler 边框与字体之间区域背景色 //NB_Coler 按下时字体背景色 //FONT_Coler 字体颜色 Touch_key* Creat_BUTT(u16 d_x,u16 d_y,u8* txt,u16 K_Color,u16 KF_Coler,u16 NB_Coler,u16 FONT_Coler) //创建按键 返回创建好按键结构体 { Touch_key* T_KEY; if((strlen((char *)txt)*8+2*Touch_key_WH+d_x)>lcddev.width) //判断边界 如果超过边界退出 { return NULL; } if((16+2*Touch_key_WH+d_y)>lcddev.height) //判断边界 如果超过边界退出 { return NULL; } //开始赋予按钮结构数据------------------------------------------- T_KEY->K_ID=0; //索引 T_KEY->state=0; //状态 T_KEY->txt=txt; //J LINK 发现死在这里 T_KEY->x=d_x; //左上角顶点坐标 T_KEY->y=d_y; //左上角顶点坐标 T_KEY->height= 16+2*Touch_key_WH+d_y; //高度 T_KEY->width= strlen((char *)txt)*8+2*Touch_key_WH+d_x; //宽 T_KEY->FONT_Coler=FONT_Coler; T_KEY->KF_Coler=KF_Coler; T_KEY->K_Color=K_Color; T_KEY->NB_Coler=NB_Coler; return T_KEY; }[/mw_shl_code]
请各位看下,帮忙下,谢谢。
工程:

触摸按键.zip

395.29 KB, 下载次数: 427

最佳答案

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

指针要先申请内存,再使用。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-7-6 17:27:33 | 显示全部楼层
指针要先申请内存,再使用。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-7-6 17:27:33 | 显示全部楼层
回复【5楼】513393302@qq.com:
---------------------------------
1,返回结构体指针,如果申请了内存,那么和返回结构体一样。只是赋值给的对象不一样。其他完全相同。但是如果指针没有申请内存,那就是作死了。
2,比如u8 *p;
p=(u8*)0X20001000;
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

18

主题

238

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1823
金钱
1823
注册时间
2014-8-5
在线时间
211 小时
 楼主| 发表于 2015-7-6 23:06:29 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
谢谢原子哥,我已把结构体中的指针改为数组,勉强实现了功能。创建按键函数返回值改为返回结构体而不是结构体指针。
请问原子哥:
1、函数返回结构体指针与返回结构体有什么优点
2、结构体指针中成员指针怎么直接赋予地址?(此地址可能不是常量数组地址)

结构从新改为:
#define Touch_NAME_num   8     //最大按键文本大小  单位:字节
#define Touch_key_WH     4     //边框大小


__packed typedef struct
{
  u8   K_ID;                   //按键索引
  u16  x;   //按钮左端坐标
  u16  y;                      //按钮顶端坐标
  u16  width;        //宽度
  u16  height;      //高度
  u8   state;                  //按键状态    bit0 按下标记 1按下 0无  bit2  1已经按下标记  bit7 1按键有效  其它保留 
  u16  K_Color;                //边框色      也为没有按下时字体背景色
  u16  KF_Coler;               //边框与字体之间区域背景色   
  u16  NB_Coler;               //按下时字体背景色
  u16  FONT_Coler;             //字体色
  u8   txt[Touch_NAME_num];    //按键显示文本
}Touch_key;


创建函数为:(已实现创建按钮)
//d_x,d_y     按钮左上角顶点坐标
//TXT         按钮文本
//K_Color     边框颜色及没有按下时字体背景色   
//KF_Coler    边框与字体之间区域背景色   
//NB_Coler    按下时字体背景色   
//FONT_Coler  字体颜色      
Touch_key Creat_BUTT(u16 d_x,u16 d_y,u8 * txt,u16 K_Color,u16 KF_Coler,u16 NB_Coler,u16 FONT_Coler)  //创建按键  返回创建好按键结构体
{
  Touch_key  T_KEY={0};
   u16    i=0;

  if(strlen((const char *)txt)>Touch_NAME_num)   //按钮文本超过最大值
  {
    return T_KEY;
  }

  if((strlen((const char *)txt)*8+4*Touch_key_WH+d_x)>lcddev.width)    //判断边界   如果超过边界退出
  {
    return T_KEY;
   }

  if((16+4*Touch_key_WH+d_y)>lcddev.height)    //判断边界   如果超过边界退出
  {
    return T_KEY;
   }

 //开始赋予按钮结构数据-------------------------------------------
  T_KEY.K_ID=0XFF;   //索引
  T_KEY.state=0;      //状态

  T_KEY.x=d_x;      //左上角顶点坐标
  T_KEY.y=d_y;      //左上角顶点坐标
  T_KEY.height= 16+4*Touch_key_WH;   //高度
  T_KEY.width= strlen((const char *)txt)*8+4*Touch_key_WH;   //宽
  T_KEY.FONT_Coler=FONT_Coler;
  T_KEY.KF_Coler=KF_Coler;
  T_KEY.K_Color=K_Color;
  T_KEY.NB_Coler=NB_Coler;

  while(*txt)   //文本
  {
     T_KEY.txt=*txt++;
     i++;
  }

  return T_KEY;
}

功能基本实现,工程:

触摸按键.zip

396.38 KB, 下载次数: 447

回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-7-6 23:14:01 | 显示全部楼层
回复【3楼】513393302@qq.com:
---------------------------------
 学习内存管理,然后参考我们的综合例程,gui架构。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

18

主题

238

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1823
金钱
1823
注册时间
2014-8-5
在线时间
211 小时
 楼主| 发表于 2015-7-6 23:17:43 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
嗯,谢谢原子哥。如果方便 ,请指点下这两个疑问,谢谢
1、函数返回结构体指针与返回结构体有什么优点 
2、结构体指针中成员指针怎么直接赋予地址?(此地址可能不是常量数组地址)
回复

使用道具 举报

18

主题

238

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1823
金钱
1823
注册时间
2014-8-5
在线时间
211 小时
 楼主| 发表于 2015-7-7 08:48:40 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
谢谢原子哥
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-20 13:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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