poniedziałek, 14 grudnia 2015

[11] STM32 M3 - Nucleo - F103RB - Wyświetlacz ze sterownikiem HD44780

Ostatnio zaprezentowałem w jaki sposób obsłużyć wyświetlacz ze sterownikiem HD44780 dla STM32F4. Tym razem chciałem przedstawić przerobiony program, który pozwoli bez najmniejszych problemów obsłużyć taki wyświetlacz na płytce z rdzeniem M3. 

Główne funkcje programu oraz dostępy do rejestrów nie uległy zmianie. Główne zmiany znajdują się w obrębie funkcji opóźniających oraz deklaracji pinów. 

Wyświetlacz należy podłączyć w następujący sposób:
  • VSS - GND
  • VDD - 5V
  • V0 - Kontrast do potencjometru
  • RS - GPIOA_5
  • RW - GND
  • E - GPIOA_6
  • D0-D3 - linie danych nie podłączone
  • D4 - linia danych - GPIOB12
  • D5 - linia danych - GPIOB13
  • D6 - linia danych - GPIOB14
  • D7 - linia danych - GPIOB15
  • A - na drugi potencjometr
  • K - GND podświetlenia

Deklaracja pinów:


Deklaracja wymaganych pinów dla wyświetlacza wygląda następująco:

void HD44780_InitPins(void) 
{
 GPIO_InitTypeDef GPIOINIT;
 
 //Wlaczenie zegarów dla poszczególnych pinów
 RCC_APB2PeriphClockCmd(HD44780_RS_RCC | HD44780_E_RCC, ENABLE);
 RCC_APB2PeriphClockCmd(HD44780_D4_RCC | HD44780_D5_RCC, ENABLE);
 RCC_APB2PeriphClockCmd(HD44780_D6_RCC | HD44780_D7_RCC, ENABLE);
 
 //RS
 GPIOINIT.GPIO_Pin = HD44780_RS_PIN;
 //Pin jako wyjście
 GPIOINIT.GPIO_Mode = GPIO_Mode_Out_PP;
 GPIOINIT.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_Init(HD44780_RS_PORT, &GPIOINIT);
 //Po inicjalizacji stan niski na wszystkie linie w celu zresetowania układu
 GPIO_WriteBit(HD44780_RS_PORT, HD44780_RS_PIN, 0x00);
 
 //E
 GPIOINIT.GPIO_Pin = HD44780_E_PIN;
 GPIOINIT.GPIO_Mode = GPIO_Mode_Out_PP;
 GPIOINIT.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_Init(HD44780_E_PORT, &GPIOINIT);
 GPIO_WriteBit(HD44780_E_PORT, HD44780_E_PIN, 0x00);
 
 //D4
 GPIOINIT.GPIO_Pin = HD44780_D4_PIN;
 GPIOINIT.GPIO_Mode = GPIO_Mode_Out_PP;
 GPIOINIT.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_Init(HD44780_D4_PORT, &GPIOINIT);
 GPIO_WriteBit(HD44780_D4_PORT, HD44780_D4_PIN, 0x00);
 
 //D5
 GPIOINIT.GPIO_Pin = HD44780_D5_PIN;
 GPIOINIT.GPIO_Mode = GPIO_Mode_Out_PP;
 GPIOINIT.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_Init(HD44780_D5_PORT, &GPIOINIT);
 GPIO_WriteBit(HD44780_D5_PORT, HD44780_D5_PIN, 0x00);
 
 //D6
 GPIOINIT.GPIO_Pin = HD44780_D6_PIN;
 GPIOINIT.GPIO_Mode = GPIO_Mode_Out_PP;
 GPIOINIT.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_Init(HD44780_D6_PORT, &GPIOINIT);
 GPIO_WriteBit(HD44780_D6_PORT, HD44780_D6_PIN, 0x00);
 
 //D7
 GPIOINIT.GPIO_Pin = HD44780_D7_PIN;
 GPIOINIT.GPIO_Mode = GPIO_Mode_Out_PP;
 GPIOINIT.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_Init(HD44780_D7_PORT, &GPIOINIT);
 GPIO_WriteBit(HD44780_D7_PORT, HD44780_D7_PIN, 0x00);
}

Całość projektu można pobrać z linku umieszczonego w zakładce STM32. Pozwoli on na ściągnięcie wszystkich plików z dysku onet.

Poniżej przedstawiam zdjęcie podłączonego układu. Wykorzystałem dwa potencjometry 10k. Jeden z nich reguluje kontrast, drugi natomiast jasność podświetlenia. Jasnością można sterować poprzez wyjście mikrokontrolera z sygnałem PWM.


Rys. 1. Podłączony układ