- 打卡等级:以坛为家II
- 打卡总天数:493
- 最近打卡:2025-05-01 08:31:58
荣誉版主
- 积分
- 3476
|
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
楼主威武~
|