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

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-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 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 пользователей онлайн

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

    • Так, ну ладно,... забудем про сигнатуры.... И так,... как я вижу Программу. Программа состоит из двух файлов: экзешника и хелпера, а лучше одного экзешника, чтобы не путаться в обилии файлов в директории. Можно выбрать номер кома и его скорость, тип МК, а также другие вспомогательные парметры,..... и ... большая красная кнопка "сгенерировать Бутлодер", при нажатии которой, создается файл Бутлодера, с соответствующим именем. Внутри файла Бутлодера несколько байт выделено для названия МК, которые возможно считать Программой, и которые в дальнейшем определяют модель работы Программы с Бутлодером, чтобы не путать пользоваетля. Сделать относительно короткими пакеты обмена между Программой и Бутлодером, чтобы избежать длительных зависаний. Конечно это увеличит общее время записи, ну мы же никуда не спешим. Добавить команду считывания названия МК из Бутлодера, что кажется мне самым важным. Да, как я организую процесс записи флеш: заполняю буфер несколькими командами, запускаю команду записать страницу. МК принимает данную команду, декодирует и запускает стирание страницы, дожидается окончания процесса стирания страницы (<5 мс, ЦПУ остановлено), запускает запись страницы (<5 мс, ЦПУ остановлено), осуществляет проверку записанных данных на странице(верификация) и посылает ответ ПК с флагом проверки данных.(Это все из дата шита). Запись в еепром производится побайтно в каждой комманде. (ну мы же никуда не спешим). При записи в еепром считываются данные из ячейки, и если они совпадают с теми, что нужно записать, то запись не осуществляется. В противном случае запускаем запись данных в ячейку (<5 мс), ждем окончания записи , осуществляем проверку записанных данных в еепром(верификация) и посылаем ответ ПК с флагом проверки данных. Ну как-то так крупными мазками.    
    • Не эта конкретная плата, а AMP2X15 на основе TPA3110D2: Могли бы в своей теме задать вопрос, а не плодить темы.
    • Не хватает. Это же песочница? Да, только бы понять это точнее. Спасибо за идею.
    • Попробуй еще раз сакцентировать внимание. В рамках моего вопроса, рассматривается ТОЛЬКО способ крепления разьема с ПРЯМЫМИ ногами, ВДОЛЬ платы. Другие способы не подойдут. Никак. Совсем. Их нет смысла советовать. И основной вопрос "как разместить переходные отверстия, что бы максимально крепко пролить оловом ноги разьема?". Желательно без клея. Пока из дельного насоветовали только что-то типа Оловянных Клепок, через овтерстия максимально большого проходного сечения  
    • ДБ функция логарифмическая, а на твоём спектралабе шкала дб линейная, почему??? Радиотехник ты неплохой, а вот метролог из тебя левый. Учи матчасть и не зас_рай  тему своим офтопом.
    • правильно мыслишь... скорее всего надо увеличить сопротивление R1 до 2-3 кОм.. (или R3)..
    • @r9o-11 Я про перемотку трансформатора. Не, возможно если магнитопроводов под рукой запас, провода запас, станочек есть, рука набита - тогда да, это будет быстрее и проще. Но мне кажется что в современных реалиях добыть два импульсных БП подходящей мощности всё-же легче. А человеку далёкому от электроники - гораздо легче. 
×
×
  • Создать...