Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

2 курс. 1 семестр / СС и ПОД / лаб5. Голубцов Максим

.docx
Скачиваний:
3
Добавлен:
29.01.2021
Размер:
22.12 Кб
Скачать

МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ

федеральное государственное автономное образовательное учреждение высшего образования

«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ»

ИНСТИТУТ НЕПРЕРЫВНОГО И ДИСТАНЦИОННОГО ОБРАЗОВАНИЯ

КАФЕДРА 43

ОЦЕНКА

ПРЕПОДАВАТЕЛЬ

должность, уч. степень, звание

подпись, дата

инициалы, фамилия

ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ

Взаимодействие с LCD дисплей посредством протокола i80

по дисциплине: (наименование дисциплины)

РАБОТУ ВЫПОЛНИЛ

СТУДЕНТ ГР. №

номер группы

подпись, дата

инициалы, фамилия

Студенческий билет №

Санкт-Петербург 2020

Цель работы

Изучить базовое устройство LCD дисплея на базе чипа ILI9325 и его взаимодействие с микроконтроллером. Поучить базовые навыки по выводу информации на дисплей с контроллера.

Задание

Реализовать программу вывода заданного изображения или анимации на LCD дисплей

Листинг программы:

main.c

/* USER CODE BEGIN Header */

/**

******************************************************************************

* @file : main.c

* @brief : Main program body

******************************************************************************

* @attention

*

* <h2><center>© Copyright (c) 2020 STMicroelectronics.

* All rights reserved.</center></h2>

*

* This software component is licensed by ST under BSD 3-Clause license,

* the "License"; You may not use this file except in compliance with the

* License. You may obtain a copy of the License at:

* opensource.org/licenses/BSD-3-Clause

*

******************************************************************************

*/

/* USER CODE END Header */

/* Includes ------------------------------------------------------------------*/

#include "main.h"

#include "usart.h"

#include "gpio.h"

#include "lcd_ili93xx_driver.h"

#include "open32f3_lcd_utils.h"

/* Private includes ----------------------------------------------------------*/

/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/

/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/

/* USER CODE BEGIN PD */

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/

/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/

void SystemClock_Config(void);

//Предварительное объявление функций и функции обратного вызова

void test_init(void);

int my_delay(void*, int);

int my_reset(void*);

int my_write_reg(void *, uint16_t, uint16_t);

int my_read_reg(void*, uint16_t, uint16_t*);

int my_write_words(void*, uint16_t, uint16_t*, size_t);

void callback_init(lcd_ili93xx_driver_t *lcd_driver);

/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/

/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**

* @brief The application entry point.

* @retval int

*/

int main(void)

{

/* USER CODE BEGIN 1 */

//test_init();

/* USER CODE END 1 */

/* MCU Configuration--------------------------------------------------------*/

/* Reset of all peripherals, Initializes the Flash interface and the Systick. */

HAL_Init();

/* USER CODE BEGIN Init */

/* USER CODE END Init */

/* Configure the system clock */

SystemClock_Config();

/* USER CODE BEGIN SysInit */

/* USER CODE END SysInit */

/* Initialize all configured peripherals */

MX_GPIO_Init();

MX_USART2_UART_Init();

/* USER CODE BEGIN 2 */

//Создание драйверов

lcd_ili93xx_driver_t lcd_driver;

lcd_ili93xx_init_clear(&lcd_driver);

// Инициализация коллбеков

callback_init(&lcd_driver);

int res = lcd_ili93xx_init(&lcd_driver);

if (!res)

{

// Driver initialization error.

// Show error somehow and stop application // ...

void Error_Handler();

}

/* USER CODE END 2 */

/* Infinite loop */

/* USER CODE BEGIN WHILE */

while (1)

{

/* USER CODE END WHILE */

//Отрисовка прямоугольника 200 Х 300 зеленого цвета

lcd_ili93xx_fill_rect_color(&lcd_driver, 0, 0, 200, 300, LCD_ILI93XX_COLOR_GREEN);

//Отрисовка прямоугольника 240 Х 320 красного цвета

lcd_ili93xx_fill_rect_color(&lcd_driver, 0, 0, 240, 320, LCD_ILI93XX_COLOR_RED);

/* USER CODE BEGIN 3 */

}

/* USER CODE END 3 */

}

/**

* @brief System Clock Configuration

* @retval None

*/

void SystemClock_Config(void)

{

RCC_OscInitTypeDef RCC_OscInitStruct = {0};

RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};

/** Initializes the CPU, AHB and APB busses clocks

*/

RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;

RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS;

RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;

RCC_OscInitStruct.HSIState = RCC_HSI_ON;

RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;

RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;

RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL6;

if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

{

Error_Handler();

}

/** Initializes the CPU, AHB and APB busses clocks

*/

RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK

|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;

RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;

RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;

RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)

{

Error_Handler();

}

PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2;

PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;

if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)

{

Error_Handler();

}

}

/* USER CODE BEGIN 4 */

void callback_init(lcd_ili93xx_driver_t *lcd_driver)

{

lcd_driver->user_data = NULL;

lcd_driver->delay = &my_delay;

lcd_driver->reset = &my_reset;

lcd_driver->write_reg = &my_write_reg;

lcd_driver->read_reg = &my_read_reg;

lcd_driver->write_words = &my_write_words;

}

int my_delay(void* data, int ms)

{

return 0;

}

int my_reset(void* data)

{

return 0;

}

//Реализация коллбека для записи в регистр

int my_write_reg(void* data, uint16_t address, uint16_t value)

{

OPEN32F3_LCD_CLEAR_CS();

OPEN32F3_LCD_CLEAR_RS();

OPEN32F3_LCD_DATA_WRITE(address);

OPEN32F3_LCD_CLEAR_WR();

OPEN32F3_LCD_SET_WR();

OPEN32F3_LCD_SET_RS();

OPEN32F3_LCD_DATA_WRITE(value);

OPEN32F3_LCD_CLEAR_WR();

OPEN32F3_LCD_SET_WR();

OPEN32F3_LCD_SET_CS();

return 0;

}

//Реализация коллбека для чтения из регистра

int my_read_reg(void* data, uint16_t address, uint16_t* value)

{

OPEN32F3_LCD_CLEAR_CS();

OPEN32F3_LCD_CLEAR_RS();

OPEN32F3_LCD_DATA_WRITE(address);

OPEN32F3_LCD_CLEAR_WR();

OPEN32F3_LCD_SET_WR();

OPEN32F3_LCD_SET_RS();

OPEN32F3_LCD_DATA_SET_INPUT_MODE();

OPEN32F3_LCD_CLEAR_RD();

*value = OPEN32F3_LCD_DATA_READ();

OPEN32F3_LCD_SET_RD();

OPEN32F3_LCD_DATA_SET_OUTPUT_MODE();

OPEN32F3_LCD_SET_CS();

return 0;

}

//Реализация коллбека для записи слова

int my_write_words(void* data, uint16_t address, uint16_t* data_buf, size_t size)

{

OPEN32F3_LCD_CLEAR_CS();

OPEN32F3_LCD_CLEAR_RS();

OPEN32F3_LCD_DATA_WRITE(address);

OPEN32F3_LCD_CLEAR_WR();

OPEN32F3_LCD_SET_WR();

OPEN32F3_LCD_SET_RS();

for (size_t i = 0; i < size; i++)

{

OPEN32F3_LCD_DATA_WRITE(data_buf[i]);

OPEN32F3_LCD_CLEAR_WR();

OPEN32F3_LCD_SET_WR();

}

OPEN32F3_LCD_SET_CS();

return 0;

}

/* USER CODE END 4 */

/**

* @brief This function is executed in case of error occurrence.

* @retval None

*/

void Error_Handler(void)

{

/* USER CODE BEGIN Error_Handler_Debug */

/* User can add his own implementation to report the HAL error return state */

HAL_GPIO_WritePin(GPIOE, 0xFF00, GPIO_PIN_RESET);

while (1) {

HAL_Delay(500);

HAL_GPIO_TogglePin(GPIOE, 0x0200);

}

/* USER CODE END Error_Handler_Debug */

}

#ifdef USE_FULL_ASSERT

/**

* @brief Reports the name of the source file and the source line number

* where the assert_param error has occurred.

* @param file: pointer to the source file name

* @param line: assert_param error line source number

* @retval None

*/

void assert_failed(char *file, uint32_t line)

{

/* USER CODE BEGIN 6 */

/* User can add his own implementation to report the file name and line number,

tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

/* USER CODE END 6 */

}

#endif /* USE_FULL_ASSERT */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

Вывод: Реализованы 3 функции обратного вызова для записи в регистр, для чтения из регистра, для записи слова. Изучено базовое устройство LCD дисплея на базе чипа ILI9325 и его взаимодействие с микроконтроллером. Поучены базовые навыки по выводу информации на дисплей с контроллера.

Соседние файлы в папке СС и ПОД