Загрузка данных
#include "mik32_hal_pcc.h"
#include "mik32_hal_gpio.h"
#include "uart_lib.h"
#include "xprintf.h"
#define d4_set() HAL_GPIO_WritePin(GPIO_2, GPIO_PIN_4, GPIO_PIN_HIGH)
#define d5_set() HAL_GPIO_WritePin(GPIO_2, GPIO_PIN_5, GPIO_PIN_HIGH)
#define d6_set() HAL_GPIO_WritePin(GPIO_2, GPIO_PIN_6, GPIO_PIN_HIGH)
#define d7_set() HAL_GPIO_WritePin(GPIO_2, GPIO_PIN_7, GPIO_PIN_HIGH)
#define d4_reset() HAL_GPIO_WritePin(GPIO_2, GPIO_PIN_4, GPIO_PIN_LOW)
#define d5_reset() HAL_GPIO_WritePin(GPIO_2, GPIO_PIN_5, GPIO_PIN_LOW)
#define d6_reset() HAL_GPIO_WritePin(GPIO_2, GPIO_PIN_6, GPIO_PIN_LOW)
#define d7_reset() HAL_GPIO_WritePin(GPIO_2, GPIO_PIN_7, GPIO_PIN_LOW)
#define e1 HAL_GPIO_WritePin(GPIO_2, GPIO_PIN_3, GPIO_PIN_HIGH) // установка линии E в 1
#define e0 HAL_GPIO_WritePin(GPIO_2, GPIO_PIN_3, GPIO_PIN_LOW) // установка линии E в 0
#define rs1 HAL_GPIO_WritePin(GPIO_2, GPIO_PIN_2, GPIO_PIN_HIGH) // установка линии RS в 1 (данные)
#define rs0 HAL_GPIO_WritePin(GPIO_2, GPIO_PIN_2, GPIO_PIN_LOW) // установка линии RS в 0 (команда)
void SystemClock_Config(void);
void GPIO_Init(void);
void LCD_ini(void);
int main()
{
SystemClock_Config();
GPIO_Init();
LCD_ini();
LCD_SendChar('K');
LCD_SendChar('u');
LCD_SendChar('d');
LCD_SendChar('a');
LCD_SendChar('n');
LCD_SendChar('K');
LCD_SendChar('i');
LCD_SendChar('n');
LCD_SendChar('Y');
LCD_SendChar('a');
LCD_SendChar('g');
LCD_SendChar('u');
LCD_SendChar('d');
LCD_SendChar('i');
LCD_SendChar('n');
LCD_SendChar('a');
while (1)
{
}
}
void GPIO_Init()
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_PCC_GPIO_2_CLK_ENABLE();
__HAL_PCC_GPIO_0_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7;
GPIO_InitStruct.Mode = HAL_GPIO_MODE_GPIO_OUTPUT;
GPIO_InitStruct.Pull = HAL_GPIO_PULL_UP;
HAL_GPIO_Init(GPIO_2, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_3;
GPIO_InitStruct.Mode = HAL_GPIO_MODE_GPIO_OUTPUT;
GPIO_InitStruct.Pull = HAL_GPIO_PULL_NONE;
HAL_GPIO_Init(GPIO_0, &GPIO_InitStruct);
}
void SystemClock_Config(void)
{
PCC_InitTypeDef PCC_OscInit = {0};
PCC_OscInit.OscillatorEnable = PCC_OSCILLATORTYPE_ALL;
PCC_OscInit.FreqMon.OscillatorSystem = PCC_OSCILLATORTYPE_OSC32M;
PCC_OscInit.FreqMon.ForceOscSys = PCC_FORCE_OSC_SYS_UNFIXED;
PCC_OscInit.FreqMon.Force32KClk = PCC_FREQ_MONITOR_SOURCE_OSC32K;
PCC_OscInit.AHBDivider = 0;
PCC_OscInit.APBMDivider = 0;
PCC_OscInit.APBPDivider = 0;
PCC_OscInit.HSI32MCalibrationValue = 128;
PCC_OscInit.LSI32KCalibrationValue = 8;
PCC_OscInit.RTCClockSelection = PCC_RTC_CLOCK_SOURCE_AUTO;
PCC_OscInit.RTCClockCPUSelection = PCC_CPU_RTC_CLOCK_SOURCE_OSC32K;
HAL_PCC_Config(&PCC_OscInit);
}
void LCD_Data(uint8_t dt)
{
rs1;
LCD_WriteData(dt>>4);
e1;
HAL_DelayMs(200);
e0;
LCD_WriteData(dt);
e1;
HAL_DelayMs(200);
e0;
}
void LCD_Clear(void)
{
LCD_SendCommand4(0x01);
HAL_DelayMs(200);
}
void LCD_SendChar(char ch)
{
LCD_Data((uint8_t) ch);
HAL_DelayMs(200);
}
void delay(void)
{
uint16_t i;
for(i=0;i<1000;i++)
{
}
}
void LCD_WriteData(uint8_t dt)
{
if(((dt >> 3)&0x01)==1) {d7_set();} else {d7_reset();}
if(((dt >> 2)&0x01)==1) {d6_set();} else {d6_reset();}
if(((dt >> 1)&0x01)==1) {d5_set();} else {d5_reset();}
if((dt&0x01)==1) {d4_set();} else {d4_reset();}
}
void LCD_Command(uint8_t dt)
{
rs0;
LCD_WriteData(dt>>4);
e1;
HAL_DelayMs(200);
e0;
LCD_WriteData(dt);
e1;
HAL_DelayMs(200);
e0;
}
void LCD_ini(void)
{
HAL_DelayMs(200);
rs0;
LCD_WriteData(1);
e1;
HAL_DelayMs(200);
e0;
HAL_DelayMs(200);
LCD_WriteData(12);
e1;
HAL_DelayMs(200);
e0;
HAL_DelayMs(200);
LCD_WriteData(12);
e1;
HAL_DelayMs(200);
e0;
HAL_DelayMs(200);
LCD_Command(0x28);//режим 4 бит, 2 линии (для нашего большого дисплея это 4 линии), шрифт 5х8
HAL_DelayMs(200);
LCD_Command(0x28);//еще раз для верности
HAL_DelayMs(200);
LCD_Command(0x0F);//дисплей включаем (D=1), также включаем пока все курсоры
HAL_DelayMs(200);
LCD_Command(0x01);//уберем мусор
HAL_DelayMs(200);
LCD_Command(0x06);//пишем влево.
HAL_DelayMs(200);
LCD_Command(0x02);//возврат курсора в нулевое положение
HAL_DelayMs(200);
}