OpenEdv-开源电子网

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

4.3寸电容触摸屏UCGUI的移植问题

[复制链接]

3

主题

10

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2013-10-7
在线时间
0 小时
发表于 2014-9-6 21:52:49 | 显示全部楼层 |阅读模式
5金钱
写在前面的:用的是4.3寸电容触摸屏;不加触摸功能的移植部分没有问题;加了触摸功能没有报错但没用触摸功能的效果,此触摸屏是5点试的
1-------在GUITouchConf.h中德定义
#ifndef GUITOUCH_CONF_H
#define GUITOUCH_CONF_H
#include "ili93xx.h"

//#define GUI_TOUCH_AD_LEFT             0
//#define GUI_TOUCH_AD_RIGHT      800
//#define GUI_TOUCH_AD_TOP               0
//#define GUI_TOUCH_AD_BOTTOM     480
#define GUI_TOUCH_AD_LEFT    187
#define GUI_TOUCH_AD_RIGHT   3965   
#define GUI_TOUCH_AD_TOP        128
#define GUI_TOUCH_AD_BOTTOM     3950

#define GUI_TOUCH_SWAP_XY    1
#define GUI_TOUCH_MIRROR_X   0
#define GUI_TOUCH_MIRROR_Y   1

#endif /* GUITOUCH_CONF_H */

2-------在GUIConf.h的定义:
#ifndef GUICONF_H
#define GUICONF_H
#define GUI_OS                    (0)  /* Compile with multitasking support */
#define GUI_SUPPORT_TOUCH         (1)  /* Support a touch screen (req. win-manager) */
#define GUI_SUPPORT_UNICODE       (1)  /* Support mixed ASCII/UNICODE strings */
#define GUI_DEFAULT_FONT          &GUI_Font8x8
#define GUI_ALLOC_SIZE          5000  /* Size of dynamic memory ... For WM and memory devices*/
#define GUI_WINSUPPORT            1  /* Window manager package available */
#define GUI_SUPPORT_MEMDEV        1  /* Memory devices available */
#define GUI_SUPPORT_AA            1  /* Anti aliasing available */
#endif  /* Avoid multiple inclusion */

3-------在LCDConf.h的定义:
#define LCD_XSIZE      (800)   /* X-resolution of LCD, Logical coor. */
#define LCD_YSIZE      (480)   /* Y-resolution of LCD, Logical coor. */
#define LCD_BITSPERPIXEL (16)
#define LCD_CONTROLLER -1
#define LCD_FIXEDPALETTE   (565) //////
#define LCD_SWAP_RB        (1)  
#define LCD_SWAP_XY        (0)                                              
#define LCD_MIRROR_X        1  
#define LCD_MIRROR_Y        1  
#define LCD_INIT_CONTROLLER()  myLCD_Init()  
/***********************************/
#endif /* LCDCONF_H */

个人感觉以上定义没有错误,因为我现在显示鼠标,应用API函数都能用,就是没有触摸效果

4-------GUI_X.c里面的文件没有改动过。

5-------GUI_X_Touch.c里面的定义是:
void GUI_TOUCH_X_ActivateX(void) {
}

void GUI_TOUCH_X_ActivateY(void) {
}


int  GUI_TOUCH_X_MeasureX(void) 
        {
                tp_dev.scan(0);
                return tp_dev.x[0];
//                u16 x,y;
//                TP_Read_XY(&x,&y);
//                return x;
        }

int  GUI_TOUCH_X_MeasureY(void) 
        {
          tp_dev.scan(0);
                return tp_dev.y[0];
//                        u16 x,y;
//                TP_Read_XY(&x,&y);
//                return y;
        }
以上看你的视频是说要AD转换出来的值得函数,但我用原子4.3寸电容屏幕没有这样的函数,原子说“直接送电容触摸屏的坐标值”,再有就是电容触摸屏不需要校准这些。

6-------以下是触摸屏的函数:
u8 OTT2001A_Init(void)
{
        u8 regval=0; 
        RCC->APB2ENR|=1<<4;                                                                          
        GPIOC->CRL&=0XFFFFFF0F;        
        GPIOC->CRL|=0X00000080;           
        GPIOC->ODR|=1<<1;            
        GPIOC->CRH&=0XFF0FFFFF;        
        GPIOC->CRH|=0X00300000;           
        GPIOC->ODR|=1<<13;                   
    CT_IIC_Init();              //初始化电容屏的I2总线
        OTT_RST=0;                                //复位
        delay_ms(100);
        OTT_RST=1;                                //释放复位            
        delay_ms(100); 
        OTT2001A_SensorControl(1);        //打开传感器
        OTT2001A_RD_Reg(OTT_CTRL_REG,&regval,1);//读取传感器运行寄存器的值来判断I2C通信是否正常
        printf("CTP ID:%x\r\n",regval);
    if(regval&0x80)return 0;
        return 1;
}

u8 CTP_Scan(u8 mode)
{
        u8 buf[4];
        u8 i=0;
        u8 res=0;
        static u8 t=0;
        t++;
        if((t%10)==0||t<10)//空闲时,每10次 CTP_Scan函数才检测1次,从而节省CPU使用率
        {
                OTT2001A_RD_Reg(OTT_GSTID_REG,&mode,1);//读取触摸点的状态
                if(mode&0X1F)
                {
                        tp_dev.sta=(mode&0X1F)|TP_PRES_DOWN|TP_CATH_PRES;
                        for(i=0;i<5;i++)
                        {
                                if(tp_dev.sta&(1<<i))        //?触摸有效?
                                {
                                        OTT2001A_RD_Reg(OTT_TPX_TBL,buf,4);        //读取XY坐标值
                                        if(tp_dev.touchtype&0X01)//横屏?
                                        {
                                                tp_dev.y=(((u16)buf[2]<<8)+buf[3])*OTT_SCAL_Y;
                                                tp_dev.x=800-((((u16)buf[0]<<8)+buf[1])*OTT_SCAL_X);
                                        }else
                                        {
                                                tp_dev.x=(((u16)buf[2]<<8)+buf[3])*OTT_SCAL_Y;
                                                tp_dev.y=(((u16)buf[0]<<8)+buf[1])*OTT_SCAL_X;
                                        }  
                                        //printf("x[%d]:%d,y[%d]:%d\r\n",i,tp_dev.x,i,tp_dev.y);
                                }                        
                        } 
                        res=1;
                        if(tp_dev.x[0]==0 && tp_dev.y[0]==0)mode=0;        //读到的数据都是0.则忽略此次的数据
                        t=0;                //触发一次,则会最少连续监测10次,从而提高命中
                }
        }
        if((mode&0X1F)==0)//无触摸点按下
        { 
                if(tp_dev.sta&TP_PRES_DOWN)        //之前是被按下的
                {
                        tp_dev.sta&=~(1<<7);        //标记按键松开
                }else                                                //之前没有被按下
                { 
                        tp_dev.x[0]=0xffff;
                        tp_dev.y[0]=0xffff;
                        tp_dev.sta&=0XE0;        //清除有效点
                }         
        }         
        if(t>240)t=10;//从新从10开始计数
        return res;
}

7---以下是主函数:
int main(void)
   {
        Stm32_Clock_Init(9);        
        uart_init(72,9600);                 
        delay_init(72);                            
        LED_Init();
        KEY_Init();                                
        Timerx_Init(100,7199);
        OTT2001A_Init();  //触摸屏初始化
        GUI_Init();               
        GUI_SetFont(&GUI_Font24_ASCII);
        GUI_SetBkColor(GUI_BLUE);
        GUI_Clear(); 
        GUI_CURSOR_Show();
        Task_1();  //用的是你给的
        while(1) 
                { 
                       GUI_Exec();
                 }              
        }


7----还有就是TIME。C也是用的你的,我里面加了个LED,实验也亮了,说明能进入此中断。

8------效果
能显示鼠标,能显示你给的Task_1();这个窗口,但是不能触摸???


搞了一周了,实在是误解,就指导!!!!

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-9-6 22:42:05 | 显示全部楼层
这是MiniSTM32 V3.0的  ucGUI例程,可以支持4.3寸电容触摸屏.
你可以参考下这个代码.

ALIENTEK MINISTM32 实验39 ucGUI实验.rar

1.74 MB, 下载次数: 2332

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

10

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2013-10-7
在线时间
0 小时
 楼主| 发表于 2014-9-7 10:35:46 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
不对,还是移植不成功。
回复

使用道具 举报

27

主题

101

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1007
金钱
1007
注册时间
2015-7-26
在线时间
108 小时
发表于 2016-4-8 21:19:13 | 显示全部楼层
//#define GUI_TOUCH_AD_LEFT             0
//#define GUI_TOUCH_AD_RIGHT      800
//#define GUI_TOUCH_AD_TOP               0
//#define GUI_TOUCH_AD_BOTTOM     480
#define GUI_TOUCH_AD_LEFT    187
#define GUI_TOUCH_AD_RIGHT   3965   
#define GUI_TOUCH_AD_TOP        128
#define GUI_TOUCH_AD_BOTTOM     3950

这里应该是用上面那组值吧,
int  GUI_TOUCH_X_MeasureX(void)
         {
                 tp_dev.scan(0);
                 return tp_dev.x[0];
//                u16 x,y;
//                TP_Read_XY(&x,&y);
//                return x;
         }
电容屏得到的直接是坐标 tp_dev.x[0]可以显示出来直接是坐标
可是我的电容屏放在GUI中触摸也没反应,debug发现在液晶触摸中断中,触摸的时候没有进入中断,不知道是为什么?
回复

使用道具 举报

3

主题

10

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2019-8-13
在线时间
3 小时
发表于 2019-8-13 11:37:50 | 显示全部楼层
你好,找到问题了吗?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-13 03:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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