Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C]обработчик прерываний клавиатуры 
:(
    Опции темы
zhodzky
Дата 11.10.2008, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 11.10.2008

Репутация: нет
Всего: нет



Здраствуйте!

Делаю лабу на 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 

Это сообщение отредактировал(а) zhodzky - 13.10.2008, 09:41
PM MAIL   Вверх
fenwer
Дата 12.10.2008, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 11.11.2007
Где: Россия. Москва

Репутация: нет
Всего: нет



Протестил этот код, норм все при входе 1 раз печатается '@'. 
PM MAIL ICQ   Вверх
zhodzky
Дата 13.10.2008, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 11.10.2008

Репутация: нет
Всего: нет



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

Ничего не понимаю... похоже случайно выложил вообще не тот код. Щас выложил нужный код. Как мог быть норм код который был выложен в первый раз я хз, он даже не компилировался, да и вообще был от совершенно другого задания...
сори
PM MAIL   Вверх
fenwer
Дата 13.10.2008, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 11.11.2007
Где: Россия. Москва

Репутация: нет
Всего: нет



сделай проще : создай массив 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';


и в обработчике просто по нужному сканкоду определяй символ.
PM MAIL ICQ   Вверх
zhodzky
Дата 14.10.2008, 01:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 11.10.2008

Репутация: нет
Всего: нет



В задании написано: При нажатии других клавиш они обрабатываются стандартным обработчиком.
Твой способ не соответствует заданию, к томуже он не будет работать для клавиш типа Enter, Shift, Ctrl, стрелок и др.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0460 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.