- 打卡等级:以坛为家III
 
				- 打卡总天数:661
 
				
				
				- 最近打卡:2025-11-04 07:56:51
 
				  
荣誉版主 
 
	- 积分
 - 4485
 
 
 
 
 | 
 
基于AI8051U_V1.2实验箱_学习实验之触摸屏编程基础 
 
 
本实验体现当点击触摸屏任意位置时, 显示点击点坐标值, 
并执行不同的程序代码,在点击所在区域,显示不同色矩形块。 
程序开始是黑色清屏,此后点击桌上角区域,可执行清屏。 
请看图:  这是在满屏不同区域,点击15次以后的结果。 
 
 
 
 
主程序源码: 
//===================================================================== 
// 文件名称: Main.C 
// 功能说明: 测试 2.4寸彩色触摸显示屏 240*320 8位并行口模式(专用屏) 
// 基于电路: AI8051U 实验箱V1.2 (感谢"江苏国芯科技"馈赠) 
// 整理改编: 浦晓明(浦江一水) 2024-11-20 
//=== 硬件连接 ========================================================= 
//======================电源接线======================================== 
//SYS-VCC 3.3V电源 
//USB+5V  5.0V电源(为显示屏供电) 
//GND接地 
//===============液晶屏数据/控制线接线=================================== 
//本模块数据总线类型为8位并口 (+5V供电) 
//液晶屏模块              AI8051U  
// LCD_D0~D7  接       P20~P27       //液晶屏8位数据线 
// LCD_RS        接       P45           //数据/命令选择控制信号 
// LCD_RD        接       P37           //读控制信号 
// LCD_WR       接       P36           //写控制信号 
// LCD_CS        接       P05           //片选控制信号 
// LCD_RST      接       P47           //复位信号 
//=== 四线电阻触摸屏IO ================================================== 
// 端口定义: 接口类型 SPI  
// PEN    =   P1^4;   //触摸屏笔状态: 0:按下 1:抬起 
// TCS    =   P1^5;   //触摸屏片选端: 0:选中 1:未选中  
// DCLK  =   P3^2;   //时钟控制(上升沿将数据输出/下降沿将数据输入) 
// DOUT =   P3^3;   //MISO 触摸屏数据输出 单片机MCU输入 
// DIN    =   P3^4;   //MOSI 触摸屏数据输入 单片机MCU输出 
//**********************************************************************/ 
#include "AI8051U.H" 
#include "AI8051U_SYS.H" 
#include "LCD9341.H"     //显示屏驱动 
#include "PTouch.H"       //触摸屏驱动 
 
 
//全局变量说明 
unsigned int X,Y;  //触摸点坐标 
unsigned char k;   //返回键值 
char S[80];           //字符串显示缓存 
//函数说明(排列在main()之后的函数须先说明一下) 
unsigned char RDKEY(void);   //读取键值(触摸点) 
 
 
//主函数 
void main(void) 
{ 
  SYS_Init();           //系统初始化 
  LCD_Init();            //液晶屏初始化 
//LCD_SetDIR(0);   //原显示方向(纵向屏) 
  LCD_SetDIR(3);    //调整显示方向(横屏) 
  LCD_CLS(0);        //清屏(蓝色) 
  LCD_Str16(10,10,"PTouch",15,0); 
  delay_us(50); 
  while(1) 
  {  
    k=0; k=RDKEY(); //读取按键或触摸点键值...  
    if(k!=0) 
    { switch(k)  //根据不同触摸点,绘制不同色矩形色块 
      { case  1: LCD_Box( 80,0,80,60,15,15,1);   break; //1号暗蓝 
        case  2: LCD_Box(160,0,80,60,15,15,2);   break; //2号暗绿 
        case  3: LCD_Box(240,0,80,60,15,15,3);   break; //3号暗青 
        case  4: LCD_Box(  0,60,80,60,15,15,4);  break; //4号暗红 
        case  5: LCD_Box( 80,60,80,60,15,15,5);  break; //5号暗紫 
        case  6: LCD_Box(160,60,80,60,15,15,6);  break; //6号暗黄 
        case  7: LCD_Box(240,60,80,60,15,15,7);  break; //7号暗灰 
        case  8: LCD_Box(  0,120,80,60,15,15,8); break; // 8号亮灰 
        case  9: LCD_Box( 80,120,80,60,15,15,9); break; // 9号亮蓝 
        case 10: LCD_Box(160,120,80,60,15,15,10);break; //10号亮绿 
        case 11: LCD_Box(240,120,80,60,15,15,11);break; //11号亮青 
        case 12: LCD_Box(  0,180,80,60,15,15,12);break; //12号亮红 
        case 13: LCD_Box( 80,180,80,60,15,15,13);break; //13号亮紫 
        case 14: LCD_Box(160,180,80,60,15,15,14);break; //14号亮黄 
        case 15: LCD_Box(240,180,80,60,0,0,15);  break; //15号亮白 
        case 16: LCD_CLS(0);  break; //点触摸左上角0号黑色清屏  
      }  k=0; 
      sprintf(S,"X=%03d",X); LCD_Str16(10,10,S,15,0);  //显示触摸点坐标X  
      sprintf(S,"Y=%03d",Y); LCD_Str16(10,30,S,15,0);  //显示触摸点坐标Y    
    } 
    delay_ms(50);     //延时50ms 
  }  
} 
//扫描按键和触摸屏返回键值 
//为屏键双用而预设计... 
unsigned char RDKEY(void) 
{ k=0;   //当前页面按键和触摸点返回值(因页面不同而不同) 
  if(PTouchOK()){ X=320-TP.y; Y=240-TP.x; } //坐标转换(由屏方向不同而不同) 
  else                { X=0;        Y=0;        } 
  if((X> 10)&&(X< 80)&&(Y>0)&&(Y<60))k=16;    
  if((X> 80)&&(X<160)&&(Y>0)&&(Y<60))k=1;    
  if((X>160)&&(X<240)&&(Y>0)&&(Y<60))k=2;    
  if((X>240)&&(X<320)&&(Y>0)&&(Y<60))k=3;    
  if((X> 10)&&(X< 80)&&(Y>60)&&(Y<120))k=4;    
  if((X> 80)&&(X<160)&&(Y>60)&&(Y<120))k=5;    
  if((X>160)&&(X<240)&&(Y>60)&&(Y<120))k=6;    
  if((X>240)&&(X<320)&&(Y>60)&&(Y<120))k=7;    
  if((X> 10)&&(X< 80)&&(Y>120)&&(Y<180))k=8;    
  if((X> 80)&&(X<160)&&(Y>120)&&(Y<180))k=9;    
  if((X>160)&&(X<240)&&(Y>120)&&(Y<180))k=10;    
  if((X>240)&&(X<320)&&(Y>120)&&(Y<180))k=11;    
  if((X> 10)&&(X< 80)&&(Y>180)&&(Y<240))k=12;    
  if((X> 80)&&(X<160)&&(Y>180)&&(Y<240))k=13;    
  if((X>160)&&(X<240)&&(Y>180)&&(Y<240))k=14;    
  if((X>240)&&(X<320)&&(Y>180)&&(Y<240))k=15;    
  return k; 
}   
//==== END ========================================================= 
 
 
 
由于触摸屏驱动与显示屏驱动密切相关,本人的显示屏驱动自成体系,与官方例程中的显示屏驱动不同, 
所以对触摸屏部分代码,进行了重新整理改编,脱离显示屏驱动而独立存在,以便移植匹配不同的显示屏。 
触摸屏部分代码,还在打磨之中,尚未成熟定型,为避免涉嫌误人子弟,故暂时不便开源。 
可执行代码可作为另外一种方式的触摸屏测试软件, 
供有兴趣的Ai8051U单片机爱好者坛友,在配屏测试时选择使用。 
 
 
 
 
可执行代码: 
 
 
TestPTouch.rar
(13.13 KB, 下载次数: 131)
 
 
 
 
 |   
 
3
喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
 
- 
 
+2 
楼主威武~ 
 
- 
 
+2 
楼主威武~ 
 
- 
 
+5 
楼主威武~ 
 
 
 
 
 
 |