В этой статье я расскажу как подключить знако-символьный ЖКИ к STM32F4 через интерфейс I2C и расширитель цифровых портов PCF8574.
Ранее я уже писал как подключить ЖКИ на HD44780 к микроконтроллеру. В этой статье будем подключать индикатор через расширитель портов PCF8574. Это специализированная микросхема, которая позволяет через I2C передавать и устанавливать состояния на своих портах ввода-вывода (8 портов). Она является двунаправленной и очень широко используется сейчас в модулях индикации, клавиатурах. Есть возможность задавать адрес в шине I2C, таким образом можно подключить до 8ми устройств.
Работать с PCF8574 достаточно просто. Через I2C передаем байт, где каждому биту соответствует вывод микросхемы. После получения байта, расширитель устанавливает выходы.
Более подробную информацию по расширителю смотри в документации (как всегда, скачать ДШ можно в конце статьи).
В Китае можно купить индикаторы уже с запаянными расширителями – спецплатка, с регулятором контрастности, ключом для управления подсветкой. Разведены все необходимые линии от стандартной платы ЖКИ: D4-D7 (используется ширина шины 4 линии), En, RS, R/W. Таким образом, можно не только писать в ЖКИ, но и, может кому нужно, считывать с него.
Вот так эта платка выглядит у меня. На ней имеется:
1) разъем для подключения к МК (я подписал куда следует подключить I2C в моем примере);
2) светодиод – индикация подачи питания;
3) потенциометр – регулировка контраста
4) джампер – подача питания на подсветку.
5) А0…А2 – установка адреса индикатора в шине I2C. Выводы в моем случае подтянуты к плюсу, и поэтому адрес 0×7. Если запаять перемычки, то соответствующие биты станут нулями.
Сама микросхема расширителя портов может работать и от 3.3В, однако, у меня ЖКИ ничего не хотел показывать при таком питании. При 5В все норм. Стоит учесть этот момент.
Для удобства работы, я написал небольшую библиотеку для работы с LCD через I2C. Написана для STM32F4, однако, можно с легкостью портировать на другой МК, переписав пару функций. В примере и библиотеке используется I2C1, у которого задействованы PORTD 6 и 7 ножки. Поэтому включаем тактирование порту D и конфигурируем ножки:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
void gpioInit(void) { GPIO_InitTypeDef gpio; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); gpio.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; gpio.GPIO_Mode = GPIO_Mode_AF; gpio.GPIO_Speed = GPIO_Speed_50MHz; gpio.GPIO_OType = GPIO_OType_OD; gpio.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOB, &gpio); GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_I2C1); GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_I2C1); } |
Далее, необходимо настроить I2C на STM32F4:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
void i2cInit(void) { I2C_InitTypeDef i2c; RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); i2c.I2C_ClockSpeed = 50000; i2c.I2C_Mode = I2C_Mode_I2C; i2c.I2C_DutyCycle = I2C_DutyCycle_2; i2c.I2C_OwnAddress1 = 0x00; i2c.I2C_Ack = I2C_Ack_Enable; i2c.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_Init(I2C1, &i2c); I2C_Cmd(I2C1, ENABLE); } |
В коде обязательно нужно описать функцию задержки и прописать ее в файле i2c_lcd.h, указав значение задержки около 20 мкс
1 2 |
extern void delay(uint32_t t); #define lcd_pause delay(1000) |
Все, на этом настройка проекта завершена. Теперь можно использовать библиотеку. По аналогии можно расширить функционал. На данный момент есть такие функции:
1 2 3 4 5 6 7 8 |
// Инициализация ЖКИ void lcd_Init(void); // Включение 1/отключение 0 подсветки void lcd_Backlight(uint8_t state); // Переход на строка/позиция. Отсчет строки от 1. Позиция от 0 void lcd_Goto(uint8_t row, uint8_t col); // Вывести строку void lcd_PrintC(const uint8_t *str); |
Пример использования:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
const uint8_t mes[] = "STM32F4 + I2C + LCD"; lcd_Init(); lcd_PrintC(mes); lcd_Goto(2, 0); lcd_PrintC("LCD4x20 with PCF8574"); lcd_Goto(3, 3); lcd_PrintC("\"Hello world!\""); lcd_Goto(4, 10); lcd_PrintC("how.net.ua"); |
В заключении привожу список ссылок на архив с проектом (он в CooCox), ДШ на PCF8574. Буду рад, если кому-то пригодится мой паручасовой труд.