你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 941|回复: 3

【HAL库每天一例】第075例:LCD-显示与触摸旋转

[复制链接]

122

主题

129

回帖

0

蝴蝶豆

论坛元老

最后登录
2019-5-28
发表于 2016-7-27 08:47:51 | 显示全部楼层 |阅读模式
【HAL库每天一例】系列例程从今天开始持续更新。。。。。
我们将坚持每天至少发布一个基于YS-F1Pro开发板的HAL库例程,
该系列例程将带领大家从零开始使用HAL库,后面会持续添加模块应用例程。
同样的,我们还程序发布基于HAL库的指导文档和视频教程,欢迎持续关注,并提出改进意见。

例程下载:
资料包括程序、相关说明资料以及软件使用截图
百度
云链接:https://pan.baidu.com/s/1i574oPv
密码:r3s3

(硬石YS-F1Pro开发板HAL库例程持续更新\2. 软件设计之高级裸机例程(HAL库版本)\YSF1_HAL-109. LCD-显示与触摸旋转

/**
  ******************************************************************************
  *                           硬石YS-F1Pro开发板例程功能说明
  *
  *  例程名称: YSF1_HAL-109. LCD-显示与触摸旋转
  *   
  ******************************************************************************
  * 说明:
  * 本例程配套硬石stm32开发板YS-F1Pro使用。
  *
  * 淘宝:
  * 论坛:硬石电子社区
  * 版权归硬石嵌入式开发团队所有,请勿商用。
  ******************************************************************************
  */

【1】例程简介
  电阻式触摸屏是一种传感器,它将矩形区域中触摸点(X,Y)的物理位置转换为代表X坐标和
Y坐标的电压。
  电阻式触摸屏是一种传感器,基本上是薄膜加上玻璃的结构,薄膜和玻璃相邻的一面上均
涂有ITO(纳米铟锡金属氧化物)涂层,ITO具有很好的导电性和透明性。当触摸操作时,薄
膜下层的ITO会接触到玻璃上层的ITO,经由感应器传出相应的电信号,经过转换电路送到处
理器,通过运算转化为屏幕上的X、Y值,而完成点选的动作,并呈现在屏幕上。
  四线触摸屏包含两个阻性层。其中一层在屏幕的左右边缘各有一条垂直总线,另一层在屏
幕的底部和顶部各有一条水平总线。
  本例程实现触摸屏数据读取并实现校准算法。
  
【2】跳线帽情况
******* 为保证例程正常运行,必须插入以下跳线帽 **********
丝印编号     IO端口      目标功能引脚        出厂默认设置
  JP1        PA10        TXD(CH340G)          已接入
  JP2        PA9         RXD(CH340G)          已接入
  
【3】操作及现象
把3.5寸TFT液晶模组插入开发板中间液晶接口上,使用开发板配套的MINI USB线连接到开发
板标示“调试串口”字样的MIMI USB接口(需要安装驱动),在电脑端打开串口调试助手工
具,设置参数为115200 8-N-1。下载完程序之后,在串口调试助手窗口可接收到液晶模组ID
信息等信息,程序会读取存放在串行Flash上的触摸屏校准参数,如果读到数据不合法,则进行
触摸屏校准程序,否则直接进入触摸画板程序。按下KEY1按键可以旋转屏幕显示。

/******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/
CubeMX_1.jpg
CubeMX_2.jpg
CubeMX_3.jpg
CubeMX_4.jpg
CubeMX_5.jpg
CubeMX_6.jpg
CubeMX_7.jpg
CubeMX_8.jpg
CubeMX_9.jpg
CubeMX_10.jpg
CubeMX_11.jpg
CubeMX_12.jpg


main.c文件内容
  1. /**
  2.   ******************************************************************************
  3.   * 文件名程: main.c
  4.   * 作    者: 硬石嵌入式开发团队
  5.   * 版    本: V1.0
  6.   * 编写日期: 2015-10-04
  7.   * 功    能: 触摸屏使用实现
  8.   ******************************************************************************
  9.   * 说明:
  10.   * 本例程配套硬石stm32开发板YS-F1Pro使用。
  11.   *
  12.   * 淘宝:
  13.   * 论坛:http://www.ing10bbs.com
  14.   * 版权归硬石嵌入式开发团队所有,请勿商用。
  15.   ******************************************************************************
  16.   */
  17. /* 包含头文件 ----------------------------------------------------------------*/
  18. #include "stm32f1xx_hal.h"
  19. #include "usart\bsp_debug_usart.h"
  20. #include "lcd\bsp_lcd.h"
  21. #include "spiflash\bsp_spiflash.h"
  22. #include "touch/bsp_touch.h"
  23. #include "stdlib.h"
  24. #include "key/bsp_key.h"

  25. /* 私有类型定义 --------------------------------------------------------------*/
  26. /* 私有宏定义 ----------------------------------------------------------------*/
  27. /* 私有变量 ------------------------------------------------------------------*/
  28. uint8_t screen_flag=1;

  29. /* 扩展变量 ------------------------------------------------------------------*/
  30. /* 私有函数原形 --------------------------------------------------------------*/
  31. /* 函数体 --------------------------------------------------------------------*/
  32. /**
  33.   * 函数功能: 系统时钟配置
  34.   * 输入参数: 无
  35.   * 返 回 值: 无
  36.   * 说    明: 无
  37.   */
  38. void SystemClock_Config(void)
  39. {
  40.   RCC_OscInitTypeDef RCC_OscInitStruct;
  41.   RCC_ClkInitTypeDef RCC_ClkInitStruct;

  42.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;  // 外部晶振,8MHz
  43.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  44.   RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  45.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  46.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  47.   RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;  // 9倍频,得到72MHz主时钟
  48.   HAL_RCC_OscConfig(&RCC_OscInitStruct);

  49.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  50.                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  51.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;       // 系统时钟:72MHz
  52.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;              // AHB时钟:72MHz
  53.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;               // APB1时钟:36MHz
  54.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;               // APB2时钟:72MHz
  55.   HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);

  56.          // HAL_RCC_GetHCLKFreq()/1000    1ms中断一次
  57.         // HAL_RCC_GetHCLKFreq()/100000         10us中断一次
  58.         // HAL_RCC_GetHCLKFreq()/1000000 1us中断一次
  59.   HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);  // 配置并启动系统滴答定时器
  60.   /* 系统滴答定时器时钟源 */
  61.   HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
  62.   /* 系统滴答定时器中断优先级配置 */
  63.   HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
  64. }

  65. /**
  66.   * 函数功能: 画板初始化,用于取色用
  67.   * 输入参数: 无
  68.   * 返 回 值: 无
  69.   * 说    明: 无
  70.   */
  71. void Palette_Init(void)
  72. {
  73.   if(screen_flag==1)
  74.   {
  75.     /* 整屏清为白色 */
  76.     LCD_Clear(  0,  0,320, 480,WHITE    );
  77.     LCD_Clear(  0,440, 40, 40, BLACK    );  
  78.     LCD_DispString_EN(3,450,"CL",BLACK,RED,USB_FONT_24);
  79.     LCD_Clear( 40,440, 40, 40, GREEN    );
  80.     LCD_Clear( 80,440, 40, 40, BLUE     );
  81.     LCD_Clear(120,440, 40, 40, MAGENTA  );
  82.     LCD_Clear(160,440, 40, 40, ORANGE   );
  83.     LCD_Clear(200,440, 40, 40, CYAN     );
  84.     LCD_Clear(240,440, 40, 40, BLACK    );
  85.     LCD_Clear(280,440, 40, 40, RED      );  
  86.   }
  87.   else if(screen_flag==2)
  88.   {
  89.     /* 整屏清为白色 */
  90.     LCD_Clear(  0,  0,480, 320,WHITE);
  91.     LCD_Clear(  0,280, 60, 40, BLACK);  
  92.     LCD_DispString_EN(3,290,"CL",BLACK,RED,USB_FONT_24);
  93.     LCD_Clear( 60,280, 60, 40, GREEN );
  94.     LCD_Clear(120,280, 60, 40, BLUE  );
  95.     LCD_Clear(180,280, 60, 40, MAGENTA  );
  96.     LCD_Clear(240,280, 60, 40, ORANGE  );
  97.     LCD_Clear(300,280, 60, 40, CYAN );
  98.     LCD_Clear(360,280, 60, 40, BLACK );
  99.     LCD_Clear(420,280, 60, 40, RED   );  
  100.   }  
  101. }


  102. /**
  103.   * 函数功能: 主函数.
  104.   * 输入参数: 无
  105.   * 返 回 值: 无
  106.   * 说    明: 无
  107.   */
  108. int main(void)
  109. {  
  110.   uint32_t lcdid;
  111.   uint16_t x,y;
  112.   uint8_t i;
  113.   uint16_t color=BLUE;
  114.   
  115.   /* 复位所有外设,初始化Flash接口和系统滴答定时器 */
  116.   HAL_Init();
  117.   /* 配置系统时钟 */
  118.   SystemClock_Config();
  119.   
  120.   /* 初始化3.5寸TFT液晶模组,一般优先于调试串口初始化 */
  121.   lcdid=BSP_LCD_Init();
  122.   
  123.   KEY_GPIO_Init();
  124.   
  125.   /* 初始化串口并配置串口中断优先级 */
  126.   MX_DEBUG_USART_Init();
  127.   
  128.   MX_SPIFlash_Init();
  129.   
  130.   Touch_Init_GPIO();
  131.   
  132.   /* 调用格式化输出函数打印输出数据 */
  133.   printf("LCD ID=0x%08X\n",lcdid);
  134.   printf("触摸屏校准测试\n");        
  135.    
  136.   LCD_Clear(0,0,LCD_DEFAULT_WIDTH,LCD_DEFAULT_HEIGTH,BLACK);
  137.   
  138.   /* 开背光 */
  139.   LCD_BK_ON();
  140.   
  141. #if 0  /* 1:重新校准,0:读取原有数据进行校准 */
  142.    /* 擦除存储触摸校准值数据,重新进行校准 */
  143.    SPI_FLASH_SectorErase(XPT2046_SPIFLASH_ADDR);
  144. #endif

  145.    SPI_FLASH_BufferRead((uint8_t *)&cal_value,XPT2046_SPIFLASH_ADDR,sizeof(XPT2046_Calibration));
  146.    printf("cal_flag: 0x%X\n",cal_value.cal_flag);
  147.    for(i=0;i<5;++i)
  148.    {
  149.      printf("%d lcd_x=%d lcd_y=%d touch_x=%d touch_y=%d\n",i,cal_value.lcd_x[i],cal_value.lcd_y[i],cal_value.touch_x[i],cal_value.touch_y[i]);
  150.    }
  151.    for(i=0;i<7;++i)
  152.    {
  153.      printf("adjust[%d]=%d ",i,cal_value.adjust[i]);
  154.    }
  155.    printf("\n");        
  156.    if(cal_value.cal_flag!=0xAA55)
  157.    {
  158.      /* 等待触摸屏校正完毕 */
  159.      while(XPT2046_Touch_Calibrate() !=0);
  160.    }
  161.    else
  162.    {
  163.      LCD_Clear(0, 0,LCD_DEFAULT_WIDTH, LCD_DEFAULT_HEIGTH, BACKGROUND);
  164.    }


  165.    Palette_Init();
  166.    
  167.   /* 无限循环 */
  168.   while (1)
  169.   {   \
  170.     if(KEY1_StateRead()==KEY_DOWN)
  171.     {
  172.       if(screen_flag==1)
  173.       {
  174.         screen_flag=2;
  175.         
  176.       }
  177.       else if(screen_flag==2)
  178.       {
  179.         screen_flag=1;
  180.       }
  181.       HAL_Delay(100);
  182.       LCD_SetDirection(screen_flag);
  183.       Palette_Init();
  184.     }
  185.    
  186.     if(XPT2046_EXTI_Read()==XPT2046_EXTI_ActiveLevel)                        /*如果触笔按下了*/
  187.     {
  188.       if(screen_flag==1)
  189.       {
  190.         /*获取点的坐标*/
  191.         XPT2046_Get_TouchedPoint(&x,&y);
  192.         if((x==0xFFFF)||(y==0xFFFF)) continue;
  193.         if(y<440)
  194.         {
  195.           Palette_draw_point(x,y,color);
  196.         }
  197.         else if(y<480)
  198.         {        
  199.           if(x>280)
  200.             color=RED;
  201.           else if(x>240)
  202.             color=BLACK;
  203.           else if(x>200)
  204.             color=CYAN;
  205.           else if(x>160)
  206.             color=ORANGE;
  207.           else if(x>120)
  208.             color=MAGENTA;
  209.           else if(x>80)
  210.             color=BLUE;
  211.           else if(x>40)
  212.             color=GREEN;
  213.           else
  214.           {
  215.             color=BLUE;
  216.             LCD_Clear(0,0,320,440,WHITE);
  217.           }
  218.         }
  219.       }
  220.       else if(screen_flag==2)
  221.       {
  222.         /*获取点的坐标*/
  223.         XPT2046_Get_TouchedPoint(&y,&x);
  224.         if((x==0xFFFF)||(y==0xFFFF)) continue;        
  225.         y=320-y;
  226.         if(y<280)
  227.         {
  228.           Palette_draw_point(x,y,color);
  229.         }
  230.         else if(y<320)
  231.         {        
  232.           if(x>420)
  233.             color=RED;
  234.           else if(x>360)
  235.             color=BLACK;
  236.           else if(x>300)
  237.             color=CYAN;
  238.           else if(x>240)
  239.             color=ORANGE;
  240.           else if(x>180)
  241.             color=MAGENTA;
  242.           else if(x>120)
  243.             color=BLUE;
  244.           else if(x>60)
  245.             color=GREEN;
  246.           else
  247.           {
  248.             color=BLUE;
  249.             LCD_Clear(0,0,480,280,WHITE);
  250.           }
  251.         }
  252.       }        
  253.     }
  254.     HAL_Delay(10);   
  255.   }
  256. }

  257. /******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/
复制代码
串口调试助手截图.jpg


回复

使用道具 举报

100

主题

3617

回帖

1

蝴蝶豆

论坛元老

最后登录
2020-12-8
发表于 2016-7-28 09:43:29 | 显示全部楼层
回复 支持 反对

使用道具 举报

0

主题

16

回帖

0

蝴蝶豆

初级会员

最后登录
2018-9-30
发表于 2016-7-28 17:56:29 | 显示全部楼层
多谢分享
回复 支持 反对

使用道具 举报

0

主题

5

回帖

0

蝴蝶豆

新手上路

最后登录
2018-8-18
发表于 2016-7-28 18:13:56 | 显示全部楼层
学习了受教
回复 支持 反对

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版