1. 程式人生 > >韋東山ARM第一期作業(九)觸控式螢幕

韋東山ARM第一期作業(九)觸控式螢幕

文章目錄


01 - 作業所在路徑

  ARM裸機1期加強版\原始碼文件圖片\文件圖片\第018課_ADC和觸控式螢幕

02 - 作業描述

  1. 百度搜索下載tslib庫
  2. 分析它的較準函式(不需要理解原理)、移植
  3. tslib還有其他功能,比如判斷連續點之間的距離,如果過大就丟棄。
    這可以解決我們程式中出現的問題:畫線時突然有某個點在很遠的距離出現

03 - 作業解答

  tslib庫的運算量太大,有大量的浮點數乘除法運算,目前的裸版程式碼不支援,移植沒有問題,只是計算出錯,除法運算庫不夠強大
ts_calibrate.h

#ifndef _TSCALIBRATE_H
#define _TSCALIBRATE_H

typedef struct {
	int x[5], xfb[5];
	int y[5], yfb[5];
	int a[7];
} calibration;

int perform_calibration(calibration *cal);

#endif /* _TSCALIBRATE_H */

ts_calibrate.c

#include "../uart.h"
#include "ts_calibrate.h"

int perform_calibration(calibration *
cal) { int j; double n, x, y, x2, y2, xy, z, zx, zy; double det, a, b, c, e, f, i; double scaling = 65536.0; /* Get sums for matrix */ n = x = y = x2 = y2 = xy = 0; for (j = 0; j < 5; j++) { n += 1.0; x += (double)cal->x[j]; y += (double)cal->y[j]; x2 += (double)(cal->x[j]*cal-
>x[j]); y2 += (double)(cal->y[j]*cal->y[j]); xy += (double)(cal->x[j]*cal->y[j]); } /* Get determinant of matrix -- check if determinant is too small */ det = n*(x2*y2 - xy*xy) + x*(xy*y - x*y2) + y*(x*xy - y*x2); if (det < 0.1 && det > -0.1) { printf("ts_calibrate: determinant is too small -- %d\n\r", (int)det); return 0; } /* Get elements of inverse matrix */ a = (x2*y2 - xy*xy)/det; b = (xy*y - x*y2)/det; c = (x*xy - y*x2)/det; e = (n*y2 - y*y)/det; f = (x*y - n*xy)/det; i = (n*x2 - x*x)/det; printf("abcefi:%d %d %d %d %d %d \r\n",a,b,c,e,f,i); /* Get sums for x calibration */ z = zx = zy = 0; for (j = 0; j < 5; j++) { z += (double)cal->xfb[j]; zx += (double)(cal->xfb[j]*cal->x[j]); zy += (double)(cal->xfb[j]*cal->y[j]); } /* Now multiply out to get the calibration for framebuffer x coord */ cal->a[0] = (int)((a*z + b*zx + c*zy)*(scaling)); cal->a[1] = (int)((b*z + e*zx + f*zy)*(scaling)); cal->a[2] = (int)((c*z + f*zx + i*zy)*(scaling)); printf("%d %d %d\n\r", (cal->a[0]), (cal->a[1]), (cal->a[2])); /* Get sums for y calibration */ z = zx = zy = 0; for (j = 0; j < 5; j++) { z += (double)cal->yfb[j]; zx += (double)(cal->yfb[j]*cal->x[j]); zy += (double)(cal->yfb[j]*cal->y[j]); } /* Now multiply out to get the calibration for framebuffer y coord */ cal->a[3] = (int)((a*z + b*zx + c*zy)*(scaling)); cal->a[4] = (int)((b*z + e*zx + f*zy)*(scaling)); cal->a[5] = (int)((c*z + f*zx + i*zy)*(scaling)); printf("%d %d %d\n\r", (cal->a[3]), (cal->a[4]), (cal->a[5])); /* If we got here, we're OK, so assign scaling to a[6] and return */ cal->a[6] = (int)scaling; return 1; }

  然後在原來程式碼tslib.c的ts_calibrate()函式中呼叫

	……
	if (g_ts_xy_swap)
	{
		/* 對調所有點的XY座標 */
		swap_xy(&(cal.x[0]), &(cal.y[0]));
		swap_xy(&(cal.x[1]), &(cal.y[1]));
		swap_xy(&(cal.x[2]), &(cal.y[2]));
		swap_xy(&(cal.x[3]), &(cal.y[3]));
		swap_xy(&(cal.x[4]), &(cal.y[4]));
	}
	print_cal(&cal);
	/* 執行校準 */
	perform_calibration(&cal);
	//print_cal(&cal); //出錯,計算錯誤
	……