迪文科技论坛

 找回密码
 立即注册
搜索
查看: 2130|回复: 5

写C代码时如何读取触摸按键的状态?

[复制链接]

0

主题

2

回帖

39

积分

新手上路

Rank: 1

积分
39
发表于 2020-2-26 13:32:44 | 显示全部楼层 |阅读模式
如下图中有两个按键,我在写C代码时,如何知道这两个按键被触摸到了?


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0

主题

2

回帖

39

积分

新手上路

Rank: 1

积分
39
 楼主| 发表于 2020-2-26 14:59:25 | 显示全部楼层
提供样例代码,参考!
回复

使用道具 举报

0

主题

125

回帖

2081

积分

金牌会员

Rank: 6Rank: 6

积分
2081
发表于 2020-2-26 17:15:43 | 显示全部楼层
本帖最后由 神秘の宅叔 于 2020-2-27 13:15 编辑

有两个方法
1、通过按键的数据上传当前变量的键值到串口。
2、单片机主动用83指令 去读按键返回的地址或者图片中的弹出菜单的地址
C代码的话可以在我们论坛搜索下其他人分享过的源码参考下
回复

使用道具 举报

45

主题

254

回帖

3415

积分

论坛元老

Rank: 8Rank: 8

积分
3415
发表于 2020-2-27 07:54:37 | 显示全部楼层
本帖最后由 舞指飞扬 于 2020-2-27 09:00 编辑

//下面的代码段 允许在无13.bin情形下,完成比13bin更复杂的触控功能定义
if(task1_flag==1)//多任务中 本任务可执行一次标记
{
task1_flag=0;

read_dgusii_vp( 0x0016,(u8 *)datavp,4);//读取0016变量按压状态



//D7:0x5A 表示触摸屏数据已经更新。 其他=触摸屏坐标未更新
//用户读取数据后可以写入
≠0x5A
作标记, 只要不触摸, 标记不再更新。
//D6:触摸屏状态 0x00=松开 0x01=第一次按压0x02=抬起 0x03=按压中

//D5-D4=触摸屏按压的坐标位置 X 坐标
//D3-D2=触摸屏按压的坐标位置 Y
坐标
//D1-D0=0x0000




        if(datavp[0]>>8==0x5a)
                {
           LocalX=datavp[1];//记录触摸坐标x
            LocalY=datavp[2];];//记录触摸坐标y

datavp[0] =0x00ff;write_dgusii_vp(0x0016,   (u8*)&datavp[0] ,1);  //清除坐标更新标记
            
datavp[4]        =0x0030;
datavp[5]        =0x0004;

      

        //if (LocalX+33>480)datavp[1]=480-33;//对处于屏幕边框附件的控件进行坐标补偿,提升体验,以480*272为例
        //if LocalY]+33>272)datavp[2]=272-33;//对处于屏幕边框附件的控件进行坐标补偿,提升体验,以480*272为例
        
        datavp[6]        =datavp[1];
        datavp[7]        =datavp[2];

for (j=1;j<3;j++)//处理多个方块区域
{
temp= isInMatrix( LocalAX[j],LocalAY[j],  16, 16,   LocalX,LocalY );//判断触控点是否在区域LocalAX[j],LocalAY[j] 半轴16, 16,范围内,可做成圆形判断或其他异形,LocalAX[j],LocalAY[j] 要预定义
if ((temp==0)  && ( inflag[j] ==1      ))//表示划出

        inflag[j]=0;//更新状态
}else if((temp==1)  && ( inflag[j] ==0  ))        //划入或点击                  
{ read_dgusii_vp( VPA[j],(u8*)&datavp[0],1);
         
        //datavp[0]=1-datavp[0];//反转状态,示例点击的即时间操作,可替换成其他动作
        
       //  write_dgusii_vp( VPA[j]  ,   (u8*)&datavp[0] ,1);//可替换成其他动作,记录按键被按压,请求主程序处理
         
        inflag[j]=1;//更新状态
}

else
{
        inflag[j]=temp;//
}
}
}
}        

  void Timer0_Rountine(void)  interrupt 1
  {
   TL0 = 00;  TH0= 00;
   task1_flag=1;//触控检测每秒判断300次,此时间通常比任务运行最长时间要长,否则若任务中不反向检测代码运行时间,系统任务紊乱
        }

                     
        u8   isInMatrix( u16 xM_16,u16 yM_16,   u16 Rx_16, u16 Ry_16,   u16 x,u16 y )
{

if  (x< xM_16-Rx_16 ) return 0;
if  (x> xM_16+Rx_16 ) return 0;
if  (y< yM_16-Ry_16 ) return 0;
if  (y> yM_16+Ry_16 ) return 0;
return 1;
}
        
回复

使用道具 举报

0

主题

2

回帖

39

积分

新手上路

Rank: 1

积分
39
 楼主| 发表于 2020-2-29 14:10:27 | 显示全部楼层
舞指飞扬 发表于 2020-2-27 07:54
//下面的代码段 允许在无13.bin情形下,完成比13bin更复杂的触控功能定义
if(task1_flag==1)//多任务中 本任 ...

感谢,已经解决
受到启发,我的做法是保留13.bin文件,用读取每个Touch key的地址内容作比较,来判定是否有被触摸。
显示控件和触摸控件地址关联起来的,一断有被触摸到,会自动切图标,代码只发定制的串口命令出来。
回复

使用道具 举报

0

主题

11

回帖

294

积分

中级会员

Rank: 3Rank: 3

积分
294
发表于 2020-3-29 13:43:57 来自手机 | 显示全部楼层
多谢,正需要这个!
回复

使用道具 举报

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

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2024-11-23 11:47 , Processed in 0.074252 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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