浦江一水 发表于 2024-11-21 12:06:27

基于AI8051U_V1.2实验箱_学习实验之触摸屏编程基础

基于AI8051U_V1.2实验箱_学习实验之触摸屏编程基础


本实验体现当点击触摸屏任意位置时, 显示点击点坐标值,
并执行不同的程序代码,在点击所在区域,显示不同色矩形块。
程序开始是黑色清屏,此后点击桌上角区域,可执行清屏。
请看图:这是在满屏不同区域,点击15次以后的结果。



主程序源码:
//=====================================================================
// 文件名称: Main.C
// 功能说明: 测试 2.4寸彩色触摸显示屏 240*320 8位并行口模式(专用屏)
// 基于电路: AI8051U 实验箱V1.2 (感谢"江苏国芯科技"馈赠)
// 整理改编: 浦晓明(浦江一水) 2024-11-20
//=== 硬件连接 =========================================================
//======================电源接线========================================
//SYS-VCC 3.3V电源
//USB+5V5.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;         //字符串显示缓存
//函数说明(排列在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)//根据不同触摸点,绘制不同色矩形色块
      { case1: LCD_Box( 80,0,80,60,15,15,1);   break; //1号暗蓝
      case2: LCD_Box(160,0,80,60,15,15,2);   break; //2号暗绿
      case3: LCD_Box(240,0,80,60,15,15,3);   break; //3号暗青
      case4: LCD_Box(0,60,80,60,15,15,4);break; //4号暗红
      case5: LCD_Box( 80,60,80,60,15,15,5);break; //5号暗紫
      case6: LCD_Box(160,60,80,60,15,15,6);break; //6号暗黄
      case7: LCD_Box(240,60,80,60,15,15,7);break; //7号暗灰
      case8: LCD_Box(0,120,80,60,15,15,8); break; // 8号亮灰
      case9: 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单片机爱好者坛友,在配屏测试时选择使用。




可执行代码:





autopccopy 发表于 2024-11-21 13:17:45

浦江版主出品必属精品!{:4_213:}

4

Matrix 发表于 2024-11-21 13:38:06

厉害了

浦江一水 发表于 2024-11-21 20:44:25

感谢 autopccopy 版主的鲜花鼓励。
感谢 国学芯用版主的鲜花鼓励。
感谢 神农鼎 管理员的鲜花鼓励。

记得年初时节,神管曾留言“挂个荣誉版主?TFT/LCD...”,俺当时复“新人新手,岂敢岂敢”。
一直以来,承蒙诸位鼓励、抬爱,心存感激。
而今,被神管指为“荣誉版主”,实在诚惶诚恐,恭敬不如从命了。
俺自知才疏学浅、井底之蛙,唯有继续努力学习,
在有生之年,为国芯弘扬广大,竭微薄之力,别辜负了大家期望。
若有不妥之处,还望多包涵,及时指正。

神农鼎 发表于 2024-11-21 21:01:54

咱们这个 TFT版块 挂在 TinyML 版块下面,
就是为了51实际全面进入以 【触摸输入】+【TFT彩屏显示】为基础的
AI 8051 Ultra 时代,荣誉版主们任重道远

咱们这个版块下面就是 RTOS版块,Ai8052U到来时,
就是51世界全面 进入【 RTOS + TFT + 触摸 + AI 】的时候

lgnstar 发表于 2024-12-7 09:19:47

<p><img alt="qiang" class="emoji" src="https://www.stcaimcu.com/static/image/smiley/default/qiang.gif" title="qiang" /></p>

305444337 发表于 2024-12-8 12:34:21

<p><img alt="qiang" class="emoji" src="https://www.stcaimcu.com/static/image/smiley/default/qiang.gif" title="qiang" /></p>

STC企鹅 发表于 2024-12-9 12:32:31

<p><img alt="qiang" class="emoji" src="https://www.stcaimcu.com/static/image/smiley/default/qiang.gif" title="qiang" /></p>

markxu 发表于 2025-2-14 11:35:57

学习了,谢谢分享
页: [1]
查看完整版本: 基于AI8051U_V1.2实验箱_学习实验之触摸屏编程基础