首页 > 代码库 > 嵌入式第五次课

嵌入式第五次课

嵌入式软件设计第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退出判断条件修改完后才发现的。

嵌入式第五次课