- 打卡等级:以坛为家II
- 打卡总天数:493
- 最近打卡:2025-05-01 08:31:58
荣誉版主
- 积分
- 3476
|
基于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, 下载次数: 36)
|
3
喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
-
+2
楼主威武~
-
+2
楼主威武~
-
+5
楼主威武~
|