| AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
HD44780 и PCF8574
25.07.2016, 13:49
|
|
|
Частый гость
Регистрация: 28.02.2011
Сообщений: 33
Сказал спасибо: 1
Сказали Спасибо 13 раз(а) в 12 сообщении(ях)
|
HD44780 и PCF8574
Уважаемые Форумчане, поделитесь опытом.
Кто-нибудь работал с 1602 дисплеем через расширитель портов? Бьюсь с ним уже не первый день. Готовых библиотек (под AVR Си) я нигде не нашёл.
Большая просьба: разжуйте по буквам как должна идти запись байта в 4-битном режиме в индикатор (просто, без расширителя портов), какие задержки строба, и как провести инициализацию дисплея в 4 битном режиме (какие байты слать? по очереди, потому что те, что по даташиту у меня не работают).
|
|
|
|
25.07.2016, 13:53
|
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,821
Сказал спасибо: 919
Сказали Спасибо 4,289 раз(а) в 2,570 сообщении(ях)
|
Re: HD44780 и PCF8574
Делал. Работало. Пару часов ушло, завелось с первого раза.
Вечером буду искать коды. Давно дело было.
|
|
|
|
25.07.2016, 14:21
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 29.12.2004
Адрес: Bернулся в San Jose,CA,USA,Beach BLVD,свой дом,окна на океан-ничего личного,просто бизнес!
Сообщений: 1,098
Сказал спасибо: 22
Сказали Спасибо 425 раз(а) в 318 сообщении(ях)
|
Re: HD44780 и PCF8574
Сообщение от Andrejchukov
|
|
библиотек (под AVR Си)
|
Возможно это вам поможет http://we.easyelectronics.ru/AVR/bib...lerov-avr.html
__________________
"Дворяне и их младые отроки должны всегда меж собою говорить на ВЫ и на иностранных языках, дабы тем навыкнуть могли, и чтобы их можно было от других незнающих болванов распознать."
Уложение о поведении (с) царь Пётр I
|
|
|
|
25.07.2016, 14:33
|
|
|
Гуру портала
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 11,134
Сказал спасибо: 202
Сказали Спасибо 3,285 раз(а) в 2,151 сообщении(ях)
|
Re: HD44780 и PCF8574
во. элон опять приперся. в отпуске шоль был?? дает как всегда тупые советы
я буквально вчера запустил на стм32ф030 именно такой дисплей.
за 3 минуты нашел как его инитить и даже не вдумываясь в 3 часа ночи тупо вот по этому мануалу проинитил и все поперло с первого раза
http://vrtp.ru/index.php?showtopic=21620&st=0
если соплями повозить хочется то вот это почитай
http://easystm32.ru/indication/22-hd44780-and-stm32
ну понятно все это надо изобразить через иц шину. что еще легче даже с моей точки зрения
__________________
кагмаподэ магмаподэ
Последний раз редактировалось индюк; 25.07.2016 в 14:37.
|
|
|
|
25.07.2016, 14:37
|
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,821
Сказал спасибо: 919
Сказали Спасибо 4,289 раз(а) в 2,570 сообщении(ях)
|
Re: HD44780 и PCF8574
У меня была библиотека для 1602 еще в середине прошлого столетия написана еще под АРМы, которые из говна и камня делали. Просто драйвер PCF прикрутил и все заработало. Честно говоря, даже тайминги не проверял.
|
|
|
|
25.07.2016, 14:56
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 29.12.2004
Адрес: Bернулся в San Jose,CA,USA,Beach BLVD,свой дом,окна на океан-ничего личного,просто бизнес!
Сообщений: 1,098
Сказал спасибо: 22
Сказали Спасибо 425 раз(а) в 318 сообщении(ях)
|
Re: HD44780 и PCF8574
Сообщение от индюк
|
|
во. элон опять приперся. в отпуске шоль был?? дает как всегда тупые советы
|
А над вами любезнейший in Duke время не властно ... как были хамлом и невежей так им и остались ....
__________________
"Дворяне и их младые отроки должны всегда меж собою говорить на ВЫ и на иностранных языках, дабы тем навыкнуть могли, и чтобы их можно было от других незнающих болванов распознать."
Уложение о поведении (с) царь Пётр I
|
|
|
|
25.07.2016, 15:32
|
|
|
Частый гость
Регистрация: 28.02.2011
Сообщений: 33
Сказал спасибо: 1
Сказали Спасибо 13 раз(а) в 12 сообщении(ях)
|
Re: HD44780 и PCF8574
Спасибо большое за ссылки. Всё-таки проблема была в неправильной инициализации, а не в задержках строба. По сравнению с даташитом на МЭЛТ дисплей - совсем другая последовательность инициализации. Ещё раз - спасибо, теперь допишу свою библиотеку на CVAVR.
|
|
|
|
25.07.2016, 16:00
|
|
|
Гуру портала
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 11,134
Сказал спасибо: 202
Сказали Спасибо 3,285 раз(а) в 2,151 сообщении(ях)
|
Re: HD44780 и PCF8574
Да. Инит там странный. Совершенно непонятно зачем там первые три посылки, но я просто сделал и оно заработало.
__________________
кагмаподэ магмаподэ
|
|
|
|
25.07.2016, 23:51
|
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,821
Сказал спасибо: 919
Сказали Спасибо 4,289 раз(а) в 2,570 сообщении(ях)
|
Re: HD44780 и PCF8574
Мой вариант драйвера
Заголовок:
|
Код:
|
/* H/W defined layer, bit definitions according schematic connections */
#define LCD_BackLight_BIT (1‹‹3) // Backlight connected to PIN_3
#define LCD_RS_BIT (1‹‹0) // RS connected to PIN_0
#define LCD_E_BIT (1‹‹2) // EN connected to PIN_2
#define LCD_Data_Mask 0xF0
#define LCD_CMD_Mask 0x0E
typedef enum
{
HD44780_Cursor_Off = 0x0C,
HD44780_Blink_Cursor_On = 0x0F,
HD44780_Underline_Cursor_On = 0x0E,
HD44780_First_Row = 0x80,
HD44780_Second_Row = 0xC0,
HD44780_Third_Row = 0x94,
HD44780_Fourth_Row = 0xD4,
HD44780_Clear = 0x01,
HD44780_Return_Home = 0x02,
HD44780_Move_Cursor_Left = 0x10,
HD44780_Move_Cursor_Right = 0x14,
HD44780_Turn_On = 0x0C,
HD44780_Turn_Off = 0x08,
HD44780_Shift_Left = 0x18,
HD44780_Shift_Right = 0x1C,
HD44780_FunctionSet4bit2lines = 0x28,
HD44780_NewString = 0x80 | 0x40,
}HD44780_RegTypeDef;
typedef struct
{
/* Functions */
char (*WritePage) (char I2C_Adrs, char * MemPos, char MemPosSize, char * buf, char size);
void (*delay_func)(unsigned int ms);
/* Settings */
char I2C_Adrs;
}PCF8574_StructTypeDef;
char HD44780_Init(PCF8574_StructTypeDef * PCF8574_Struct);
char HD44780_PrintChar(PCF8574_StructTypeDef * PCF8574_Struct, char Data);
char HD44780_PrintString(PCF8574_StructTypeDef * PCF8574_Struct, char * string);
char HD44780_ClearScreen(PCF8574_StructTypeDef * PCF8574_Struct);
char HD44780_SetCursorPos(PCF8574_StructTypeDef * PCF8574_Struct, char row, char colum); |
Сам драйвер:
|
Код:
|
#include "PCF8574+HD44780.h"
/* Internal variables */
char LCD_Data;
/* Internal functions */
char PCF8574_Write (PCF8574_StructTypeDef * PCF8574_Struct, char Data);
char HD44780_Write (PCF8574_StructTypeDef * PCF8574_Struct, char Data);
char HD44780_SendCMD (PCF8574_StructTypeDef * PCF8574_Struct, HD44780_RegTypeDef CMD);
/**
* @brief Initialize LCD
* @param PCF8574_Struct: pointer to structer with all settings defined
* @retval 0 if succes or interface error code
*/
char HD44780_Init(PCF8574_StructTypeDef * PCF8574_Struct)
{
char Result;
PCF8574_Struct-›delay_func(17);
Result = HD44780_Write(PCF8574_Struct, 0x30);
PCF8574_Struct-›delay_func(1);
HD44780_Write(PCF8574_Struct, 0x30);
PCF8574_Struct-›delay_func(1);
HD44780_Write(PCF8574_Struct, 0x30);
PCF8574_Struct-›delay_func(1);
HD44780_Write(PCF8574_Struct, 0x20); //4 bit wide bus
HD44780_SendCMD(PCF8574_Struct, HD44780_FunctionSet4bit2lines);
HD44780_SendCMD(PCF8574_Struct, HD44780_Move_Cursor_Left);
HD44780_SendCMD(PCF8574_Struct, HD44780_Clear);
HD44780_SendCMD(PCF8574_Struct, HD44780_Blink_Cursor_On);
HD44780_SendCMD(PCF8574_Struct, HD44780_Cursor_Off);
HD44780_SendCMD(PCF8574_Struct, HD44780_Clear);
PCF8574_Struct-›delay_func(10);
return Result;
}
/**
* @brief Prints character at current cursor position
* @param PCF8574_Struct: pointer to structer with all settings defined
* @param Data: ASCII code of symbol
* @retval 0 if succes or interface error code
*/
char HD44780_PrintChar(PCF8574_StructTypeDef * PCF8574_Struct, char Data)
{
char Result;
if (Data == '\n')
Result = HD44780_SendCMD (PCF8574_Struct, HD44780_NewString);
else
Result = HD44780_Write(PCF8574_Struct, Data);
return Result;
}
/**
* @brief Prints null-terminated string at current cursor position
* @param PCF8574_Struct: pointer to structer with all settings defined
* @param string: pointer to null-terminated string
* @retval 0 if succes or interface error code
*/
char HD44780_PrintString(PCF8574_StructTypeDef * PCF8574_Struct, char * string)
{
char Result = 0;
while (*string && !Result)
Result = HD44780_PrintChar(PCF8574_Struct, *string++);
return Result;
}
/**
* @brief Clears LCD
* @param PCF8574_Struct: pointer to structer with all settings defined
* @retval 0 if succes or interface error code
*/
char HD44780_ClearScreen(PCF8574_StructTypeDef * PCF8574_Struct)
{
return HD44780_SendCMD(PCF8574_Struct, HD44780_Clear);
}
/**
* @brief Moves cursor to curresponding position
* @param PCF8574_Struct: pointer to structer with all settings defined
* @param row: number of row
* @param row: number of colum
* @retval 0 if succes or interface error code
*/
char HD44780_SetCursorPos(PCF8574_StructTypeDef * PCF8574_Struct, char row, char colum)
{
char position = 0x80;
if (row › 0) { position |= 0x40;}
return HD44780_SendCMD(PCF8574_Struct, (HD44780_RegTypeDef)(position | colum));
}
char HD44780_SendCMD (PCF8574_StructTypeDef * PCF8574_Struct, HD44780_RegTypeDef CMD)
{
char Result;
PCF8574_Struct-›delay_func(5);
LCD_Data &= ~LCD_RS_BIT;
Result = HD44780_Write (PCF8574_Struct, (char)CMD & 0xF0);
HD44780_Write (PCF8574_Struct, ((char)CMD & 0x0F)‹‹4);
return Result;
}
char HD44780_Write (PCF8574_StructTypeDef * PCF8574_Struct, char Data)
{
char Result;
LCD_Data &= LCD_RS_BIT | LCD_BackLight_BIT;
LCD_Data |= (Data & LCD_Data_Mask) | LCD_E_BIT;
Result = PCF8574_Write(PCF8574_Struct, LCD_Data);
LCD_Data &= ~LCD_E_BIT;
PCF8574_Write(PCF8574_Struct, LCD_Data);
return Result;
}
char PCF8574_Write (PCF8574_StructTypeDef * PCF8574_Struct, char Data)
{
return PCF8574_Struct-›WritePage(PCF8574_Struct-›I2C_Adrs, &Data, 1, (void*)0, 0);
}
void HD44780_BackLight (char State)
{
if (State)
LCD_Data |= LCD_BackLight_BIT;
else
LCD_Data &= ~LCD_BackLight_BIT;
} |
Инитиализация: (тоже мало понятная, но иначе не работает)
|
Код:
|
PCF8574_StructTypeDef PCF8574_Struct;
PCF8574_Struct.delay_func = vTaskDelay;
PCF8574_Struct.WritePage = I2C_WritePage;
PCF8574_Struct.I2C_Adrs = 0x40;
HD44780_Init(&PCF8574_Struct); |
Пример работы:
|
Код:
|
HD44780_PrintString(&PCF8574_Struct, "HelloWorld!"); |
|
|
|
|
Сказали "Спасибо" Easyrider83
|
|
|
25.07.2016, 23:54
|
|
|
Частый гость
Регистрация: 28.02.2011
Сообщений: 33
Сказал спасибо: 1
Сказали Спасибо 13 раз(а) в 12 сообщении(ях)
|
Re: HD44780 и PCF8574
Сообщение от Easyrider83
|
Мой вариант драйвера
Заголовок:
|
Код:
|
/* H/W defined layer, bit definitions according schematic connections */
#define LCD_BackLight_BIT (1‹‹3) // Backlight connected to PIN_3
#define LCD_RS_BIT (1‹‹0) // RS connected to PIN_0
#define LCD_E_BIT (1‹‹2) // EN connected to PIN_2
#define LCD_Data_Mask 0xF0
#define LCD_CMD_Mask 0x0E
typedef enum
{
HD44780_Cursor_Off = 0x0C,
HD44780_Blink_Cursor_On = 0x0F,
HD44780_Underline_Cursor_On = 0x0E,
HD44780_First_Row = 0x80,
HD44780_Second_Row = 0xC0,
HD44780_Third_Row = 0x94,
HD44780_Fourth_Row = 0xD4,
HD44780_Clear = 0x01,
HD44780_Return_Home = 0x02,
HD44780_Move_Cursor_Left = 0x10,
HD44780_Move_Cursor_Right = 0x14,
HD44780_Turn_On = 0x0C,
HD44780_Turn_Off = 0x08,
HD44780_Shift_Left = 0x18,
HD44780_Shift_Right = 0x1C,
HD44780_FunctionSet4bit2lines = 0x28,
HD44780_NewString = 0x80 | 0x40,
}HD44780_RegTypeDef;
typedef struct
{
/* Functions */
char (*WritePage) (char I2C_Adrs, char * MemPos, char MemPosSize, char * buf, char size);
void (*delay_func)(unsigned int ms);
/* Settings */
char I2C_Adrs;
}PCF8574_StructTypeDef;
char HD44780_Init(PCF8574_StructTypeDef * PCF8574_Struct);
char HD44780_PrintChar(PCF8574_StructTypeDef * PCF8574_Struct, char Data);
char HD44780_PrintString(PCF8574_StructTypeDef * PCF8574_Struct, char * string);
char HD44780_ClearScreen(PCF8574_StructTypeDef * PCF8574_Struct);
char HD44780_SetCursorPos(PCF8574_StructTypeDef * PCF8574_Struct, char row, char colum); |
Сам драйвер:
|
Код:
|
#include "PCF8574+HD44780.h"
/* Internal variables */
char LCD_Data;
/* Internal functions */
char PCF8574_Write (PCF8574_StructTypeDef * PCF8574_Struct, char Data);
char HD44780_Write (PCF8574_StructTypeDef * PCF8574_Struct, char Data);
char HD44780_SendCMD (PCF8574_StructTypeDef * PCF8574_Struct, HD44780_RegTypeDef CMD);
/**
* @brief Initialize LCD
* @param PCF8574_Struct: pointer to structer with all settings defined
* @retval 0 if succes or interface error code
*/
char HD44780_Init(PCF8574_StructTypeDef * PCF8574_Struct)
{
char Result;
PCF8574_Struct-›delay_func(17);
Result = HD44780_Write(PCF8574_Struct, 0x30);
PCF8574_Struct-›delay_func(1);
HD44780_Write(PCF8574_Struct, 0x30);
PCF8574_Struct-›delay_func(1);
HD44780_Write(PCF8574_Struct, 0x30);
PCF8574_Struct-›delay_func(1);
HD44780_Write(PCF8574_Struct, 0x20); //4 bit wide bus
HD44780_SendCMD(PCF8574_Struct, HD44780_FunctionSet4bit2lines);
HD44780_SendCMD(PCF8574_Struct, HD44780_Move_Cursor_Left);
HD44780_SendCMD(PCF8574_Struct, HD44780_Clear);
HD44780_SendCMD(PCF8574_Struct, HD44780_Blink_Cursor_On);
HD44780_SendCMD(PCF8574_Struct, HD44780_Cursor_Off);
HD44780_SendCMD(PCF8574_Struct, HD44780_Clear);
PCF8574_Struct-›delay_func(10);
return Result;
}
/**
* @brief Prints character at current cursor position
* @param PCF8574_Struct: pointer to structer with all settings defined
* @param Data: ASCII code of symbol
* @retval 0 if succes or interface error code
*/
char HD44780_PrintChar(PCF8574_StructTypeDef * PCF8574_Struct, char Data)
{
char Result;
if (Data == '\n')
Result = HD44780_SendCMD (PCF8574_Struct, HD44780_NewString);
else
Result = HD44780_Write(PCF8574_Struct, Data);
return Result;
}
/**
* @brief Prints null-terminated string at current cursor position
* @param PCF8574_Struct: pointer to structer with all settings defined
* @param string: pointer to null-terminated string
* @retval 0 if succes or interface error code
*/
char HD44780_PrintString(PCF8574_StructTypeDef * PCF8574_Struct, char * string)
{
char Result = 0;
while (*string && !Result)
Result = HD44780_PrintChar(PCF8574_Struct, *string++);
return Result;
}
/**
* @brief Clears LCD
* @param PCF8574_Struct: pointer to structer with all settings defined
* @retval 0 if succes or interface error code
*/
char HD44780_ClearScreen(PCF8574_StructTypeDef * PCF8574_Struct)
{
return HD44780_SendCMD(PCF8574_Struct, HD44780_Clear);
}
/**
* @brief Moves cursor to curresponding position
* @param PCF8574_Struct: pointer to structer with all settings defined
* @param row: number of row
* @param row: number of colum
* @retval 0 if succes or interface error code
*/
char HD44780_SetCursorPos(PCF8574_StructTypeDef * PCF8574_Struct, char row, char colum)
{
char position = 0x80;
if (row › 0) { position |= 0x40;}
return HD44780_SendCMD(PCF8574_Struct, (HD44780_RegTypeDef)(position | colum));
}
char HD44780_SendCMD (PCF8574_StructTypeDef * PCF8574_Struct, HD44780_RegTypeDef CMD)
{
char Result;
PCF8574_Struct-›delay_func(5);
LCD_Data &= ~LCD_RS_BIT;
Result = HD44780_Write (PCF8574_Struct, (char)CMD & 0xF0);
HD44780_Write (PCF8574_Struct, ((char)CMD & 0x0F)‹‹4);
return Result;
}
char HD44780_Write (PCF8574_StructTypeDef * PCF8574_Struct, char Data)
{
char Result;
LCD_Data &= LCD_RS_BIT | LCD_BackLight_BIT;
LCD_Data |= (Data & LCD_Data_Mask) | LCD_E_BIT;
Result = PCF8574_Write(PCF8574_Struct, LCD_Data);
LCD_Data &= ~LCD_E_BIT;
PCF8574_Write(PCF8574_Struct, LCD_Data);
return Result;
}
char PCF8574_Write (PCF8574_StructTypeDef * PCF8574_Struct, char Data)
{
return PCF8574_Struct-›WritePage(PCF8574_Struct-›I2C_Adrs, &Data, 1, (void*)0, 0);
}
void HD44780_BackLight (char State)
{
if (State)
LCD_Data |= LCD_BackLight_BIT;
else
LCD_Data &= ~LCD_BackLight_BIT;
} |
Инитиализация: (тоже мало понятная, но иначе не работает)
|
Код:
|
PCF8574_StructTypeDef PCF8574_Struct;
PCF8574_Struct.delay_func = vTaskDelay;
PCF8574_Struct.WritePage = I2C_WritePage;
PCF8574_Struct.I2C_Adrs = 0x40;
HD44780_Init(&PCF8574_Struct); |
Пример работы:
|
Код:
|
HD44780_PrintString(&PCF8574_Struct, "HelloWorld!"); |
|
Спасибо, пригодится. Хочу тоже написать все функции в своей библиотеке.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 19:51.
|
|