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

STM32F030R8T6+LCD1602 проблема отображения String


Purple

Рекомендуемые сообщения

Нашел материал по созданию библиотеки LCD1602 на STM32F030R8T6.
Все шло нормально пока не дошел до использования функции отображения слова на LCD.
Функция инициализации, отправки инструкций, команд все работает отлично.
Функция отправки символов тоже работала нормально.
Но вот когда создал функцию отправки слова, ничего не происходит. Первая строка LCD отображает квадратики.
Попрбовал снова отправить по буквам по отдельности - все ок, отображает без проблем.
Я подозреваю у меня ошибка в Функции отправки слова, но не могу понять где именно.
Менял также время LCD таймингов - не помогло.
Все єто делаю в COIDE.

Ниже листинг функций:

//===Функция отправки слова==================================
void LCD_Send_a_String(char *String_of_Characters)
{
	while( *String_of_Characters)
	{
		LCD_SendACharcter(*String_of_Characters++);
	}
}
//===========================================================

LCD_Send_a_String("Hello!");	// Не работает, первая строка с квадратиками

//===========================================================

//===Ниже код работает=======================================

LCD_SendACharcter('H');
LCD_SendACharcter('e');
LCD_SendACharcter('l');
LCD_SendACharcter('l');
LCD_SendACharcter('o');
LCD_SendACharcter('!');

//===========================================================

Буду благодарен за любую помощь!

Ссылка на комментарий
Поделиться на другие сайты

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

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

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

ну и нахрена этот тупой вопрос, по признаку зеро.

стандартная функция

Цитата

/* write a string of chars to the LCD */

void
lcd_puts(const char * s)
{
    LCD_RS = 1;    // write characters
    while(*s)
        lcd_write(*s++);
}

 

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей. Подробнее>>

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

К сожалению не помогло.

Код Main.c

#include "stm32f0xx.h"
#include "LCD_Functions.h"

int main(void)
{
	InitializePortsForLCD();
	LCD_SendAnInstruction(0b00111000);		//Set to 8-bit mode
	LCD_SendAnInstruction(0b00001100);		//Turn on Display and Cursor????
	LCD_SendAnInstruction(0b00000110);		//Set the mode to increment address by one
	LCD_SendAnInstruction(0b00000001);		//Clear the Display
	/*LCD_SendACharcter('H');
	LCD_SendACharcter('e');
	LCD_SendACharcter('l');
	LCD_SendACharcter('l');
	LCD_SendACharcter('o');
	LCD_SendACharcter('!');*/

		LCD_Send_a_String("Hello!");

    while(1)
    {
    }
}

А также код LCD_Functions.h

#ifndef LCDFunctionsHeader

#define LCDFunctionsHeader

#define LCD_D0_Pin 15
#define LCD_D0_Port GPIOB
#define LCD_D1_Pin 6
#define LCD_D1_Port GPIOC
#define LCD_D2_Pin 7
#define LCD_D2_Port GPIOC
#define LCD_D3_Pin 8
#define LCD_D3_Port GPIOC
#define LCD_D4_Pin 9
#define LCD_D4_Port GPIOC
#define LCD_D5_Pin 8
#define LCD_D5_Port GPIOA
#define LCD_D6_Pin 9
#define LCD_D6_Port GPIOA
#define LCD_D7_Pin 10
#define LCD_D7_Port GPIOA
#define LCD_Enable_Pin 14
#define LCD_Enable_Port GPIOB
#define LCD_ReadWrite_Pin 13
#define LCD_ReadWrite_Port GPIOB
#define LCD_RegisterSelect_Pin 12
#define LCD_RegisterSelect_Port GPIOB

#define time_Delay_before_Enable 1200
#define time_Delay_before_Disable 2400


void SetPortAndPinForOutput(GPIO_TypeDef *port,int pinNumber)
{
	if(port==GPIOA){
		RCC->AHBENR|=RCC_AHBENR_GPIOAEN;
	}
	if(port==GPIOB){
		RCC->AHBENR|=RCC_AHBENR_GPIOBEN;
	}
	if(port==GPIOC){
		RCC->AHBENR|=RCC_AHBENR_GPIOCEN;
	}
	if(port==GPIOD){
		RCC->AHBENR|=RCC_AHBENR_GPIODEN;
	}
	if(port==GPIOF){
		RCC->AHBENR|=RCC_AHBENR_GPIOFEN;
	}

	port->MODER&=~(1<<((pinNumber*2)+1));
	port->MODER|=(1<<pinNumber*2);

	port->OSPEEDR|=(1<<((pinNumber*2)+1))|(1<<pinNumber*2);

	port->OTYPER&=~(1<<pinNumber);

	port->PUPDR&=~(1<<pinNumber);
}
void InitializePortsForLCD()
{
	SetPortAndPinForOutput(LCD_D0_Port,LCD_D0_Pin);
	SetPortAndPinForOutput(LCD_D1_Port,LCD_D1_Pin);
	SetPortAndPinForOutput(LCD_D2_Port,LCD_D2_Pin);
	SetPortAndPinForOutput(LCD_D3_Port,LCD_D3_Pin);
	SetPortAndPinForOutput(LCD_D4_Port,LCD_D4_Pin);
	SetPortAndPinForOutput(LCD_D5_Port,LCD_D5_Pin);
	SetPortAndPinForOutput(LCD_D6_Port,LCD_D6_Pin);
	SetPortAndPinForOutput(LCD_D7_Port,LCD_D7_Pin);

	SetPortAndPinForOutput(LCD_Enable_Port,LCD_Enable_Pin);
	SetPortAndPinForOutput(LCD_ReadWrite_Port,LCD_ReadWrite_Pin);
	SetPortAndPinForOutput(LCD_RegisterSelect_Port,LCD_RegisterSelect_Pin);
}
void SendBitToPortAndPin(GPIO_TypeDef *port,int pinNumber,uint8_t bitState)
{		if(bitState){
			port->BSRR|=(1<<pinNumber);
		} else{
			port->BRR|=(1<<pinNumber);
		}
}
void LCD_Enable()
{
	notExact_TimeDelay(time_Delay_before_Enable);
	SendBitToPortAndPin(LCD_Enable_Port,LCD_Enable_Pin,1);
}

void LCD_Set_to_Write()
{
	SendBitToPortAndPin(LCD_ReadWrite_Port,LCD_ReadWrite_Pin,0);
}

void LCD_Set_to_Read()
{
	SendBitToPortAndPin(LCD_ReadWrite_Port,LCD_ReadWrite_Pin,1);
}

void LCD_Instruction_Mode()
{
	SendBitToPortAndPin(LCD_RegisterSelect_Port,LCD_RegisterSelect_Pin,0);
}

void LCD_Character_Mode()
{
	SendBitToPortAndPin(LCD_RegisterSelect_Port,LCD_RegisterSelect_Pin,1);
}


void LCDSendAByteToTheLCDDataPins(char character)
{
	SendBitToPortAndPin(LCD_D0_Port,LCD_D0_Pin,character & 0b00000001);
	SendBitToPortAndPin(LCD_D1_Port,LCD_D1_Pin,character & 0b00000010);
	SendBitToPortAndPin(LCD_D2_Port,LCD_D2_Pin,character & 0b00000100);
	SendBitToPortAndPin(LCD_D3_Port,LCD_D3_Pin,character & 0b00001000);
	SendBitToPortAndPin(LCD_D4_Port,LCD_D4_Pin,character & 0b00010000);
	SendBitToPortAndPin(LCD_D5_Port,LCD_D5_Pin,character & 0b00100000);
	SendBitToPortAndPin(LCD_D6_Port,LCD_D6_Pin,character & 0b01000000);
	SendBitToPortAndPin(LCD_D7_Port,LCD_D7_Pin,character & 0b10000000);
	notExact_TimeDelay(time_Delay_before_Disable);
	SendBitToPortAndPin(LCD_Enable_Port,LCD_Enable_Pin,0);
}

void notExact_TimeDelay(int timeDelay)
{
	volatile i;
	for(i=0; i<timeDelay;i++)
	{

	}
}

void LCD_SendACharcter(char character)
{
	LCD_Set_to_Write();
	LCD_Character_Mode();
	LCD_Enable();
	LCDSendAByteToTheLCDDataPins(character);
}

void LCD_SendAnInstruction(char character)
{
	LCD_Set_to_Write();
	LCD_Instruction_Mode();
	LCD_Enable();
	LCDSendAByteToTheLCDDataPins(character);
}
void LCD_Send_a_String(const char *String_of_Characters)
{
	while( *String_of_Characters)
	{
		LCD_SendACharcter(*String_of_Characters++);
	}
}
#endif

 

Ссылка на комментарий
Поделиться на другие сайты

Отладка - неотъемлемая часть написания программ.
Прогоните отладчиком и посмотрите, что передаётся в LCD_SendACharcter. Возможно, компилятор пихает строку куда-нибудь не туда, в какую-нибудь не ту область памяти.

Ссылка на комментарий
Поделиться на другие сайты

16.01.2021 в 13:13, Purple сказал:

void LCD_Send_a_String(const char *String_of_Characters)

квадратики, между прочим, это символ 0hff

тут в функции точно нужен модификатор const?

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
  • Сообщения

×
×
  • Создать...