嵌入式软件设计第5次实验报告
学号:140201225 姓名:刘曦洋
组别:第1组 实验地点:D19
一、实验目的:
1、了解触摸屏原理。
2、掌握触摸屏控制器GT9147的驱动方法。
二、实验内容:
1.编写程序利用触摸屏在LCD上画线。
2.编写程序点击LCD上显示的按钮,以触发LED灯和蜂鸣器事件。
三、实验过程描述及结果展示:
实验原理:
触摸屏硬件连接图:
管脚对应关系:
T_PEN(CT_INT):中断输出信号;
T_CS(CT_RST):复位信号;
T_CLK(CT_SCL):IIC接口的SCL信号;
T_MOSI(CT_SDA):IIC接口的SDA信号
触摸屏驱动流程:
LCD接口设置方法:
1)设置STM32F4 与触摸屏驱动模块GT9147相连接的IO。
2)初始化GT9147模块。
3)通过查询方式读取GT9147的寄存器(0X814E)判断是否有有效触点。
tp_dev数据结构:
实验一代码:
int k=0;
delay_init(168); //初始化时钟
uart_init(115200); //初始化串口
LCD_Init(); //初始化液晶屏
tp_dev.init(); //初始化触摸屏
LCD_Clear(WHITE);
POINT_COLOR = RED; //画笔字体设置为红色
{
u8 t=0;
u8 i=0;
u16 lastpos[5][2]; //定义二维数组存放最后一次的触摸数据
while(1)
{
tp_dev.scan(0);
for(t=0;t<5;t++)
{
if(tp_dev.sta&(1<<t))
{
if(tp_dev.x[t]<lcddev.width && tp_dev.y[t]<lcddev.height)
{
if(lastpos[t][0] == 0xFFFF)
{
lastpos[t][0] = tp_dev.x[t]; //将X的坐标放进去
lastpos[t][1] = tp_dev.y[t]; //将Y的坐标放进去
}
for(i=0;i<5;i++)
LCD_DrawLine(lastpos[t][0]-i,lastpos[t][1],tp_dev.x[t]-i,tp_dev.y[t]);
for(i=0;i<5;i++)
LCD_DrawLine(lastpos[t][0]+i,lastpos[t][1],tp_dev.x[t]+i,tp_dev.y[t]);
for(i=0;i<5;i++)
LCD_DrawLine(lastpos[t][0],lastpos[t][1]-i,tp_dev.x[t],tp_dev.y[t]-i);
for(i=0;i<5;i++)
LCD_DrawLine(lastpos[t][0],lastpos[t][1]+i,tp_dev.x[t],tp_dev.y[t]+i);
lastpos[t][0] = tp_dev.x[t]; //更新坐标点
lastpos[t][1] = tp_dev.y[t];
}
}else lastpos[t][0] = 0xFFFF;
}
delay_ms(5);
}
实验二代码:
int k=0;
int main(void)
{
//int k=0;
delay_init(168); //?????
uart_init(115200); //?????
LCD_Init(); //??????
tp_dev.init(); //??????
{
GPIO_InitTypeDef GPIO_InitStructure1;
GPIO_InitTypeDef GPIO_InitStructure2;
GPIO_InitTypeDef GPIO_InitStructure3;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);
GPIO_InitStructure1.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure1.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure1.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure1.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure1.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_Init(GPIOF,&GPIO_InitStructure1);
GPIO_InitStructure2.GPIO_Pin = GPIO_Pin_9;//???GPIOF8??
GPIO_InitStructure3.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure2.GPIO_Mode = GPIO_Mode_OUT;//????
GPIO_InitStructure2.GPIO_OType = GPIO_OType_PP;//????
GPIO_InitStructure2.GPIO_Speed = GPIO_Speed_100MHz;//GPIO????
GPIO_InitStructure2.GPIO_PuPd = GPIO_PuPd_UP;//???????
GPIO_InitStructure3.GPIO_Mode = GPIO_Mode_OUT;//????
GPIO_InitStructure3.GPIO_OType = GPIO_OType_PP;//????
GPIO_InitStructure3.GPIO_Speed = GPIO_Speed_100MHz;//GPIO????
GPIO_InitStructure3.GPIO_PuPd = GPIO_PuPd_UP;//???????
GPIO_Init(GPIOF,&GPIO_InitStructure2);
GPIO_Init(GPIOF,&GPIO_InitStructure3);
}
LCD_Clear(WHITE);
POINT_COLOR = RED; //?????????
{
u8 t=0;
u8 i=0;
POINT_COLOR = BLACK;
for(i=90;i<=100;i++)
LCD_Draw_Circle(239,50,25);
LCD_DrawLine(39,99,439,99);
LCD_DrawLine(39,99,39,299);
LCD_DrawLine(439,99,439,299);
LCD_DrawLine(39,299,439,299);
for(i=90;i<=100;i++)
LCD_Draw_Circle(239,449,25);
LCD_DrawLine(39,499,439,499);
LCD_DrawLine(39,499,39,699);
LCD_DrawLine(439,499,439,699);
LCD_DrawLine(39,699,439,699);
POINT_COLOR = BLACK;
LCD_ShowString(215,179,200,48,24,"light");
LCD_ShowString(215,579,200,48,24,"sound");
while(1)
{
tp_dev.scan(0);
if(tp_dev.x[t]<439&&tp_dev.x[t]>39&&tp_dev.y[t]>499&&tp_dev.y[t]<699)
{
k=2;
}
if(tp_dev.x[t]<439&&tp_dev.x[t]>39&&tp_dev.y[t]>99&&tp_dev.y[t]<299)
{
k=1;
}
switch(k)
{
case 1:
{
for(t=0;t<5;t++)
{
if(tp_dev.sta&(1<<t))
{
while(1){
GPIO_SetBits(GPIOF,GPIO_Pin_9);
delay_ms(100);
GPIO_ResetBits(GPIOF,GPIO_Pin_9);
GPIO_SetBits(GPIOF,GPIO_Pin_10);
delay_ms(100);
GPIO_ResetBits(GPIOF,GPIO_Pin_10);
tp_dev.scan(0);
if(tp_dev.x[t]>439||tp_dev.x[t]<39||tp_dev.y[t]<99||tp_dev.y[t]>299)
{
if(tp_dev.x[t]<439&&tp_dev.x[t]>39&&tp_dev.y[t]>499&&tp_dev.y[t]<699)
{
k=2;
break;
}
if(tp_dev.x[t]<439&&tp_dev.x[t]>39&&tp_dev.y[t]>99&&tp_dev.y[t]<299)
{
k=1;
}
}
}
}
}
}
break;
case 2:
{
for(t=0;t<5;t++)
{
if(tp_dev.sta&(1<<t))
{
while(1){
GPIO_SetBits(GPIOF,GPIO_Pin_8);
delay_ms(600);
GPIO_ResetBits(GPIOF,GPIO_Pin_8);
delay_ms(200);
tp_dev.scan(0);
if(tp_dev.x[t]>439||tp_dev.x[t]<39||tp_dev.y[t]<499||tp_dev.y[t]>699)
{
if(tp_dev.x[t]<439&&tp_dev.x[t]>39&&tp_dev.y[t]>499&&tp_dev.y[t]<699)
{
k=2;
}
if(tp_dev.x[t]<439&&tp_dev.x[t]>39&&tp_dev.y[t]>99&&tp_dev.y[t]<299)
{
k=1;
break;
}
}
}
}
}
}
break;
}
}
}
}
四、总结及实验心得:
此次试验一共要完成两个试验。第一个是在屏幕上画线。第二个是做两个按钮,一个是驱动LED,另一个驱动蜂鸣器。
第一个实验是老师带着做的,利用已经打包好的LCD驱动程序,直接初始化LCD。
第二个实验是自己做的。第一次课没有完全做出来,第二次课才完全做出来的。其实第一次课快结束的时候已经快差不多了,只是有两处地方没有修改好。一个是用来切换效果的K。另一个是点亮LED后,判断触屏时间的条件没写对。第一个问题,后再将K设为全局变量才对,这个问题是LED退出判断条件修改完后才发现的。