Архип Бирюков Posted June 26 Share Posted June 26 Недавно перешел с avr на stm32, для начала решил заказать Blue Pill. Нашел у себя дисплей MT-16S2H, почитал доку по нему и набросал код в Keil. Экран загорелся, но ничего на нем не появляется. И никак не могу понять или при инициализации накосячил или же с форматом вывода что-то. Кто работал с подобным, отпишитесь) Настраиваю на работу в 4х битном режиме. Работаю на порте B (PB4-PB7), A0 к B0, E к B1. main.c: #include "main.h" #define SYSLOCK 72000000U #define E1 GPIOB->BSRR |= GPIO_BSRR_BR1 #define E0 GPIOB->BSRR |= GPIO_BSRR_BS1 #define A1 GPIOB->BSRR |= GPIO_BSRR_BR0 #define A0 GPIOB->BSRR |= GPIO_BSRR_BS0 #define LCD_PINS0 GPIOB->BSRR |= (GPIO_BSRR_BS0 | GPIO_BSRR_BS1 | GPIO_BSRR_BS4 | GPIO_BSRR_BS5 | GPIO_BSRR_BS6 | GPIO_BSRR_BS7) #define LED_ON GPIOC->BSRR |= GPIO_BSRR_BR13 #define LED_OFF GPIOC->BSRR |= GPIO_BSRR_BS13 __IO static uint32_t SysTick_CNT = 0; void PORTS_INIT(void) { RCC->APB2ENR |= RCC_APB2ENR_IOPCEN | RCC_APB2ENR_IOPBEN; /*PORTC settings*/ GPIOC->CRH &= GPIO_CRH_CNF13; GPIOC->CRH |= GPIO_CRH_MODE13; /*A0(PB0) & E(BP1) INIT*/ GPIOB->CRL &= GPIO_CRL_CNF0; GPIOB->CRL |= GPIO_CRL_MODE0; GPIOB->CRL &= GPIO_CRL_CNF1; GPIOB->CRL |= GPIO_CRL_MODE1; /*PORTB PB4-PB7 settings*/ GPIOB->CRL &= GPIO_CRL_CNF4; GPIOB->CRL |= GPIO_CRL_MODE4; GPIOB->CRL &= GPIO_CRL_CNF5; GPIOB->CRL |= GPIO_CRL_MODE5; GPIOB->CRL &= GPIO_CRL_CNF6; GPIOB->CRL |= GPIO_CRL_MODE6; GPIOB->CRL &= GPIO_CRL_CNF7; GPIOB->CRL |= GPIO_CRL_MODE7; } void SysTick_INIT(void) { SysTick->LOAD &= ~SysTick_LOAD_RELOAD_Msk; SysTick->LOAD = SYSLOCK/(1000000-1); SysTick->VAL &= ~SysTick_VAL_CURRENT_Msk; SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk; } void delay_mks(uint32_t x) { SysTick->VAL &= ~SysTick_VAL_CURRENT_Msk; SysTick->VAL = SYSLOCK/(1000000-1); SysTick_CNT = x; while (SysTick_CNT); } void SysTick_Handler(void) { if (SysTick_CNT > 0) SysTick_CNT--; } void LCD_INIT(void) { LCD_PINS0; delay_mks(20000); sendbyte(0x33, 0); delay_mks(40); sendbyte(0x32, 0); delay_mks(40); sendbyte(0x28, 0); delay_mks(40); sendbyte(0x0C, 0); sendbyte(0x06, 0); sendbyte(0x01, 0); } void sendbyte(int16_t b, uint8_t mode) { LCD_PINS0; GPIOB->ODR &= ~(b & 0xF0); if (mode == 1) A1; else A0; pulse(); LCD_PINS0; GPIOB->ODR &= ~((b & 0x0F) << 4); if (mode == 1) A1; else A0; pulse(); } void pulse(void) { E0; delay_mks(22); E1; delay_mks(22); E0; delay_mks(22); } void sendChar(char *e) { char *text; text = e; while ((*text != 0) && (*text != 0)) { sendbyte(*text, 1); text++; } } void setPos(uint8_t row, uint8_t col) { uint8_t address = 0; if (row == 0) address = 0; else address = 0x40; address |= col; sendbyte(0x80 | address, 0); } int main(void) { PORTS_INIT(); SysTick_INIT(); LCD_INIT(); setPos(0,2); sendChar("sass"); while(1) { /* LED_ON; delay_mks(200000); LED_OFF; delay_mks(200000);*/ } } 0 Link to comment Share on other sites More sharing options...
SurovSergey Posted June 26 Share Posted June 26 При инициализации надо сделать выдержку времени в 20 миллисекунд между управляющими кодами. 0 Link to comment Share on other sites More sharing options...
Участвуйте в розыгрыше купонов 5000 ₽, 10000 ₽ и 15000 ₽! Выиграй купон и забирай на эту сумму любые электронные компоненты, радиодетали или любой другой товар из нашего каталога! Проигравших не будет, без подарков никто не останется! ТМ дарит всем участникам розыгрыша 5000 баллов на счёт весь декабрь скидка 10% по промокоду UHUHU23, а ещё 15% кэшбэк и бесплатная доставка! Ну... вздрогнем!Перейти на страницу акции Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
Yurkin2015 Posted June 26 Share Posted June 26 @Архип Бирюков Какой-то стрёмный способ записи полубайтов. GPIOB->ODR &= ~(b & 0xF0); К примеру, нужно записать верхний полубайт 0х33. Сначала отделяем 0х30. Затем инвертируем 0хСF. Потом эндим с портом, в котором уже стоят все единички. Получаем в порту 0хСF заместо тройки. Фигня какая-то ... 0 Link to comment Share on other sites More sharing options...
Материалы вебинара «Литиевые аккумуляторы EVE Energy и решения для управления перезаряжаемыми источниками тока»Опубликованы материалы вебинара Компэл, посвященного литиевым аккумуляторам EVE Energy и решениям для управления перезаряжаемыми источниками тока.На вебинаре мы представили информацию не только по линейкам аккумуляторной продукции EVE, но и по решениям для управления ею, что поможет рассмотреть эти ХИТ в качестве дополнительной альтернативы для уже выпускающихся изделий. Также рассмотрели нюансы работы с производителем и сервисы, предоставляемые Компэл по данной продукции. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
Геннадий Posted June 26 Share Posted June 26 Все совпадает с инициализацией? 0 Link to comment Share on other sites More sharing options...
Комплексные решения с литиевыми батареями EVE для интеллектуальных систем безопасностиЛитиевые химические источники тока EVE по своим характеристикам являются идеальным выбором для современных интеллектуальных систем безопасности. EVE разрабатывает литиевые батареи, опираясь на многолетние исследования таких областей применения, как беспроводная связь стандартов Bluetooth, LoRa, Wi-Fi, NB-IoT и ZigBee. Рассмотрим решения для систем безопасности с использованием батарей EVE. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
Архип Бирюков Posted June 27 Author Share Posted June 27 Спасибо, посмотрел, все косяки поменял. Разобрался с портом, починил запись полубайтов, добавил задержки. Но увы все также. Похоже что-то с курсором или с записью char. Обновленный код: #include "main.h" #define SYSLOCK 72000000U #define E1 GPIOB->BSRR |= GPIO_BSRR_BS1 #define E0 GPIOB->BSRR |= GPIO_BSRR_BR1 #define A1 GPIOB->BSRR |= GPIO_BSRR_BS0 #define A0 GPIOB->BSRR |= GPIO_BSRR_BR0 #define LCD_PINS0 GPIOB->BSRR |= (GPIO_BSRR_BR4 | GPIO_BSRR_BR5 | GPIO_BSRR_BR6 | GPIO_BSRR_BR7) __IO static int32_t SysTick_CNT = 0; void PORTS_INIT(void) { RCC->APB2ENR |= RCC_APB2ENR_IOPBEN; /*A0(PB0) & E(BP1) INIT*/ GPIOB->CRL &= ~GPIO_CRL_CNF0; GPIOB->CRL |= GPIO_CRL_MODE0; GPIOB->CRL &= ~GPIO_CRL_CNF1; GPIOB->CRL |= GPIO_CRL_MODE1; /*PORTA PB4-PB7 settings*/ GPIOB->CRL &= ~GPIO_CRL_CNF4; GPIOB->CRL |= GPIO_CRL_MODE4; GPIOB->CRL &= ~GPIO_CRL_CNF5; GPIOB->CRL |= GPIO_CRL_MODE5; GPIOB->CRL &= ~GPIO_CRL_CNF6; GPIOB->CRL |= GPIO_CRL_MODE6; GPIOB->CRL &= ~GPIO_CRL_CNF7; GPIOB->CRL |= GPIO_CRL_MODE7; } void SysTick_INIT(void) { SysTick->LOAD &= ~SysTick_LOAD_RELOAD_Msk; SysTick->LOAD = SYSLOCK/(1000000-1); SysTick->VAL &= ~SysTick_VAL_CURRENT_Msk; SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk; } void delay_mks(int32_t x) { SysTick->VAL &= ~SysTick_VAL_CURRENT_Msk; SysTick->VAL = SYSLOCK/(1000000-1); SysTick_CNT = x; while (SysTick_CNT); } void SysTick_Handler(void) { if (SysTick_CNT > 0) SysTick_CNT--; } void LCD_INIT(void) { GPIOB->BSRR |= (GPIO_BSRR_BR0 | GPIO_BSRR_BR1 | GPIO_BSRR_BR4 | GPIO_BSRR_BR5 | GPIO_BSRR_BR6 | GPIO_BSRR_BR7); delay_mks(20000); sendhalfbyte(0x30); delay_mks(40); sendhalfbyte(0x30); delay_mks(40); sendhalfbyte(0x30); delay_mks(5); sendbyte(0x28, 0); delay_mks(5); sendbyte(0x08, 0); delay_mks(5); sendbyte(0x01, 0); delay_mks(5); sendbyte(0x06, 0); delay_mks(5); } void sendchar(char c) { sendbyte(c, 1); } void sendhalfbyte(int16_t hb) { E1; delay_mks(50); LCD_PINS0; GPIOB->ODR |= (hb & 0xF0); E0; delay_mks(50); } void sendbyte(int16_t b, int8_t mode) { if (mode == 1) A1; else A0; sendhalfbyte(b); sendhalfbyte(b << 4); } void setPos(int8_t row, int8_t col) { if (row == 0) col|=0x80; else col|=0xC0; sendbyte(col, 0); } int main(void) { PORTS_INIT(); SysTick_INIT(); LCD_INIT(); setPos(0,0); sendchar('r'); while(1) { } } 0 Link to comment Share on other sites More sharing options...
Литиевые батарейки и аккумуляторы от мирового лидера EVE в КомпэлКомпания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
Архип Бирюков Posted June 27 Author Share Posted June 27 Спасибо, посмотрел, все ошибки исправил. Разобрался с портом, починил запись полубайтов, добавил задержки. Но увы все также. Похоже что-то с курсором или с записью char. Решения пока нет. Вот что пока получается: #include "main.h" #define SYSLOCK 72000000U #define E1 GPIOB->BSRR |= GPIO_BSRR_BS1 #define E0 GPIOB->BSRR |= GPIO_BSRR_BR1 #define A1 GPIOB->BSRR |= GPIO_BSRR_BS0 #define A0 GPIOB->BSRR |= GPIO_BSRR_BR0 #define LCD_PINS0 GPIOB->BSRR |= (GPIO_BSRR_BR4 | GPIO_BSRR_BR5 | GPIO_BSRR_BR6 | GPIO_BSRR_BR7) __IO static int32_t SysTick_CNT = 0; void PORTS_INIT(void) { RCC->APB2ENR |= RCC_APB2ENR_IOPBEN; /*A0(PB0) & E(BP1) INIT*/ GPIOB->CRL &= ~GPIO_CRL_CNF0; GPIOB->CRL |= GPIO_CRL_MODE0; GPIOB->CRL &= ~GPIO_CRL_CNF1; GPIOB->CRL |= GPIO_CRL_MODE1; /*PORTA PB4-PB7 settings*/ GPIOB->CRL &= ~GPIO_CRL_CNF4; GPIOB->CRL |= GPIO_CRL_MODE4; GPIOB->CRL &= ~GPIO_CRL_CNF5; GPIOB->CRL |= GPIO_CRL_MODE5; GPIOB->CRL &= ~GPIO_CRL_CNF6; GPIOB->CRL |= GPIO_CRL_MODE6; GPIOB->CRL &= ~GPIO_CRL_CNF7; GPIOB->CRL |= GPIO_CRL_MODE7; } void SysTick_INIT(void) { SysTick->LOAD &= ~SysTick_LOAD_RELOAD_Msk; SysTick->LOAD = SYSLOCK/(1000000-1); SysTick->VAL &= ~SysTick_VAL_CURRENT_Msk; SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk; } void delay_mks(int32_t x) { SysTick->VAL &= ~SysTick_VAL_CURRENT_Msk; SysTick->VAL = SYSLOCK/(1000000-1); SysTick_CNT = x; while (SysTick_CNT); } void SysTick_Handler(void) { if (SysTick_CNT > 0) SysTick_CNT--; } void LCD_INIT(void) { GPIOB->BSRR |= (GPIO_BSRR_BR0 | GPIO_BSRR_BR1 | GPIO_BSRR_BR4 | GPIO_BSRR_BR5 | GPIO_BSRR_BR6 | GPIO_BSRR_BR7); delay_mks(20000); sendhalfbyte(0x30); delay_mks(40); sendhalfbyte(0x30); delay_mks(40); sendhalfbyte(0x30); delay_mks(5); sendbyte(0x28, 0); delay_mks(5); sendbyte(0x08, 0); delay_mks(5); sendbyte(0x01, 0); delay_mks(5); sendbyte(0x06, 0); delay_mks(5); } void sendchar(char c) { sendbyte(c, 1); } void sendhalfbyte(int16_t hb) { E1; delay_mks(50); LCD_PINS0; GPIOB->ODR |= (hb & 0xF0); E0; delay_mks(50); } void sendbyte(int16_t b, int8_t mode) { if (mode == 1) A1; else A0; sendhalfbyte(b); sendhalfbyte(b << 4); } void setPos(int8_t row, int8_t col) { if (row == 0) col|=0x80; else col|=0xC0; sendbyte(col, 0); } int main(void) { PORTS_INIT(); SysTick_INIT(); LCD_INIT(); setPos(0,0); sendchar('r'); while(1) { } } 0 Link to comment Share on other sites More sharing options...
_Sergey_ Posted August 17 Share Posted August 17 Индикатор MT-16S2H каким напряжением запитываешь? 0 Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.