реклама на сайте
подробности

 
 
> Универсальный LCD идикатор(GPIO,I2C), Алгоритм
pokk
сообщение Apr 2 2018, 09:50
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 91
Регистрация: 3-07-11
Пользователь №: 66 028



Добрый день, в одном из проектов, подключил LCD индикатор через расширитель порта по I2C, но код получился, как-то не очень надежный, в общем сейчас появилось по больше времени, и решил ещё раз все обдумать и сделать нормальный модуль LCD, который можно в любой проект пихать. Но пока только какая то каша в голове.
В общем вот примерно как-то так было, во время всех while, переключался на другие процессы через ОС.
Теперь меня интересует, как бы все это сделать без ОС,( для самообразования!!).
ну и желательно, прозрачный код, но это уже не обязательно.
CODE

//================================================================================
void DisplayUpdate(unsigned char *buf){
unsigned char LcdCountChar;
unsigned char GetCharTemp;
for(LcdCountChar=0;LcdCountChar<40;LcdCountChar++){
if(LcdCountChar==0){
WriteLCDcommand(ADDRESS_FIRST_ROW);
}
if(LcdCountChar==20){
WriteLCDcommand(ADDRESS_SECOND_ROW);
}
GetCharTemp=UTF_conversion(buf[LcdCountChar]);
WriteLCDdata(GetCharTemp);
}
}
//================================================================================
void WriteLCDdata(unsigned char data){
SetRS;
WriteLCD_Nibble(data);
data=data<<4;
WriteLCD_Nibble(data);
}
//================================================================================
void WriteLCD_Nibble(unsigned char data){
SetE;
SetW;
//------------------------
GlobalData_Lcd=data;
Pcf8575_Send_data(GlobalData_Lcd,GlobalData_Led_key_lcd);
//PortLCD=(PortLCD&0xFF0F)|(data&0xF0);
while(Pcf8575_Send_ok==1){} //Передача завершилась
//------------------------
ClrE;
}

Как вот это:
Код
while(Pcf8575_Send_ok==1){} //Передача завершилась

вынести в самый верх что бы можно было по опрашивать в main?

Была идея все данные закинуть в стек, а потом, их выдавать.
где все функции будут запускаться в том порядке как их и устанавливали, но тогда получается на каждый чих( SetE;)
внутри WriteLCD_Nibble надо делать тоже функцию, и все это в большую очередь выстроиться, ну и тут так же стала проблема в том что разные параметры передается,и помимо установки в стек обработчиков, надо ещё и параметры устанавливать.
Код
void Lcd_init(void){
    Lcd_pin_init();
    LCD_ON();
    //----------------
    RTOS_SetTask(lcd_set_8bit_mode(0),0,100);      
    RTOS_SetTask(WriteLCDcommand,0,100);         
    RTOS_SetTask(WriteLCDcommand(0x30),0,0);     
    RTOS_SetTask(WriteLCDcommand(0x30),0,0);      
    RTOS_SetTask(WriteLCDcommand(0x3C),0,0);      
    RTOS_SetTask(lcd_cursor_mode(LCD_ENABLE,CURSOR_ENABLE,BLINK),0,0);
    RTOS_SetTask(WriteLCDcommand(0x1),0,0);  
    
    RTOS_SetTask(Start_UpadeDispaly,0,0);  
    return
}


Думал сделать на КА, жестко прописать какие функции за кем вызываються, но тут
1) теряется читабельность(хотя с этим я уже мерился, так 1 раз все это прописать и больше туда возвращаться не планирую).
2) когда следуют одинаковые функции друг за другом типа 2 раза вызов функции WriteLCDcommand с разным параметром.
как тут быть даже не знаю, делал ещё пред настройку(как бы буфер на 2 функции вперед), установку функции Next, которая будет выполнятся после установленной, но тут получилось все запутано совсем.

Подскажите в какую сторону двигаться?.








Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 16:21
Рейтинг@Mail.ru


Страница сгенерированна за 0.01348 секунд с 7
ELECTRONIX ©2004-2016