Дык ты же на С не читаешь? И у меня больше специфической функциональности. И при чем тут ЖКИ? Функции вывода в дисплей могут быть, могут не быть, это второстепенно. 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;
}
}