15.1实验内容
通过本实验主要学习以下内容:
- LCD触控原理
- SPI外设功能
15.2实验原理
本实验介绍通过SPI接口控制8080接口屏的touch功能。
15.3硬件设计
8080接口屏touch部分实现如下图所示,通过SPI接口进行实现。
15.4代码解析
15.4.1Touch SPI定义
Touch 的SPI定义如下所示:
JSON //定义TOUCH_SPI SPI_MASTER_SCK_GPIO_DEF(TOUCH_SPI,B,3,GPIO_AF_5); SPI_MASTER_MOSI_GPIO_DEF(TOUCH_SPI,B,5,GPIO_AF_5); SPI_MASTER_MISO_GPIO_DEF(TOUCH_SPI,B,4,GPIO_AF_5); SPI_MASTER_CS_GPIO_DEF(TOUCH_SPI,A,8); SPI_TX_DMA_DEF(TOUCH_SPI,SPI0,DMA1,DMA_CH1); SPI_RX_DMA_DEF(TOUCH_SPI,SPI0,DMA1,DMA_CH0); SPI_DEF(TOUCH_SPI,SPI0,SPI_MASTER,SPI_DATASIZE_8BIT,SPI_CK_PL_LOW_PH_1EDGE,SPI_PSC_64,SPI_ENDIAN_MSB,MODE_POLL); |
15.4.2SPI初始化配置
Touch SPI初始化配置如下所示:
JSON void bsp_spi_init(typdef_spi_struct *spix) { driver_spi_init(spix); } |
15.4.3屏幕touch状态获取函数
屏幕touch状态获取函数如下所示,通过该函数可扫描获取touch位置。
JSON Drv_Err bsp_touch_scan(uint16_t *x, uint16_t *y) { static uint8_t count=0; uint16_t touch_ad_x,touch_ad_y = 0; /* touch pen is active */ if (SET == bsp_touch_pen_irq()) { if(++count>=20 || lcd_touch_panel_struct.TOUCH_State==1) { lcd_touch_panel_struct.TOUCH_State=1; if((SUCCESS != bsp_touch_ad_xy_get(&touch_ad_x, &touch_ad_y))){ return DRV_ERROR; } // if(invalid_count >= 20){ // return DRV_ERROR; // } }else { return DRV_ERROR; } }else{ count=0; if(lcd_touch_panel_struct.TOUCH_State==1){ lcd_touch_panel_struct.TOUCH_State=2; lcd_touch_panel_struct.Touch_x_Last=*x; lcd_touch_panel_struct.Touch_y_Last=*y; } return DRV_ERROR; } *x=bsp_touch_coordinate_x_get(touch_ad_x); *y=bsp_touch_coordinate_y_get(touch_ad_y); if(count==20) { lcd_touch_panel_struct.TOUCH_State=1; lcd_touch_panel_struct.Touch_x_First=*x; lcd_touch_panel_struct.Touch_y_First=*y; } lcd_touch_panel_struct.Touch_x_Now=*x; lcd_touch_panel_struct.Touch_y_Now=*y; return DRV_SUCCESS; } |
15.4.4主函数
本例程主函数如下所示,在本例程中,8080液晶屏上显示4个LED图标,通过触控点到哪个LED,MCU检测到后打开对应的LED灯。
JSON int main(void) { uint16_t num[4]={0,0,0,0}; /* store the touch point number on four buttons */ uint8_t count=0; char* led_string[4]={"LED1","LED2","LED3","LED4"} ; uint8_t button_id=0; driver_init(); /* 延时和公共驱动部分初始化 */ bsp_8080_lcd_init(); /* 初始化LCD */ bsp_led_group_init(); //初始化SPI bsp_spi_init(&TOUCH_SPI); /* configure the GPIO of SPI touch panel */ bsp_touch_panel_init(bsp_8080_lcd_parameter.width,bsp_8080_lcd_parameter.height); delay_ms(50); /* clear the LCD screen */ bsp_8080_lcd_clear(WHITE); bsp_8080_lcd_show_log(); bsp_8080_lcd_show_string(a1+30, b1+80,bsp_8080_lcd_parameter.width,FONT_ASCII_24_12,FONT_ASCII_24_12,led_string[0],BLUE); /* draw picture of button on LCD screen */ bsp_8080_lcd_color_fill(a1+30,b1+40,a1+30+40-1,b1+40+40-1,(uint16_t *)(image_off + BMP_HEADSIZE)); bsp_8080_lcd_show_string(a2+30, b1+80,bsp_8080_lcd_parameter.width,FONT_ASCII_24_12,FONT_ASCII_24_12,led_string[1],BLUE); bsp_8080_lcd_color_fill(a2+30,b1+40,a2+30+40-1,b1+40+40-1,(uint16_t *)(image_off + BMP_HEADSIZE)); bsp_8080_lcd_show_string(a1+30, b2+80,bsp_8080_lcd_parameter.width,FONT_ASCII_24_12,FONT_ASCII_24_12,led_string[2],BLUE); bsp_8080_lcd_color_fill(a1+30,b2+40,a1+30+40-1,b2+40+40-1,(uint16_t *)(image_off + BMP_HEADSIZE)); bsp_8080_lcd_show_string(a2+30, b2+80,bsp_8080_lcd_parameter.width,FONT_ASCII_24_12,FONT_ASCII_24_12,led_string[3],BLUE); bsp_8080_lcd_color_fill(a2+30,b2+40,a2+30+40-1,b2+40+40-1,(uint16_t *)(image_off + BMP_HEADSIZE)); while(1){ /* get the position of touch on LCD screen */ if(DRV_SUCCESS == bsp_touch_scan(&touch_x,&touch_y)){ count++; get_touch_area(touch_x,touch_y,num); } else { count=0; } /* generate response to the touch(turn on LED and change picture )*/ if(count==10){ button_id = find_max(num); turn_on_led(button_id); change_picture(button_id); num[0]=num[1]=num[2]=num[3]=0; count=0; } } } |
15.5实验结果
将本例程烧录到海棠派开发板中,通过手指点击屏幕上的LED图标,可以点亮对应的LED.
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
单片机
+关注
关注
6037文章
44559浏览量
635508 -
嵌入式
+关注
关注
5083文章
19129浏览量
305400 -
开发板
+关注
关注
25文章
5057浏览量
97519 -
GD32
+关注
关注
7文章
403浏览量
24361
发布评论请先 登录
相关推荐
迅为iMX6ULL开发板使用手册资料下载
的知识点,它都有!《嵌入式Linux开发指南》+《开发板使用手册》+《裸机使用手册》链接:https://pan.baidu.com/s/1Xat4C-cDa2Gi1UwNckNRTw
发表于 12-02 14:13
【GD32H757Z海棠派开发板使用手册】第二讲 GPIO-按键查询检测实验
2.1实验内容通过本实验主要学习以下内容:GPIO输入功能原理;按键查询输入检测原理;2.2实验原理2.2.1GPIO输入功能原理GD32H7XX系列MCUGPIO输入配置结构如下图所
【GD32H757Z海棠派开发板使用手册】第五讲 PMU-低功耗实验
PMU即电源管理单元,其内部结构下图所示,由该图可知,GD32H7XX系列MCU具有三个电源域,包括VDD/VDDA电源域、0.9V电源域以及电池备份域,其中,VDD /VDDA域由电源直接供电
【GD32H757Z海棠派开发板使用手册】第八讲 ADC-规则组多通道采样实验
通过本实验主要学习以下内容:
ADC的简介
GD32FH757 ADC工作原理
DMA和DMAMUX的原理
规则组多通道循环采样
【GD32H757Z海棠派开发板使用手册】第十一讲 SPI-SPI NOR FLASH读写实验
通过本实验主要学习以下内容:
•SPI简介
•GD32H7 SPI简介
•SPI NOR FLASH——GD25Q128ESIGR简介
•使用GD32H7 SPI接口实现对
【GD32H757Z海棠派开发板使用手册】第十二讲 SDIO-SD卡读写实验
SD卡是一种主要以Nand Flash作为存储介质,具有体积小、数据传输速度快以及支持热插拔的优点。如今,已被广泛应用于数码相机、便携式移动设备以及手机等多种设备中。SD卡的驱动一般有SPI接口或SDIO接口,本例程介绍使用GD32F4xx的SDIO接口驱动SD卡的实现。
【GD32F303红枫派开发板使用手册】第二十讲 SPI-SPI NAND FLASH读写实验
通过本实验主要学习以下内容:
•SPI通信协议,参考19.2.1东方红开发板使用手册
•GD32F303 SPI操作方式,参考19.2.2东方红开
评论