ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
28 марта
272308 Топик полностью
Vladimir Ljaschko (15.09.2011 10:28, просмотров: 461) ответил mazur на А можно пример меню с редактируемыми параметрами для знакосинтезирующего ЖКИ? Все равно некоторые вопросы остались. Только сформулировать пока их не могу :)
Дык ты же на С не читаешь? И у меня больше специфической функциональности. И при чем тут ЖКИ? Функции вывода в дисплей могут быть, могут не быть, это второстепенно.  1. Подпрограмма выбора первой точки калибровки //----------------------------------------------------------------------- // calibration of point, step 1 : // pumping and selecting a factor //----------------------------------------------------------------------- void ShowCalibrPumping( void) { unsigned int f; SetLcdPos(1,2); printf("%3d",calibr_factor); f=GetFrequencyByFactor(calibr_factor); SetLcdPos(9,2); printf("%02u.%03uHz",f/1000,f%1000); pcSLB(); } #define delta 1 void fCalibrPoint1(void) { switch (event) { case evNew: if (calibr_factor<50) calibr_factor=50; ShowCalibrPumping(); StartPumping(calibr_factor); Old(); break; case evDn: if (calibr_factor>delta) calibr_factor-=delta; RestartPumping(calibr_factor); ShowCalibrPumping(); pcSLB(); break; case evUp: if (calibr_factor<MaxFactor-delta) calibr_factor+=delta; else calibr_factor=MaxFactor; RestartPumping(calibr_factor); ShowCalibrPumping(); pcSLB(); break; case evFn: StopPumping(); StopValve(); NEWS(stCalibrMenu); break; case evSec: ShowCalibrPumping(); break; case evSt: StartValve(); NEWS(stCalibrPoint2); break; } } Подпрограмма посимвольной корректировки значения, написанная "в лоб" давным-давно. void ShowDigit(void) { SetLcdPos(edit_value.x+edit_value.position,edit_value.y); printf("%c",edit_value.buffer[edit_value.position]); pcSLB(); } void fEditValue(void) { switch (event) { case evNew: edit_value.position=0; edit_value.blink=1; SetLcdPos(edit_value.x, edit_value.y); printf("%s", (char*)edit_value.buffer); pcSLB(); Old(); break; case evFn: edit_value.new_value=edit_value.old_value; NEWS(state.return_abort); break; case evDn: if (edit_value.buffer[edit_value.position]>0x30) edit_value.buffer[edit_value.position]--; else edit_value.buffer[edit_value.position]=0x39; ShowDigit(); break; case evUp: if (edit_value.buffer[edit_value.position]<0x39) edit_value.buffer[edit_value.position]++; else edit_value.buffer[edit_value.position]=0x30; ShowDigit(); break; case evSt: if (edit_value.position<edit_value.length-1) { ShowDigit(); edit_value.position++; } else { ShowDigit(); switch (edit_value.length) { case 2: edit_value.new_value=10*(int)(edit_value.buffer[0]-0x30)+ (int)(edit_value.buffer[1]-0x30); break; case 3: edit_value.new_value=100*(int)(edit_value.buffer[0]-0x30)+ 10*(int)(edit_value.buffer[1]-0x30)+ (int)(edit_value.buffer[2]-0x30); break; case 4: edit_value.new_value=1000*(int)(edit_value.buffer[0]-0x30)+ 100*(int)(edit_value.buffer[1]-0x30)+ 10*(int)(edit_value.buffer[2]-0x30)+ (int)(edit_value.buffer[3]-0x30); break; case 5: edit_value.new_value=10000*(int)(edit_value.buffer[0]-0x30)+ 1000*(int)(edit_value.buffer[1]-0x30)+ 100*(int)(edit_value.buffer[2]-0x30)+ 10*(int)(edit_value.buffer[3]-0x30)+ (int)(edit_value.buffer[4]-0x30); break; } NEWS(state.return_ok); } break; case ev500ms: if (edit_value.blink) { SetLcdPos(edit_value.x+edit_value.position,edit_value.y); printf(" "); edit_value.blink=0; } else { ShowDigit(); edit_value.blink=1; } break; } }