- 打卡等级:以坛为家III
 
				- 打卡总天数:661
 
				
				
				- 最近打卡:2025-11-04 07:56:51
 
				  
荣誉版主 
 
	- 积分
 - 4485
 
 
 
 
 | 
 
Ai8051U最简最小系统实验板,实验触摸屏; ILI9341, SPI 
 
一块洞洞板,一片AI8051U芯片,一只按钮(P32),一只电源开关(On/Off), 一根USB通讯线。 
一块2.4寸ILI9341(320*240)SPI接口彩色触摸屏,一字排列14针接口。(RMB 20) 
 
     
 
 
 
 
实验初成,随手试画了一下,若做触摸菜单,基本没有问题, 还有待打磨优化提高。 
 
望爱好AI8051U单片机同学、尚未得到实验箱的新手坛友,莫等闲,动动手,一定会做得更好。 
 
主程序:(供参考) 
 
/*-------------------------------------------------------------------------*/ 
/* 基于: AI8051U_自制最小系统实验板 ---------------------------*/ 
/* 实验: 2.4寸(320*240)触摸屏(14针一字排列接口)LCD9431_SPI_Touxh.C 显示屏   */ 
/* 实现: 触摸屏+实验画图板                                                */ 
/* 编程: 浦晓明(浦江一水) 2024.11.25                                  */                                    
//==液晶屏数据/控制线接线====================// 
//本模块为SPI接口类型 (+5V供电) 
//液晶屏模块        AI8051U   说明 
//1. VCC             VCC     电源  
//2. GND             GND     接地  
//3. CS               P26     屏片选      0:选中 1:未选 
//4. RST             P27     屏复位      0:运行 1:复位  
//5. DC              P45     屏数据指令切换0:数据 1:指令  
//6. SDI             P46     屏数据输入  MCU发送 
//7. SCK             P07     屏时钟      MCU上升沿写入/下降沿读取   
//8. LED             P06     屏背光控制  0:灭 1:亮 
//9. SDO            P05     屏数据输出  MCU接收  
//10.T_CLK        P04     触摸板时钟   
//11.T_CS          P03     触摸板片选 
//12.T_DI          P02     触摸板数据输入  MCU发送 
//13.T_DO         P01     触摸板数据输出  MCU接收 
//14.T_IRQ        P00     触摸板状态/请求 MCU接收/查询 0:无触摸 1:有触摸(点压下) 
//==================================================// 
 
#include "AI8051U_SYS.H" 
#include "LCD9341_SPI.h"  //2.4彩屏ILI9431(320*240)驱动 
#include "PTouch.H"          //2.4彩屏四线电阻触摸屏驱动 
 
//全局变量说明 
unsigned int  X,Y;    //触摸点坐标 
unsigned char k;     //返回键值 
unsigned char disp; //显示标志  
unsigned char PenC; //笔色  
char S[80];           //字符串显示缓存 
 
//函数说明 
unsigned char RDKEY(void);//读取触摸屏键值 
void BigPoint(u16 X,u16 Y,u8 Color); 
 
//主函数入口 
void main() 
{ u8 i; 
  P_SW2 = 0x80;         //使能访问XFR,没有冲突不用关闭  
  CKCON = 0x00;         //外部数据总线速度最快 
  WTST  = 0x00;         //程序等待参数,0最快 
 
  P0M0 = 0x00; P0M1 = 0x00;     //初始化端口:全准双向 
  P1M0 = 0x00; P1M1 = 0x00; 
  P2M0 = 0x00; P2M1 = 0x00; 
  P3M0 = 0x00; P3M1 = 0x00; 
  P4M0 = 0x00; P4M1 = 0x00; 
  P5M0 = 0x00; P5M1 = 0x00; 
     
  P3M0 &= ~0x03; P3M1 |= 0x03;  //确保P30/P31准确设置 
   
  LCD_Init(); 
  disp=1; 
  while (1) 
  { if(disp) 
    { disp=0; 
      LCD_CLS(15); 
      LCD_Box(0, 0,239,20,0,0,0); 
      LCD_Str16(8,2,"X=--- Y=---",10,0); //显示字符串 
      LCD_Str16(180,2,"AI8051U",12,0);   //显示字符串 
      for(i=0;i<8;i++)LCD_Box(30*i,280,30,20,15,15,i); 
      for(i=0;i<8;i++)LCD_Box(30*i,300,30,20,15,15,(u8)(i+8)); 
      LCD_Str16(213,302,"CLS",0,15);        
    } 
    k=0; k=RDKEY(); //读取按键或触摸点键值...  
    if(k!=0) 
    { if(k>15) 
      { sprintf(S,"X=%03d",X); LCD_Str16( 8,2,S,10,0);  //显示触摸点坐标X  
        sprintf(S,"Y=%03d",Y); LCD_Str16(56,2,S,10,0);  //显示触摸点坐标Y 
        BigPoint(X,Y,PenC); 
      } 
    } 
    //delay_ms(10);  //延时50ms 
  }               //无限循环          
} //主函数main()结束 
 
 
//扫描触摸屏返回键值 
unsigned char RDKEY(void) 
{ k=0;   //当前页面按键和触摸点返回值(因页面不同而不同) 
  if(PTouchOK()){ X=240-TP.x; Y=TP.y; }   //坐标转换(由屏方向不同而不同) 
  else          { X=0;        Y=0;    } 
  if((Y>20)&&(Y<280)){ k=18; return k;}   //画笔有效区域  
  if((X>  0)&&(X< 30)&&(Y>280)&&(Y<300)){ k=16; PenC=0; return k;} 
  if((X> 30)&&(X< 60)&&(Y>280)&&(Y<300)){ k=1;  PenC=1; return k;} 
  if((X> 60)&&(X< 90)&&(Y>280)&&(Y<300)){ k=2;  PenC=2; return k;} 
  if((X> 90)&&(X<120)&&(Y>280)&&(Y<300)){ k=3;  PenC=3; return k;}    
  if((X>120)&&(X<150)&&(Y>280)&&(Y<300)){ k=4;  PenC=4; return k;}    
  if((X>150)&&(X<180)&&(Y>280)&&(Y<300)){ k=5;  PenC=5; return k;} 
  if((X>180)&&(X<210)&&(Y>280)&&(Y<300)){ k=6;  PenC=6; return k;} 
  if((X>210)&&(X<240)&&(Y>280)&&(Y<300)){ k=7;  PenC=7; return k;} 
  if((X>  0)&&(X< 30)&&(Y>300)&&(Y<320)){ k=8;  PenC=8; return k;} 
  if((X> 30)&&(X< 60)&&(Y>300)&&(Y<320)){ k=9;  PenC=9; return k;} 
  if((X> 60)&&(X< 90)&&(Y>300)&&(Y<320)){ k=10; PenC=10;return k;} 
  if((X> 90)&&(X<120)&&(Y>300)&&(Y<320)){ k=11; PenC=11;return k;} 
  if((X>120)&&(X<150)&&(Y>300)&&(Y<320)){ k=12; PenC=12;return k;} 
  if((X>150)&&(X<180)&&(Y>300)&&(Y<320)){ k=13; PenC=13;return k;} 
  if((X>180)&&(X<210)&&(Y>300)&&(Y<320)){ k=14; PenC=14;return k;} 
  if((X>210)&&(X<240)&&(Y>300)&&(Y<320)){ k=15; PenC=0; disp=1; return k;} 
  return k; 
}   
//画一大点 
void BigPoint(u16 X,u16 Y,u8 Color) 
{  
  LCD_Point(X,  Y,Color); 
  LCD_Point(X-1,Y,Color); 
  LCD_Point(X+1,Y,Color); 
  LCD_Point(X-1,Y-1,Color); 
  LCD_Point(X,  Y-1,Color); 
  LCD_Point(X+1,Y-1,Color); 
  LCD_Point(X-1,Y+1,Color); 
  LCD_Point(X,  Y+1,Color); 
  LCD_Point(X+1,Y+1,Color); 
} 
//===== END ================ 
 
 
 
 
 |   
 
2
喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
 
- 
 
+2 
楼主威武~ 
 
- 
 
+2 
楼主威武~ 
 
 
 
 
 
 |