📄 touchpad.lst
字号:
282 /*==================================================================
283 * Function : tp_read_adc
284 * Description : 得到触摸坐标
285 * Input Para : void
286 * Output Para : U16 * X, U16 * Y,若全为0表示获得坐标不成功
287 * Return Value: void
288 ==================================================================*/
289 void tp_read_adc(U16 * X, U16 * Y)
290 {
291 1 U8 cmd = 0;
292 1
293 1 /*读取X 坐标X ADC*/
294 1 cmd=TOUCH_PANEL_START_BIT|TOUCH_PANEL_Y_PLUS|TOUCH_PANEL_12BIT_SAMPLE| TOUCH_PANEL_DIFF_MODE;
295 1 serial_write_data(cmd);
296 1 *X=serial_read_data();
297 1
298 1 cmd = 0;
299 1 /*读取Y 坐标Y ADC*/
300 1 cmd=TOUCH_PANEL_START_BIT|TOUCH_PANEL_X_PLUS|TOUCH_PANEL_12BIT_SAMPLE| TOUCH_PANEL_DIFF_MODE ;
301 1 serial_write_data(cmd);
302 1 *Y=serial_read_data();
C51 COMPILER V7.10 TOUCHPAD 04/14/2009 23:28:41 PAGE 6
303 1
304 1 /*触摸屏的范围大于LCD屏幕范围,判断是否超出了四周的边框*/
305 1 if(*X < 0x0080 || *Y < 0x0080 || *X > 0xF80 || *Y > 0xF80)
306 1 {
307 2 *X = 0;
308 2 *Y = 0;
309 2 }
310 1
311 1 }
312
313
314 /*
315 由于触摸部分的应用和各自系统紧密相关,
316 单纯的触摸屏驱动只需提供tp_init()和tp_read_adc()两个函数即可。
317 用户可以用类似下面的函数打印函数或者触摸坐标,以此知道是否调试成功:
318 void TestTP(void)
319 {
320 U16 XPos = 0;
321 U16 YPos = 0;
322
323 while (1)
324 {
325 tp_read_adc(&XPos, &YPos);
326
327 if ((XPos == 0) || (YPos == 0))
328 {
329 uty_delay(0x1000);
330 }
331 else
332 {
333 XPos = (XPos - TPargX.A) / TPargX.K;
334 YPos = (YPos - TPargY.A) / TPargY.K;
335
336 uprintf("\nX=");
337 uputchar(XPos >> 8);
338 uputchar(XPos& 0xFF);
339 uprintf(" Y=");
340 uputchar(YPos >> 8);
341 uputchar(YPos & 0xFF);
342 break;
343 }
344 }
345
346 return;
347 }
348
349
350 在设计各自的触摸应用程序时,可以参考以下3个函数,
351 完成校准和显示轨迹
352 */
353
354
355
356
357 /*以下两部分,在创易demo系统中放在别的文件中,这里拷贝过来,供参考*/
358 #if 0
/*==================================================================
* Function : extern_interrupt1
* Description : 触摸中断处理函数,检测到触摸后需要调用tp_task
* Input Para :
C51 COMPILER V7.10 TOUCHPAD 04/14/2009 23:28:41 PAGE 7
* Output Para :
* Return Value:
==================================================================*/
void extern_interrupt1(void) interrupt 2
{
EX1 = 0;
tp_read_adc(&TP_X, &TP_Y);
if(TP_X > 0)
{
/*一笔的开始*/
bTP_INT = TRUE;
MSTimerStart(MSTIMERMODE_HANDLE_IN_MSG, 10, tp_task);
}
else
{
IE1 = 0;
EX1 = 1;
}
}
/*==================================================================*/
extern void lcd_display(EColor color);
/*case LCD_TP_CALI: 分支,显示了校准的界面*/
#endif
396
397
398
399
400 U8 Cali_Cnt = 0;
401
402
403 /*==================================================================
404 * Function : tp_task
405 * Description : 触摸应用的主要函数,在触摸中断处理中需要调用这个函数
406 在5ms定时器处理中也需要调用这个函数
407 * Input Para : void
408 * Output Para : void
409 * Return Value: void
410 ==================================================================*/
411 void tp_task(void)
412 {
413 1 if(bTP_Cali == TRUE)
414 1 {
415 2
416 2 /*校准,需要先后采集两个点,都是从中断处理中获得的坐标,
417 2 所以处理完不要完了开中断*/
418 2
419 2 if(Cali_Cnt == 0)
420 2 {
421 3 /*采集第一个点*/
422 3
423 3
424 3 /*大致判断是否在右下*/
425 3 if(TP_X < 2048 || TP_Y < 2048)
426 3 {
C51 COMPILER V7.10 TOUCHPAD 04/14/2009 23:28:41 PAGE 8
427 4 IE1 = 0;
428 4 EX1 = 1;
429 4 return;
430 4 }
431 3
432 3 TPposA.X= TP_X;
433 3 TPposA.Y = TP_Y;
434 3 Cali_Cnt++;
435 3
436 3 /* 清除第一个点,画第二个点 */
437 3 lcd_display_rectangle_color(58, 78, 62, 82, BLUE);
438 3 lcd_display_rectangle_color(178, 238, 182, 242, WHITE);
439 3 }
440 2 else
441 2 {
442 3 /*采集第二个点*/
443 3
444 3
445 3 /*大致判断是否在左上*/
446 3 if(TP_X > 2048 || TP_Y > 2048)
447 3 {
448 4 IE1 = 0;
449 4 EX1 = 1;
450 4 return;
451 4 }
452 3
453 3 TPposB.X= TP_X;
454 3 TPposB.Y = TP_Y;
455 3
456 3 /*校准结束,恢复标志变量*/
457 3 Cali_Cnt = 0;
458 3
459 3 /*清除第二个点*/
460 3 lcd_display_rectangle_color(58, 78, 62, 82, WHITE);
461 3 bTP_Cali = FALSE;
462 3
463 3 /*重新计算参数*/
464 3 TPargX.K = (TPposA.X - TPposB.X) / 120; /*120 = 180 -60*/
465 3 TPargY.K = (TPposA.Y - TPposB.Y) / 160; /*160 = 240 - 80*/
466 3
467 3 TPargX.A = TPposB.X -(TPargX.K * 60); /*60 = Bx*/
468 3 TPargY.A = TPposB.Y -(TPargY.K * 80); /*80 = By*/
469 3
470 3 /*用户可以自己考虑校验失败的可能,
471 3 最简单的方法就是限定TPargX TPargY的四个值在一定范围内*/
472 3
473 3 #if 0/*通过打印获取初始值*/
uprintf("\nAx=");
uputchar(TPposA.X >> 8);
uputchar(TPposA.X & 0xFF);
uprintf("Ay=");
uputchar(TPposA.Y >> 8);
uputchar(TPposA.Y & 0xFF);
uprintf("Bx=");
uputchar(TPposB.X >> 8);
uputchar(TPposB.X & 0xFF);
uprintf("By=");
uputchar(TPposB.Y >> 8);
uputchar(TPposB.Y & 0xFF);
uprintf("\nXk=");
C51 COMPILER V7.10 TOUCHPAD 04/14/2009 23:28:41 PAGE 9
uputchar(TPargX.K >> 8);
uputchar(TPargX.K & 0xFF);
uprintf("Xa=");
uputchar(TPargX.A >> 8);
uputchar(TPargX.A & 0xFF);
uprintf("Yk=");
uputchar(TPargY.K >> 8);
uputchar(TPargY.K & 0xFF);
uprintf("Ya=");
uputchar(TPargY.A >> 8);
uputchar(TPargY.A & 0xFF);
#endif
502 3 }
503 2 IE1 = 0;
504 2 EX1 = 1;
505 2 }
506 1 else
507 1 {
508 2 /*显示触摸轨迹*/
509 2
510 2 if(bTP_INT)
511 2 {
512 3 /*一笔的起点,坐标从中断中获得*/
513 3 lcd_display_dot((TP_X - TPargX.A) / TPargX.K, (TP_Y - TPargY.A) / TPargY.K);
514 3 #if 0
uprintf("\nX1=");
uputchar(TP_X);
uprintf(" Y1=");
uputchar(TP_Y);
#endif
520 3
521 3 bTP_INT = FALSE;
522 3
523 3 /*5ms之后再次调用tp_task*/
524 3 MSTimerStart(MSTIMERMODE_HANDLE_IN_MSG, 5, tp_task);
525 3 }
526 2 else
527 2 {
528 3 /*定时器处理,需要主动读取坐标*/
529 3 tp_read_adc(&TP_X, &TP_Y);
530 3
531 3 if(TP_X > 0)
532 3 {
533 4 lcd_display_dot((TP_X - TPargX.A) / TPargX.K, (TP_Y - TPargY.A) / TPargY.K);
534 4 #if 0
uprintf("\nX2=");
uputchar(TP_X);
uprintf(" Y2=");
uputchar(TP_Y);
#endif
540 4
541 4 /*5ms之后再次调用tp_task*/
542 4 MSTimerStart(MSTIMERMODE_HANDLE_IN_MSG, 5, tp_task);
543 4 }
544 3 else
545 3 {
546 4 /*没有读到有效的坐标,一笔结束,重新打开中断*/
547 4 IE1 = 0;
548 4 EX1 = 1;
549 4 }
550 3 }
C51 COMPILER V7.10 TOUCHPAD 04/14/2009 23:28:41 PAGE 10
551 2 }
552 1 }
553
554
555
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 756 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 21 10
IDATA SIZE = ---- ----
BIT SIZE = 2 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -