

//посылка byte в LCD, 4-х проводный режим
//data_command: 0 - команда LCD, 1 - данные LCD
void SendByte2LCD(uint8_t byte, uint8_t data_command)
{
if(data_command!=0)
{
//данные LCD
HAL_GPIO_WritePin(GPIOA, RS_Pin, GPIO_PIN_SET); //сброс RS
}
else
{
//команада LCD
HAL_GPIO_WritePin(GPIOA, RS_Pin, GPIO_PIN_RESET); //установка RS
}
//HAL_Delay(1);
//посылка старшей тетрады byte в старшие линийй данных DB7...DB4
HAL_GPIO_WritePin(GPIOC, DB7_Pin, (byte & 0x80) !=0 ? GPIO_PIN_SET:GPIO_PIN_RESET); //старший (7) бит byte шлем в DB7
HAL_GPIO_WritePin(GPIOC, DB6_Pin, (byte & 0x40) !=0 ? GPIO_PIN_SET:GPIO_PIN_RESET); //6 бит byte шлем в DB6
HAL_GPIO_WritePin(GPIOB, DB5_Pin, (byte & 0x20) !=0 ? GPIO_PIN_SET:GPIO_PIN_RESET); //5 бит byte шлем в DB5
HAL_GPIO_WritePin(GPIOA, DB4_Pin, (byte & 0x10) !=0 ? GPIO_PIN_SET:GPIO_PIN_RESET); //4 бит byte шлем в DB4
//HAL_Delay(1);
//импульс на линии E - для OLED LCD может быть очень коротким
HAL_GPIO_WritePin(GPIOA, E_Pin, GPIO_PIN_RESET); //0
//HAL_Delay(1);
HAL_GPIO_WritePin(GPIOA, E_Pin, GPIO_PIN_SET); //1
//HAL_Delay(1);
HAL_GPIO_WritePin(GPIOA, E_Pin, GPIO_PIN_RESET); //0
//HAL_Delay(1);
//посылка младшей тетрады byte в старшие линийй данных DB7...DB4
HAL_GPIO_WritePin(GPIOC, DB7_Pin, (byte & 0x08) !=0 ? GPIO_PIN_SET:GPIO_PIN_RESET); //3 бит byte шлем в DB7
HAL_GPIO_WritePin(GPIOC, DB6_Pin, (byte & 0x04) !=0 ? GPIO_PIN_SET:GPIO_PIN_RESET); //2 бит byte шлем в DB6
HAL_GPIO_WritePin(GPIOB, DB5_Pin, (byte & 0x02) !=0 ? GPIO_PIN_SET:GPIO_PIN_RESET); //1 бит byte шлем в DB5
HAL_GPIO_WritePin(GPIOA, DB4_Pin, (byte & 0x01) !=0 ? GPIO_PIN_SET:GPIO_PIN_RESET); //младший (0) бит byte шлем в DB4
//HAL_Delay(1);
//импульс на линии E - для OLED LCD может быть очень коротким
HAL_GPIO_WritePin(GPIOA, E_Pin, GPIO_PIN_RESET); //0
HAL_Delay(1);
HAL_GPIO_WritePin(GPIOA, E_Pin, GPIO_PIN_SET); //1
HAL_Delay(1);
HAL_GPIO_WritePin(GPIOA, E_Pin, GPIO_PIN_RESET); //0
//HAL_Delay(1);
} //массив шаблонных кодов команд для инииализации LCD
uint8_t ArrIntLCD[]={0x33, 0x32, 0x08, 0x28, 0x06, 0x01, 0x0C};
//Инициализация LCD
void InitLCD(uint8_t *ArrIntLCD)
{
for(uint8_t i=0; i<7; i++) //цикл по всем элментам массива кодов инициализации LCD
{
SendByte2LCD(ArrIntLCD[i], 0); //шлем байт в LCDб тип - команда
HAL_Delay(10); //задержка, т.к. в внутри LCD некоторые команды обрабатываются долго
}
} //очистка LCD
void ClearLCD(void)
{
SendByte2LCD(0x01, 0);
}
//возврат курсора "домой"
void ReturnHomeLCD(void)
{
SendByte2LCD(0x02, 0);
}
//режим сдвига курсора и сдвига отображения при записи символа
//информация о бите I_D: 0 – сдвигать курсор влево, иначе – вправо
//информация о бите Shift: 0 – не сдвигать отображение, иначе – сдвигать
void EntryModeSetLCD(uint8_t I_D, uint8_t Shift)
{
//добавление информации о битах в команду
SendByte2LCD(0x04 + (I_D!=0? 0x02:0x00) + (Shift!=0? 0x01:0x00), 0);
}
//включение выключение LCD
// информация о бите D: 0 – выключить, иначе – включить
// информация о бите С: 0 – курсор не виден, иначе – курсор виден
// информация о бите B: 0 – курсор не мигает, иначе – курсор мигает
void DisplayOnOffLCD(uint8_t D, uint8_t C, uint8_t B)
{
//добавление информации о битах в команду
SendByte2LCD(0x08 + (D!=0? 0x04:0x00) + (C!=0? 0x02:0x00) + (B!=0? 0x01:0x00), 0);
}
// однократный сдвиг курсора и сдвига отображения
// информация о бите S_C: 0 – двигать курсор, иначе – двигать экран
// информация о бите R_L: 0 – двигать влево, иначе – двигать вправо
void CursorDisplayShiftLCD(uint8_t S_C, uint8_t R_L)
{
//добавление информации о битах в команду
SendByte2LCD(0x10 + (S_C!=0? 0x08:0x00) + (R_L!=0? 0x04:0x00), 0);
} //установка параметров шины LCD
// информация о бите DL: 0 – 4-х проводный режим, 8-и проводный режим
// информация о бите N: 0 – 1 строка, иначе – 2 строки
// информация о бите F: 0 – шрифт 5x8, иначе – шрифт 5x11
void FunctionSetLCD(uint8_t DL, uint8_t N, uint8_t F)
{
//добавление информации о битах в команду
SendByte2LCD(0x20 + (DL!=0? 0x10:0x00) + (N!=0? 0x08:0x00) + (F!=0? 0x04:0x00), 0);
} //установка адреса, в который будем записывать данные LCD
// Address – номер адреса 7 бит
void SetDDRAMAddressLCD(uint8_t Address)
{
//добавление информации о битах в команду с ограничением адреса в 7 бит
SendByte2LCD(0x80 + (Address & 0x7F), 0);
}
// установка курсора для вывода на LCD
// row – номер строки 0…1
// column – номер колонки 0…15
void SetCursorLCD(uint8_t row, uint8_t column)
{
uint8_t Address = 0; //инициализация адреса записи данных
if(row==0)
Address = 0; //первая строка начинается с этого адреса
if(row==1)
Address = 0x40; //вторая строка начинается с этого адреса
Address+= (column & 0x0F); //добавим в адрес номер столбца с его ограничением его значения
// установим адрес записи данных
SetDDRAMAddressLCD(Address);
} 





| Стартуем! |
| Дальше |
| Проверить |
| Узнать результат |
| Дальше |
| Проверить |
| Узнать результат |
| Дальше |
| Проверить |
| Узнать результат |
| Дальше |
| Проверить |
| Узнать результат |
| Дальше |
| Проверить |
| Узнать результат |
| Пройти еще раз |
| Пройти еще раз |
| Пройти еще раз |