Прошу помощь зала

С редактированием и сохранением переменных типа
double проблем нет. А вот с переменными типа
unsigned char какая-то ерунда получается... Напомню, что есть две переменных
unsigned char rate, nmax и две переменные
unsigned char ee_rate, ee_nmax. Их адреса содержатся в глобальных массивах:
Код
unsigned char* option[] = {&rate, &nmax};
unsigned char __eeprom* optionEE[] = {&ee_rate, &ee_nmax};
В начале программы
Код
int main()
{
// Initialise variables from EEPROM
area = ee_area;
Kt = ee_Kt;
Y0 = ee_Y0;
rate = ee_rate;
nmax = ee_nmax;
...........
При входе в пункт меню
Код
// Редактирование установок прибора:
// значения частоты АЦП (rate) и значения усреднения (nmax)
//------------------------------------------------------------------------------
void Level1Item1Sub2sub1_Func(void)
{
TCritSect cs;
real = false;
pValue = *option; // &rate;
pValueEE = *optionEE; // &ee_rate;
ks0108GotoXY(94, 21);
itoa(nmax, lcd_buf);
ks0108PutStr(lcd_buf);
ks0108GotoXY(94, 11);
itoa(*(unsigned char*)pValue, lcd_buf);
ks0108PutStr(lcd_buf);
xx = 94;
yy = 11;
plcd_buf = lcd_buf;
w = ks0108CharWidth(*lcd_buf)-2;
CurrentMode = &EditValue;
ks0108FillRect(0, 40, 20, 9, WHITE); // Эти три строки нужны только для посмотреть
ks0108GotoXY(0, 40); //
ks0108PutChar((char)(*((unsigned char*)pValue+0))+'0'); // содержимое указателя + 0, +1
}
Обе переменные сохранены в EEPROM (имеют значения 1 и 2 соответственно). Это можна увидеть по прочитанному hex-файлу EEPROM (последние два байта):
Код
:020000020000FC
:100000000000A03F829523405D8F52400102FFFF18
При входе в пункт меню вывожу содержимое указателя на экран
Код
ks0108PutChar((char)(*((unsigned char*)pValue+0))+'0');
выводит '1'.
А вот если вывести
Код
ks0108PutChar((char)(*((unsigned char*)pValue+1))+'0');
, то выводит '0'. Получается, что не правильно смещает указатель
Код
pValue = (unsigned char*)pValue + 1;
Делаю то же самое с переменными
double - все в порядке, выводит то, что положено. В чем дело?

PS. Какой-то абсурд! На всякий случай проверил в симуляторе этот кусочек:
Код
int main()
{
// Initialise variables from EEPROM
rate = ee_rate;
nmax = ee_nmax;
pValue = *option; // &rate;
pValueEE = *optionEE; // &ee_rate;
pValue = (unsigned char*)pValue+1;
pValue, как и положено, указывает на содержимое переменной
nmax, инициализированной переменной ЕЕПРОМа
ee_nmax = 2.
Затем, если вставить следующий кусок в
main и вывести на индикатор значения массива
unsigned char* option, который содержит адреса переменных
unsigned char rate=1, nmax=2:
Код
int main()
{................
lcd_Init();
menu_Init();
pValue = *option; // &rate;
ks0108FillRect(0, 40, 20, 9, WHITE);
ks0108GotoXY(0, 40);
ks0108PutChar((char)(*((unsigned char*)pValue+0))+'0');
ks0108GotoXY(10, 40);
ks0108PutChar((char)(*((unsigned char*)pValue+1))+'0');
То выводит '1' и '0' (должно быть '1' и '2')
А если таким же образом выводить на индикатор содержимое массива
double* param, который содержит адреса переменных
double area=1.25, Kt=2.556, Y0=3.29:
Код
int main()
{................
lcd_Init();
menu_Init();
pValue = *param; // &area;
ks0108FillRect(0, 40, 40, 9, WHITE);
ks0108GotoXY(0, 40);
ks0108PutChar((char)(*((double*)pValue+0))+'0');
ks0108GotoXY(10, 40);
ks0108PutChar((char)(*((double*)pValue+1))+'0');
ks0108GotoXY(20, 40);
ks0108PutChar((char)(*((double*)pValue+2))+'0');
То выводит '1', '2' и '3'? как и положено!!!
Как такое может быть?!! Почему не выводится содержимое
unsigned char переменной через указатель со смещением (+1)? Объясните мне, пожалуйста.
PS2. Я пока вышел из положения так:
Код
void Up() // k_right
{.......................
if(pValue == *option) pValue = *(option+1);
else pValue = *option; //pValue = (unsigned char*)pValue - 1;
void Down() // k_left
{........................
if(pValue == *(option+1)) pValue = *option;
else pValue = *(option+1); //pValue = (unsigned char*)pValue + 1;
Но это, понятное дело, работает только для массива из двух переменных.