硬汉嵌入式论坛

 找回密码
 立即注册
查看: 6625|回复: 7
收起左侧

[emWin] 电阻屏:官方自带5点驱动校正

[复制链接]

21

主题

481

回帖

544

积分

金牌会员

积分
544
发表于 2021-4-20 16:53:44 | 显示全部楼层 |阅读模式
校正流程:
1. 取5个标准坐标点
  左上,右上,右下,左下,中点,固定坐标值
2. 计算系数校正
  依次点击标准校正点(左上,右上,右下,左下,中点),获取5个点的ADC值,然后调用GUI_TOUCH_CalcCoefficients (),计算系数
3. 校正确认
  调用GUI_TOUCH_CalibratePoint(),将点的ADC值转化为坐标值,跟标准坐标点比较,小于预期差值(一般取2),通过(如有一个点失败,回到第1步,重新校正)
校正完毕!!
扫描触摸点:
  应用程序或任务,周期性(间隔50ms)扫描获取触摸ADC值,如有按下,调用GUI_TOUCH_CalibratePoint()转化为坐标值,发送消息GUI_TOUCH_StoreState (),最后弹起发送GUI_TOUCH_StoreState (-1, -1)

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115811
QQ
发表于 2021-4-21 08:44:07 | 显示全部楼层
谢谢分享。
回复

使用道具 举报

1

主题

28

回帖

31

积分

新手上路

积分
31
发表于 2021-4-21 13:46:27 | 显示全部楼层
能否传一个例子上来,谢谢
回复

使用道具 举报

21

主题

481

回帖

544

积分

金牌会员

积分
544
 楼主| 发表于 2021-4-21 16:18:00 | 显示全部楼层
murphy 发表于 2021-4-21 13:46
能否传一个例子上来,谢谢

bool bsp_tp_cal (void)
{
        int xsize, ysize;
        int16_t adcx, adcy;
        touch_err_t tp_err;
        int x_cal[TOUCH_CAL_POINTS], y_cal[TOUCH_CAL_POINTS];
        uint8_t i;

        xsize =  LCD_GetXSize ();
        ysize =  LCD_GetYSize ();
        _init_cal_pos ();
        GUI_SetPenSize (3);
        // get touch input
        for (i = 0; i < TOUCH_CAL_POINTS;i++) {
                _tp_drv.flush ();
                _tp_scan.enable = 1;
                GUI_Clear ();
                GUI_DispStringAt ("Please touch the point", 20, ysize / 2 - 60);
                GUI_DrawCircle (_x_ref, _y_ref, 4);
                GUI_X_Delay (1000);

                // waiting touch pressed
                while (1) {
                        GUI_X_Delay (500);
                        _buf_out (&adcx, &adcy, &tp_err);
                        if (TOUCH_ERR_NONE == tp_err) {
                                _tp_drv.flush ();
                                break;
                        }
                }
                // ignore previous data
                while (1) {
                        GUI_X_Delay (500);
                        _buf_out (&adcx, &adcy, &tp_err);
                        if (TOUCH_ERR_NONE == tp_err) {
                                break;
                        }
                }

                _x_adc = (int)adcx;
                _y_adc = (int)adcy;

                GUI_DispStringAt ("The reading ADC", 10, ysize / 2 + 60);
                GUI_DispStringAt ("X: ", 10, ysize / 2 + 100);
                GUI_DispDec (_x_adc, 4);
                GUI_DispStringAt ("Y: ", 10, ysize / 2 + 100 + 40);
                GUI_DispDec (_y_adc, 4);
                GUI_X_Delay (2000);

                // waiting touch released
                while (1) {
                        GUI_X_Delay (100);
                        _buf_out (&adcx, &adcy, &tp_err);
                        if (TOUCH_ERR_ERROR == tp_err)
                                break;
                }
                _tp_scan.enable = 0;
                _tp_drv.flush ();

                GUI_X_Delay (3000);
                GUI_Clear ();

                GUI_DispStringHCenterAt ("Touch done, release the point", xsize / 2, ysize / 2 - 60);
                GUI_X_Delay (5000);
                GUI_Clear ();
        }

        if (GUI_TOUCH_CalcCoefficients (TOUCH_CAL_POINTS, &_x_ref[0], &_y_ref[0], &_x_adc[0], &_y_adc[0], xsize, ysize))
                return false;

        // verify calibration data
        for (i = 0; i < TOUCH_CAL_POINTS; i++) {
                x_cal = _x_adc;
                y_cal = _y_adc;
        }

        if (false == bsp_tp_cal_verify (&x_cal[0], &y_cal[0]))
                return false;

        GUI_X_Delay (1000);

        GUI_ClearKeyBuffer ();
        GUI_Clear ();

        //
        GUI_DispStringHCenterAt ("Touch panel calibration success...", xsize / 2, ysize / 2);
        GUI_X_Delay (3000);
        //
        _tp_drv.flush ();
        _tp_scan.enable = 1;
        _tp_drv.state_cal = 0;

        return true;

}
回复

使用道具 举报

42

主题

126

回帖

252

积分

特别照顾组

积分
252
发表于 2021-4-22 08:05:44 | 显示全部楼层
h_007 发表于 2021-4-21 16:18
bool bsp_tp_cal (void)
{
        int xsize, ysize;

官方有例程!
回复

使用道具 举报

42

主题

126

回帖

252

积分

特别照顾组

积分
252
发表于 2021-4-22 08:07:09 | 显示全部楼层
h_007 发表于 2021-4-21 16:18
bool bsp_tp_cal (void)
{
        int xsize, ysize;

工程能否看看?
我卡在校准后,校准点存EEPROM里,读出来就不起作用了,数据没错。
现在只用了官方2点校准。
回复

使用道具 举报

42

主题

126

回帖

252

积分

特别照顾组

积分
252
发表于 2021-4-22 08:10:08 | 显示全部楼层
1.那步实时校准我也成功了
2.我的是校准好,校准数据存EEPROM里后,读出来就没用了。不知道哪里还要设置什么。
官方5/7/9点校准还是挺喜欢的,不想自己再造轮子,保持emwin完整性好。
回复

使用道具 举报

21

主题

481

回帖

544

积分

金牌会员

积分
544
 楼主| 发表于 2021-4-22 11:32:28 | 显示全部楼层
xlzhu 发表于 2021-4-22 08:10
1.那步实时校准我也成功了
2.我的是校准好,校准数据存EEPROM里后,读出来就没用了。不知道哪里还要设置什 ...

你存的数据是ADC的值还是坐标的值?建议存ADC的值,加载(初始化)的时候调用GUI_TOUCH_CalcCoefficients()。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-5-20 10:17 , Processed in 0.236359 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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