Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C]обработчик прерываний клавиатуры


Автор: zhodzky 11.10.2008, 18:58
Здраствуйте!

Делаю лабу на C по обработчику прерываний клавиатуры. Пишу в QuickC (старая досовская среда, преподаватель сказал писать именно в ней).

Моё задание:

При входе в программу печатается символ “#”, при нажатии клавиш 0-9 экран заполняется символом “@”. При нажатии других клавиш они обрабатываются стандартным обработчиком. Выход из программы при нажатии клавиши <ESC>.

Проблема с вызовом стандартного обработчика прерываний. При нажатии на цифры, ESC - проблем нету. Но если вызывается стандартный обработчик то почемуто начинает печататься не в программу, а в её код .

Код программы:


Код

#include <conio.h>
#include <dos.h>
#include <graph.h>
#include <stdio.h>

#define intnum 0x09 // номер прерывания обработчик которого мы переделываем
#define EOI 0x20  
#define ESC 27 //сканкод клавиши ESC

unsigned char symbol;
void interrupt far int09(void);  //обработчик
void far *oldvector;

main(){
 symbol = '#';
 oldvector = _dos_getvect( intnum );


 _dos_setvect( intnum, int09); //задаём новый обработчик

 printf("%c", symbol);

 while( symbol != ESC ){  //выход из программы по нажатию ESC

 }

 _dos_setvect( intnum, oldvector );  //возвращаем старый обработчик

 return 0;
}

void interrupt far int09(void){

 unsigned char scancode;  //сканкод
 int i;  //просто счётчик для цикла... в самом цикле его обьявить почемуто не получилось

 scancode = inp(0x60);  //читаем сканкод

 if(scancode < 0x80){   //проверка на то чтобы наше действее выполнялось только если клавиша нажимается (иначе выполняется ещё и когда отпускается)

  if (scancode==1) symbol=ESC;
  if (scancode>0x1 && scancode <0x0C){ //цифры
   symbol = '@';
   for(i =0; i<5000; i++){  //заполняем экран собакой
    printf("%c", symbol);
   }
  }
  else{    //иначе - стандартный обработчик
   _chain_intr(oldvector);
  }
 }
 outp(0x20, EOI);  //окончание прерывания
}





плз, HELP! Помогите хоть каким-нибудь советом! Уже совсем замучался... smile 

Автор: fenwer 12.10.2008, 22:02
Протестил этот код, норм все при входе 1 раз печатается '@'. 

Автор: zhodzky 13.10.2008, 09:37
Цитата(fenwer @  12.10.2008,  22:02 Найти цитируемый пост)
Протестил этот код, норм все при входе 1 раз печатается '@'. 

Ничего не понимаю... похоже случайно выложил вообще не тот код. Щас выложил нужный код. Как мог быть норм код который был выложен в первый раз я хз, он даже не компилировался, да и вообще был от совершенно другого задания...
сори

Автор: fenwer 13.10.2008, 23:28
сделай проще : создай массив c ascii кодами

например:
Код

char ascii[256];

  ascii[0x20]='d';
  ascii[0x12]='e';
  ascii[0x21]='f';
  ascii[0x22]='g';
  ascii[0x23]='h';
  ascii[0x24]='j';
  ascii[0x25]='k';
  ascii[0x17]='i';
  ascii[0x26]='l';
  ascii[0x32]='m';
  ascii[0x31]='n';


и в обработчике просто по нужному сканкоду определяй символ.

Автор: zhodzky 14.10.2008, 01:48
В задании написано: При нажатии других клавиш они обрабатываются стандартным обработчиком.
Твой способ не соответствует заданию, к томуже он не будет работать для клавиш типа Enter, Shift, Ctrl, стрелок и др.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)