Advertisement
Guest User

Untitled

a guest
Oct 21st, 2019
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 12.94 KB | None | 0 0
  1. /* USER CODE BEGIN Header */
  2. /**
  3.   ******************************************************************************
  4.   * @file           : main.c
  5.   * @brief          : Main program body
  6.   ******************************************************************************
  7.   * @attention
  8.   *
  9.   * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
  10.   * All rights reserved.</center></h2>
  11.   *
  12.   * This software component is licensed by ST under BSD 3-Clause license,
  13.   * the "License"; You may not use this file except in compliance with the
  14.   * License. You may obtain a copy of the License at:
  15.   *                        opensource.org/licenses/BSD-3-Clause
  16.   *
  17.   ******************************************************************************
  18.   */
  19. /* USER CODE END Header */
  20.  
  21. /* Includes ------------------------------------------------------------------*/
  22. #include "main.h"
  23. /* Private includes ----------------------------------------------------------*/
  24. /* USER CODE BEGIN Includes */
  25. //#include "LCD.h"
  26. /* USER CODE END Includes */
  27.  
  28. /* Private typedef -----------------------------------------------------------*/
  29. /* USER CODE BEGIN PTD */
  30.  
  31.   const uint16_t bb []  = {};
  32.  
  33. #define LCD_RS_L        HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_RESET);
  34. #define LCD_RS_H        HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_SET);
  35. #define LCD_CS_L        HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_RESET);
  36. #define LCD_CS_H        HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_SET);
  37. #define LCD_RST_L       HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, GPIO_PIN_RESET);
  38. #define LCD_RST_H       HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, GPIO_PIN_SET);
  39. #define LCD_BLK_L       HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, GPIO_PIN_RESET);
  40. #define LCD_BLK_H       HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, GPIO_PIN_SET);
  41.  
  42. void LCD_Init();
  43. void LCD_Fill(uint16_t color);
  44. void LCD_Line(uint16_t x, uint16_t y, uint16_t xy, uint16_t color, uint8_t orient);
  45. void LCD_Putchar_(uint16_t Xpos, uint16_t Ypos, char c, uint16_t T_color, uint16_t B_color, uint8_t *font);
  46. void LCD_PutString_(uint8_t x, uint8_t y, char *c, uint16_t T_color, uint16_t B_color, uint8_t space, uint8_t *font);
  47. void LCD_Image(uint8_t x, uint8_t y, uint16_t const *img, uint16_t w, uint16_t h);
  48.  
  49.  
  50.  
  51. /* USER CODE END PTD */
  52.  
  53. /* Private define ------------------------------------------------------------*/
  54. /* USER CODE BEGIN PD */
  55.  
  56. /* USER CODE END PD */
  57.  
  58. /* Private macro -------------------------------------------------------------*/
  59. /* USER CODE BEGIN PM */
  60.  
  61. /* USER CODE END PM */
  62.  
  63. /* Private variables ---------------------------------------------------------*/
  64. SPI_HandleTypeDef hspi1;
  65.  
  66. /* USER CODE BEGIN PV */
  67.  
  68. /* USER CODE END PV */
  69.  
  70. /* Private function prototypes -----------------------------------------------*/
  71. void SystemClock_Config(void);
  72. static void MX_GPIO_Init(void);
  73. static void MX_SPI1_Init(void);
  74. /* USER CODE BEGIN PFP */
  75.  
  76. /* USER CODE END PFP */
  77.  
  78. /* Private user code ---------------------------------------------------------*/
  79. /* USER CODE BEGIN 0 */
  80.  
  81. /* USER CODE END 0 */
  82.  
  83. /**
  84.   * @brief  The application entry point.
  85.   * @retval int
  86.   */
  87. int main(void)
  88. {
  89.   /* USER CODE BEGIN 1 */
  90.  
  91.   /* USER CODE END 1 */
  92.  
  93.   /* MCU Configuration--------------------------------------------------------*/
  94.  
  95.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  96.   HAL_Init();
  97.  
  98.   /* USER CODE BEGIN Init */
  99.  
  100.   /* USER CODE END Init */
  101.  
  102.   /* Configure the system clock */
  103.   SystemClock_Config();
  104.  
  105.   /* USER CODE BEGIN SysInit */
  106.  
  107.   /* USER CODE END SysInit */
  108.  
  109.   /* Initialize all configured peripherals */
  110.   MX_GPIO_Init();
  111.   MX_SPI1_Init();
  112.   /* USER CODE BEGIN 2 */
  113.     LCD_Init();
  114.     LCD_Fill(123);
  115.     LCD_BLK_H;
  116. /* вывод изображения
  117.  x, y - координаты
  118.  img - массив изображения
  119.  w - ширина
  120.  h - высота
  121. */
  122.     LCD_Image(0, 0, bb, 160, 80);
  123.   /* USER CODE END 2 */
  124.  
  125.   /* Infinite loop */
  126.   /* USER CODE BEGIN WHILE */
  127.   while (1)
  128.   {
  129.  
  130.     uint16_t ret = 63488;
  131.     LCD_Fill(ret);
  132.     HAL_Delay(500);
  133.      
  134.     ret = 2016;
  135.     LCD_Fill(ret);
  136.     HAL_Delay(500);
  137.      
  138.     ret = 31;
  139.     LCD_Fill(ret);
  140.     HAL_Delay(500);
  141.    
  142.       /* USER CODE END WHILE */
  143.  
  144.     /* USER CODE BEGIN 3 */
  145.   }
  146.   /* USER CODE END 3 */
  147. }
  148.  
  149. /**
  150.   * @brief System Clock Configuration
  151.   * @retval None
  152.   */
  153. void SystemClock_Config(void)
  154. {
  155.   RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  156.   RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  157.  
  158.   /** Configure the main internal regulator output voltage
  159.   */
  160.   __HAL_RCC_PWR_CLK_ENABLE();
  161.   __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE3);
  162.   /** Initializes the CPU, AHB and APB busses clocks
  163.   */
  164.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  165.   RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  166.   RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  167.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  168.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  169.   RCC_OscInitStruct.PLL.PLLM = 16;
  170.   RCC_OscInitStruct.PLL.PLLN = 200;
  171.   RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  172.   RCC_OscInitStruct.PLL.PLLQ = 2;
  173.   RCC_OscInitStruct.PLL.PLLR = 2;
  174.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  175.   {
  176.     Error_Handler();
  177.   }
  178.   /** Initializes the CPU, AHB and APB busses clocks
  179.   */
  180.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  181.                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  182.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  183.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  184.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
  185.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
  186.  
  187.   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3) != HAL_OK)
  188.   {
  189.     Error_Handler();
  190.   }
  191. }
  192.  
  193. /**
  194.   * @brief SPI1 Initialization Function
  195.   * @param None
  196.   * @retval None
  197.   */
  198. static void MX_SPI1_Init(void)
  199. {
  200.  
  201.   /* USER CODE BEGIN SPI1_Init 0 */
  202.  
  203.   /* USER CODE END SPI1_Init 0 */
  204.  
  205.   /* USER CODE BEGIN SPI1_Init 1 */
  206.  
  207.   /* USER CODE END SPI1_Init 1 */
  208.   /* SPI1 parameter configuration*/
  209.   hspi1.Instance = SPI1;
  210.   hspi1.Init.Mode = SPI_MODE_MASTER;
  211.   hspi1.Init.Direction = SPI_DIRECTION_1LINE;
  212.   hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
  213.   hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
  214.   hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
  215.   hspi1.Init.NSS = SPI_NSS_SOFT;
  216.   hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
  217.   hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  218.   hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  219.   hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  220.   hspi1.Init.CRCPolynomial = 10;
  221.   if (HAL_SPI_Init(&hspi1) != HAL_OK)
  222.   {
  223.     Error_Handler();
  224.   }
  225.   /* USER CODE BEGIN SPI1_Init 2 */
  226.  
  227.   /* USER CODE END SPI1_Init 2 */
  228.  
  229. }
  230.  
  231. /**
  232.   * @brief GPIO Initialization Function
  233.   * @param None
  234.   * @retval None
  235.   */
  236. static void MX_GPIO_Init(void)
  237. {
  238.   GPIO_InitTypeDef GPIO_InitStruct = {0};
  239.  
  240.   /* GPIO Ports Clock Enable */
  241.   __HAL_RCC_GPIOA_CLK_ENABLE();
  242.   __HAL_RCC_GPIOC_CLK_ENABLE();
  243.   __HAL_RCC_GPIOB_CLK_ENABLE();
  244.  
  245.   /*Configure GPIO pin Output Level */
  246.   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
  247.  
  248.   /*Configure GPIO pin Output Level */
  249.   HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_8|GPIO_PIN_9, GPIO_PIN_RESET);
  250.  
  251.   /*Configure GPIO pin : PA5 */
  252.   GPIO_InitStruct.Pin = GPIO_PIN_5;
  253.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  254.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  255.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  256.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  257.  
  258.   /*Configure GPIO pins : PC5 PC6 PC8 PC9 */
  259.   GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_8|GPIO_PIN_9;
  260.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  261.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  262.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  263.   HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  264.  
  265. }
  266.  
  267. /* USER CODE BEGIN 4 */
  268.  
  269. /* USER CODE END 4 */
  270.  
  271. /**
  272.   * @brief  This function is executed in case of error occurrence.
  273.   * @retval None
  274.   */
  275. void Error_Handler(void)
  276. {
  277.   /* USER CODE BEGIN Error_Handler_Debug */
  278.   /* User can add his own implementation to report the HAL error return state */
  279.  
  280.   /* USER CODE END Error_Handler_Debug */
  281. }
  282.  
  283. #ifdef  USE_FULL_ASSERT
  284. /**
  285.   * @brief  Reports the name of the source file and the source line number
  286.   *         where the assert_param error has occurred.
  287.   * @param  file: pointer to the source file name
  288.   * @param  line: assert_param error line source number
  289.   * @retval None
  290.   */
  291. void assert_failed(uint8_t *file, uint32_t line)
  292. {
  293.   /* USER CODE BEGIN 6 */
  294.   /* User can add his own implementation to report the file name and line number,
  295.      tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  296.   /* USER CODE END 6 */
  297. }
  298. #endif /* USE_FULL_ASSERT */
  299.  
  300. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
  301.  
  302.  
  303.  
  304.  
  305.  
  306.  
  307. uint8_t aTxBuffer[2]={0, 0};
  308.  
  309.  
  310. void Send_CMD(uint8_t dat){ //отправка команды
  311.     LCD_RS_L;
  312.     LCD_CS_L;
  313.    
  314.     aTxBuffer[0]=dat;
  315.     HAL_SPI_Transmit (&hspi1, (uint8_t*)aTxBuffer, 1, 5000);
  316.    
  317.     LCD_CS_H;
  318. }
  319.  
  320. void Send_DAT(uint8_t dat){ // отправка данных 8 бит
  321.     LCD_RS_H;
  322.     LCD_CS_L;
  323.        
  324.     aTxBuffer[0]=dat;
  325.     HAL_SPI_Transmit (&hspi1, (uint8_t*)aTxBuffer, 1, 5000);
  326.    
  327.     LCD_CS_H;
  328. }
  329.  
  330. void Send_DAT16(uint16_t dat){ // отправка данных 16 бит
  331.     LCD_RS_H;
  332.     LCD_CS_L;
  333.    
  334.     aTxBuffer[0] = (uint8_t)dat;
  335.     aTxBuffer[1] = (uint8_t)(dat>>8);
  336.     HAL_SPI_Transmit (&hspi1, (uint8_t*)aTxBuffer, 2, 5000);
  337.    
  338.     LCD_CS_H;
  339. }
  340.  
  341. void LCD_Init(){ // инициализация LCD
  342.  
  343.     LCD_RST_L;
  344.     HAL_Delay(10);
  345.    
  346.     LCD_RST_H;
  347.     HAL_Delay(10);
  348.    
  349.     Send_CMD(0x01);
  350.     HAL_Delay(12);
  351.  
  352.     Send_CMD(0x11);
  353.     HAL_Delay(12);
  354.    
  355.     Send_CMD(0x3A);
  356.     HAL_Delay(12);
  357.     Send_DAT(5);       
  358.    
  359.     Send_CMD(0x36);
  360.     Send_DAT(0xA0);
  361.    
  362.     Send_CMD(0xB1);
  363.     Send_DAT16(0x000F);
  364.     Send_DAT16(0x000F);
  365.     Send_DAT16(0x000F);
  366.    
  367.     Send_CMD(0x29);
  368. }
  369.  
  370. // определение области экрана для заполнения
  371. void SetWindow(uint8_t startX, uint8_t startY, uint8_t stopX, uint8_t stopY) {
  372.     Send_CMD(0x2A);
  373.     Send_DAT(0x00);
  374.     Send_DAT(startX);
  375.     Send_DAT(0x00);
  376.     Send_DAT(stopX);
  377.  
  378.     Send_CMD(0x2B);
  379.     Send_DAT(0x00);
  380.     Send_DAT(startY);
  381.     Send_DAT(0x00);
  382.     Send_DAT(stopY);
  383. }
  384.  
  385. // установка адреса выводимого пикселя
  386. void LCD_SetCursorPosition_(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)
  387. {
  388.     Send_CMD(0x2A);
  389.     Send_DAT16(x1);
  390.     Send_DAT16(x2);
  391.  
  392.     Send_CMD(0x2B);
  393.     Send_DAT16(y1);
  394.     Send_DAT16(y2);
  395. }
  396.  
  397. // заливка дисплея цветом
  398. void LCD_Fill(uint16_t color){
  399.     int i;
  400.    
  401.     SetWindow(0, 24, 160, 104);
  402.    
  403.     Send_CMD(0x2C);
  404.    
  405.     LCD_RS_H;
  406.     LCD_CS_L;
  407.    
  408.     for(i = 0; i < 80*160; i++){
  409.         Send_DAT16(color);
  410.     }
  411.    
  412.     LCD_CS_H;
  413.    
  414. }
  415.  
  416. /* рисование линий
  417.     x, y - координаты начала
  418.     xy - длина
  419.     oriеnt - ориентация: горизонтальная/вертикальная
  420. */
  421. void LCD_Line(uint16_t x, uint16_t y, uint16_t xy, uint16_t color, uint8_t orient)
  422. {
  423.     uint16_t i;
  424.  
  425.     if(orient == 1){
  426.      SetWindow(x, y+24, x, y+xy+24);
  427.      Send_CMD(0x2C);
  428.          
  429.         for (i = 0; i <= (xy-y); i++){               
  430.             Send_DAT16(color);
  431.      }
  432.     }else{
  433.         SetWindow(x, y, x+xy, y);
  434.         Send_CMD(0x2C);
  435.          
  436.         for (i = 0; i <= (xy-x); i++){
  437.             Send_DAT16(color);
  438.         }
  439.     }
  440. }
  441.  
  442. /* вывод символа
  443.  Xpos, Ypos - координаты
  444.  с - символ
  445.  T_color - цвет символа
  446.  B_color - цвет фона за символом
  447.  font - массив шрифта
  448. */
  449. void LCD_Putchar_(uint16_t Xpos, uint16_t Ypos, char c, uint16_t T_color, uint16_t B_color, uint8_t *font) {
  450.    uint8_t j, data_w = 0, w = 0;
  451.      uint16_t i, Yaddress = Ypos;
  452.    uint8_t Data;
  453.    
  454.      data_w = font[0]/8;
  455.    
  456.    uint16_t offset = (c-font[2])*(font[1]*data_w) + 4;
  457.    uint8_t width = font[0];
  458.  
  459.      SetWindow(Xpos, Yaddress+24, Xpos+width-1, Yaddress+font[1]+24);
  460.      Send_CMD(0x2C);
  461.    
  462.    for(i = 0; i <= font[1]*data_w; i += data_w){
  463.  
  464.             for(w = 0; w < data_w; w++){
  465.                 Data = 0;
  466.                 Data = font[offset+i+w];
  467.            
  468.                 for(j = 0; j < 8; j++){
  469.                    
  470.                     if(Data & 0x80){
  471.                         Send_DAT16(T_color);   
  472.                     }else{
  473.                         Send_DAT16(B_color);
  474.                     }
  475.                        
  476.                     Data <<= 1;
  477.                 }
  478.             }
  479.    }
  480. }
  481.  
  482. /* вывод сcnhjrb
  483.  Xpos, Ypos - координаты
  484.  с - строка
  485.  T_color - цвет символа
  486.  B_color - цвет фона за символом
  487.  font - массив шрифта
  488. */
  489. void LCD_PutString_(uint8_t x, uint8_t y, char *c, uint16_t T_color, uint16_t B_color, uint8_t space, uint8_t *font){
  490.     uint16_t X = x;
  491.    
  492.     while(*c != 0){
  493.         LCD_Putchar_(X, y, *c++, T_color, B_color, font);
  494.         X += font[0]+space;
  495.     }
  496. }
  497.  
  498. /* вывод изображения
  499.  x, y - координаты
  500.  img - массив изображения
  501.  w - ширина
  502.  h - высота
  503. */
  504. void LCD_Image(uint8_t x, uint8_t y, uint16_t const *img, uint16_t w, uint16_t h){
  505.     uint16_t s = 0, dat, size;
  506.    
  507.     SetWindow(x, y+24, x+w-1, y+h+23);
  508.     Send_CMD(0x2C);
  509.    
  510.     size = (w*h);
  511.    
  512.     while(s++ < size){
  513.         Send_DAT16(img[s]);
  514.     }
  515. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement