本人想设计一个触摸按键显示的方案,数据结构如下:
[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]
请各位看下,帮忙下,谢谢。
工程:
|