Показать сообщение отдельно
Непрочитано 28.06.2006, 15:58   #3
Sanya
Мужской Опытный
 
Аватар для Sanya
 
Регистрация: 22.03.2003
Адрес: Апатиты
солнышко
Код:
//*********************************************************************
// мигание индикаторов
// команда 0xED выдается не контроллеру, а самой клавиатуре,
// поэтому пишем ее в порт 0х60
// Состояние индикаторов определяется следующим байтом,
//   0-й бит == состояние Scroll Lock
//   1-й бит == Caps Lock
//   2-й бит == Num Lock
// Бит ==1 -> зажечь светодиод, Бит == 0 -> погасить светодиод
// Для комбинирования светодиодов юзаются битовые маски
// (если записать "3", то включатся Scroll и Caps, а Num погаснет)
//    0 == 000 (все погашены)
//    1 == 001 (Scroll)
//    2 == 010 (Caps)
//    3 == 011 (Scroll + Caps)
//    4 == 100 (Num)
//    5 == 101 (Num + Scroll)
//    6 == 110 (Num + Caps)
//    7 == 111 (все включены)
// Старшие биты (начиная с 3-го) игнорируются.
// Если определить 1 == SCROLL_LOCK, 2 == CAPS_LOCK, 4 == NUM_LOCK,
// то значения получаются установкой битов:
//    зажечь Num и Scroll:   NUM_LOCK | SCROLL_LOCK (5 == 4 + 1)
// сложение чисел заменяется установкой битов побитовым "или"

    static short int i=1;  // вообще-то должно быть char...
    asm{
        mov al, 0xED
        out 0x60, al
        mov ax, i   // i занимает 2 байта, поэтому ax
        out 0x60, al  // ah нас не интересует
        nop
        nop
        nop
    }
    if(i==1) i=2;
    else if(i==2) i=4;
    else i=1;
//*********************************************************************
тут, правда, вперемешку с Сишным кодом, но в целом проблем не возникнет
по таймеру (или как больше нравится) вызываешь этот код -- и будет тебе счастье.
Переменная i -- статическая, в АСМ сделай ее глобальной.
__________________
Лечить и судить умеют и могут все, а вот рассчитать несущую балку?
Sanya вне форума  
Конфигурация ПК
Ответить с цитированием