unsigned char buf[];
void input_code()
{
for(int i=0;i<4;i++)
{
Key=ScanKeyb();
if(Key!=KeyOld) {KeyOld=Key;
switch(Key)
{case 0x0B:buf[i]="0";LcdStr(FONT_1X,"0");LcdUpdate();break;
case 0x0C:buf[i]="1";LcdStr(FONT_1X,"1");LcdUpdate();break;
case 0x08:buf[i]="2";LcdStr(FONT_1X,"2");LcdUpdate();break;
case 0x04:buf[i]="3";LcdStr(FONT_1X,"3");LcdUpdate();break;
case 0x0D:buf[i]="4"; LcdStr(FONT_1X,"4");LcdUpdate();break;
case 0x09:buf[i]="5"; LcdStr(FONT_1X,"5");LcdUpdate();break;
case 0x05:buf[i]="6";LcdStr(FONT_1X,"6");LcdUpdate();break;
case 0x0E: buf[i]="7";LcdStr(FONT_1X,"7");LcdUpdate();break;
case 0x0A: buf[i]="8";LcdStr(FONT_1X,"8");LcdUpdate();break;
case 0x06: buf[i]="9";LcdStr(FONT_1X,"9");LcdUpdate();break;
case 0x0F:LcdStr(FONT_1X,buf);LcdUpdate();break;
case 0x07:LcdClear();LcdUpdate();break;}
}
else Key=0XFF;i=i--;
}
вопрос, как обычно, задан непонятно, будем гадать.
если под "буффером" подразумевается промежуточное хранение кодов введенных клавиш, то логика должна быть совсем не такая - процессы должны быть асинхронными, т.е. заносятся коды в буфер отдельно (по таймеру или по прерываниям, например), а извлекаются - отдельно (например, в основном цикле).
если подразумевается что-то иное - то тогда огласите, что именно.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
... обычно под клавиатуру используют кольцевой буфер, т.е. определяют размер под него и хранят указатель на первый (голова) и последний (хвост) элементы. Посмотри как это было сделано в DOS на PC - прерывание биоса int 0x16 кажется....
Ну во-первых, на сколько я знаю в одиночные апострофы ('1') заключают символ, а в кавычки строку ("1"). Но если ваш компилятор не выдает ошибку, то может и все нормально.
Ну и сам алгоритм непонятен, вернее он построен так что программа и не будет работать
Рассмотрим ситуацию:
Пусть вы нажали на кнопку '1'. При первом проходе цикла Key='1'; Key!=KeyOld -> KeyOld='1'; switch('1') { buf[0]='1' }.
Идем дальше, уверенности в том что кнопка уже отпущена нет, поэтому возможна такая ситуация: Key='1'; Key==KeyOld -> Key=0xff; i--; И т.д. Вероятность того что после отпускания кнопки i==1 всего лишь 50%.
Key=ScanKeyb();
if (Key!=KeyOld){
KeyOld=Key;
if (i<4){
switch(Key){
case 0x0B:buf[i++]="0";LcdStr(FONT_1X,"0");LcdUpdate();break;
case 0x0C:buf[i++]="1";LcdStr(FONT_1X,"1");LcdUpdate();break;
case 0x08:buf[i++]="2";LcdStr(FONT_1X,"2");LcdUpdate();break;
case 0x04:buf[i++]="3";LcdStr(FONT_1X,"3");LcdUpdate();break;
case 0x0D:buf[i++]="4";LcdStr(FONT_1X,"4");LcdUpdate();break;
case 0x09:buf[i++]="5";LcdStr(FONT_1X,"5");LcdUpdate();break;
case 0x05:buf[i++]="6";LcdStr(FONT_1X,"6");LcdUpdate();break;
case 0x0E:buf[i++]="7";LcdStr(FONT_1X,"7");LcdUpdate();break;
case 0x0A:buf[i++]="8";LcdStr(FONT_1X,"8");LcdUpdate();break;
case 0x06:buf[i++]="9";LcdStr(FONT_1X,"9");LcdUpdate();break;
}
}
switch(Key){
case 0x0F:LcdStr(FONT_1X,buf);LcdUpdate();break;
case 0x07:LcdClear();LcdUpdate();break;
}
}
geniusbsd писал(а):Получается точно такой же результат как у меня и был изначально
buf[]="1234" после нажатия 4 клавиш в буфере вот такое значение "/234"
Ну по приведенному выше коду положить в буфер '/' это что-то из ряда фантастики. А что будет если нажать четыре единицы: "/111" или "////"?
Да и лучше бы выложить проект целиком.
Student_X писал(а):
... во Сишники "жарят" постой опрос клавиатуры "раздули" байт на 300, да еще не работает Smile
... делал когда-то девайс с динамической индикацией, ну и клавиатура там тоже была - если надо могу поискать исходник (.. правда он на 51 ассемблере)
Динамическая индикация + опрос клавиатуры да еще и на ассемблере? Да вы просто бог программирования.