Jump to content

Работа с дисплеем МТ-16S2H на Stm32f103c8 CMSIS


 Share

Recommended Posts

Недавно перешел с 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);*/
		}
	}

 

Link to comment
Share on other sites

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Реле, разъемы, вентиляторы, корпуса, микросхемы, конденсаторы и много другое!

Скидки до 20% на сайте электронного дискаунтера ТМ Электроникс.

Бесплатная доставка в любую точку России + кэшбэк 15%.

Подробнее

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

@Архип Бирюков Какой-то стрёмный способ записи полубайтов.

GPIOB->ODR &= ~(b & 0xF0);

К примеру, нужно записать верхний полубайт 0х33. Сначала отделяем 0х30. Затем инвертируем 0хСF. Потом эндим с портом, в котором уже стоят все единички. Получаем в порту 0хСF заместо тройки. Фигня какая-то ...

Link to comment
Share on other sites

Материалы вебинара «Литиевые аккумуляторы EVE Energy и решения для управления перезаряжаемыми источниками тока»

Опубликованы материалы вебинара Компэл, посвященного литиевым аккумуляторам EVE Energy и решениям для управления перезаряжаемыми источниками тока.

На вебинаре мы представили информацию не только по линейкам аккумуляторной продукции EVE, но и по решениям для управления ею, что поможет рассмотреть эти ХИТ в качестве дополнительной альтернативы для уже выпускающихся изделий. Также рассмотрели нюансы работы с производителем и сервисы, предоставляемые Компэл по данной продукции. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Комплексные решения с литиевыми батареями EVE для интеллектуальных систем безопасности

Литиевые химические источники тока EVE по своим характеристикам являются идеальным выбором для современных интеллектуальных систем безопасности. EVE разрабатывает литиевые батареи, опираясь на многолетние исследования таких областей применения, как беспроводная связь стандартов Bluetooth, LoRa, Wi-Fi, NB-IoT и ZigBee. Рассмотрим решения для систем безопасности с использованием батарей EVE. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Спасибо, посмотрел, все косяки поменял. Разобрался с портом, починил запись полубайтов, добавил задержки. Но увы все также. Похоже что-то с курсором или с записью 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)
		{
		}
	}

 

Link to comment
Share on other sites

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Спасибо, посмотрел, все ошибки исправил. Разобрался с портом, починил запись полубайтов, добавил задержки. Но увы все также. Похоже что-то с курсором или с записью 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)
		{
		}
	}

 

Link to comment
Share on other sites

  • 1 month later...

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.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...