Пытаюсь запустить
wg12864b-ygh-n#n на
STM32F100На дисплее ничего не отображается.
Подсветка работает.
При регулировке контраста - ничего не происходит. А должно ли ?
Подключение, соответствие и состояния портов проверил несколько раз.
Контраст подключил вот так:

И всё согласно даташиту.

Код:
#include "stm32f10x.h"
#include "mcu_gpio.h"
// Инициализация портов ввода-вывода
void port_init (void) {
RCC->APB2ENR |= RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPAEN; //clock on portB and portA
// --- PB9 ----------
GPIOB->CRH &= ~GPIO_CRH_CNF9;
GPIOB->CRH |= GPIO_CRH_MODE9_1;
// --- PB8 ----------
GPIOB->CRH &= ~GPIO_CRH_CNF8;
GPIOB->CRH |= GPIO_CRH_MODE8_1;
// --- PB7 ----------
GPIOB->CRL &= ~GPIO_CRL_CNF7;
GPIOB->CRL |= GPIO_CRL_MODE7_1;
// --- PB6 ----------
GPIOB->CRL &= ~GPIO_CRL_CNF6;
GPIOB->CRL |= GPIO_CRL_MODE6_1;
// --- PB5 ----------
GPIOB->CRL &= ~GPIO_CRL_CNF5;
GPIOB->CRL |= GPIO_CRL_MODE5_1;
// --- PB13 ----------
GPIOB->CRH &= ~GPIO_CRH_CNF13;
GPIOB->CRH |= GPIO_CRH_MODE13_1;
// --- PB12 ----------
GPIOB->CRH &= ~GPIO_CRH_CNF12;
GPIOB->CRH |= GPIO_CRH_MODE12_1;
// --- PA9 ----------
GPIOA->CRH &= ~GPIO_CRH_CNF9;
GPIOA->CRH |= GPIO_CRH_MODE9_1;
// --- PA10 ----------
GPIOA->CRH &= ~GPIO_CRH_CNF10;
GPIOA->CRH |= GPIO_CRH_MODE10_1;
// --- PA11 ----------
GPIOA->CRH &= ~GPIO_CRH_CNF11;
GPIOA->CRH |= GPIO_CRH_MODE11_1;
// --- PA12 ----------
GPIOA->CRH &= ~GPIO_CRH_CNF12;
GPIOA->CRH |= GPIO_CRH_MODE12_1;
// --- PA7 ----------
GPIOA->CRL &= ~GPIO_CRL_CNF7;
GPIOA->CRL |= GPIO_CRL_MODE7_1;
// --- PA6 ----------
GPIOA->CRL &= ~GPIO_CRL_CNF6;
GPIOA->CRL |= GPIO_CRL_MODE6_1;
// --- PA5 ----------
GPIOA->CRL &= ~GPIO_CRL_CNF5;
GPIOA->CRL |= GPIO_CRL_MODE5_1;
}
// задержка
void delay (long i) {
while (i) i--;
}
// формирование сигнала на портах
#define LCD_CS1_H GPIOA->BSRR|=GPIO_BSRR_BS10
#define LCD_CS1_L GPIOA->BSRR|=GPIO_BSRR_BR10
#define LCD_CS2_H GPIOA->BSRR|=GPIO_BSRR_BS11
#define LCD_CS2_L GPIOA->BSRR|=GPIO_BSRR_BR11
#define LCD_RESET_H GPIOA->BSRR|=GPIO_BSRR_BS12
#define LCD_RESET_L GPIOA->BSRR|=GPIO_BSRR_BR12
#define LCD_RW_H GPIOA->BSRR|=GPIO_BSRR_BS7
#define LCD_RW_L GPIOA->BSRR|=GPIO_BSRR_BR7
#define LCD_DI_H GPIOA->BSRR|=GPIO_BSRR_BS6
#define LCD_DI_L GPIOA->BSRR|=GPIO_BSRR_BR6
#define LCD_ENABLE_H GPIOA->BSRR|=GPIO_BSRR_BS5
#define LCD_ENABLE_L GPIOA->BSRR|=GPIO_BSRR_BR5
// формирование сигнала на 8-битной шине
void form_byte (int data) {
if ((data & (1<<0)) != 0 ) GPIOB->BSRR|=GPIO_BSRR_BS9; else GPIOB->BSRR|=GPIO_BSRR_BR9;
if ((data & (1<<1)) != 0 ) GPIOB->BSRR|=GPIO_BSRR_BS8; else GPIOB->BSRR|=GPIO_BSRR_BR8;
if ((data & (1<<2)) != 0 ) GPIOB->BSRR|=GPIO_BSRR_BS7; else GPIOB->BSRR|=GPIO_BSRR_BR7;
if ((data & (1<<3)) != 0 ) GPIOB->BSRR|=GPIO_BSRR_BS6; else GPIOB->BSRR|=GPIO_BSRR_BR6;
if ((data & (1<<4)) != 0 ) GPIOB->BSRR|=GPIO_BSRR_BS5; else GPIOB->BSRR|=GPIO_BSRR_BR5;
if ((data & (1<<5)) != 0 ) GPIOB->BSRR|=GPIO_BSRR_BS13; else GPIOB->BSRR|=GPIO_BSRR_BR13;
if ((data & (1<<6)) != 0 ) GPIOB->BSRR|=GPIO_BSRR_BS12; else GPIOB->BSRR|=GPIO_BSRR_BR12;
if ((data & (1<<7)) != 0 ) GPIOA->BSRR|=GPIO_BSRR_BS9; else GPIOA->BSRR|=GPIO_BSRR_BR9;
}
// пишем команду в выбранный контроллер
void lcd_command (int cmd) {
delay (1000);
LCD_CS1_L; // выбор чипа 1
delay (1000);
LCD_DI_L; // команда
delay (1000);
LCD_RW_L; // запись
delay (1000);
form_byte (cmd); // Команду на шину данных
delay (10000);
LCD_ENABLE_H;
delay (10000);
LCD_ENABLE_L;
delay (10000);
LCD_CS1_L; // чип 1 - не активен
}
// пишем данные в выбранный контроллер
void lcd_send (int cmd) {
delay (1000);
LCD_CS1_L; // выбор чипа 1
delay (1000);
LCD_DI_H; // команда
delay (1000);
LCD_RW_L; // запись
delay (1000);
form_byte (cmd); // Команду на шину данных
delay (10000);
LCD_ENABLE_H;
delay (10000);
LCD_ENABLE_L;
delay (10000);
LCD_CS1_L; // чип 1 - не активен
}
// инициализация дисплея
void lcd_init (void) {
lcd_command (0x3F); // включить
lcd_command (0x40); // aдрес Y=0
lcd_command (0xB8); // cтраница Х=0
lcd_command (0xC0); // cкролл = 0 (т.е. с самого верха)
}
// выполнение
int main (void) {
port_init (); // инициализация портов ввода-вывода
LCD_RESET_L; // Сброс
LCD_RESET_H; // Сброс - не активен
LCD_ENABLE_L; // Сигнал передачи данных - не активен
LCD_CS1_H; // Чип 1 - не активен
LCD_CS2_H; // Чип 2 - не активен
lcd_init (); // комманды инициалицзации дисплея
lcd_send (189);
while (1)
{
}
}