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