Перейти к содержанию

Архип Бирюков

Members
  • Постов

    4
  • Зарегистрирован

  • Посещение

Информация

  • Город
    Москва

Электроника

  • Стаж в электронике
    Менее года

Достижения Архип Бирюков

Новичок

Новичок (1/14)

  • Неделя на форуме

Последние значки

0

Репутация

  1. Доброго времени суток! Недавно решил продолжить свое изучение микроконтроллеров и с AVR перейти на STM32. Понял специфику и решил применить новые знания на практике. Нашел дисплей MT-16S2H (https://www.melt.com.ru/pdf/mt-16s2h.pdf) и набросал кода для инициализации и вывода символа. Подсветка загорелась, но вывести ничего не получилось) Начал смотреть что написал. Порты инициализировал правильно, сам дисплей вроде тоже, запись данных вроде тоже. Предполагаю что косяк где-то с курсором или символ не правильно как-то вывожу: void setPos(int8_t row, int8_t col) { if (row == 0) col|=0x80; else col|=0xC0; sendbyte(col, 0); } void sendchar(char c) { sendbyte(c, 1); } Это мои предположения где может быть ошибка, надеюсь знаток найдется. Весь код прикладываю ниже. Заранее спасибо за помощь:) main.c
  2. Спасибо, посмотрел, все ошибки исправил. Разобрался с портом, починил запись полубайтов, добавил задержки. Но увы все также. Похоже что-то с курсором или с записью 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) { } }
  3. Спасибо, посмотрел, все косяки поменял. Разобрался с портом, починил запись полубайтов, добавил задержки. Но увы все также. Похоже что-то с курсором или с записью 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) { } }
  4. Недавно перешел с 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);*/ } }
×
×
  • Создать...