User Tag List

Показано с 1 по 10 из 245

Тема: PS/2 адаптер клавиатуры для Специалиста

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #11

    Регистрация
    30.12.2018
    Адрес
    г. Москва
    Сообщений
    1,375
    Спасибо Благодарностей отдано 
    11
    Спасибо Благодарностей получено 
    384
    Поблагодарили
    346 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от fifan Посмотреть сообщение
    Переместил исходники проекта на свой сайт.
    кстати - собрал адаптер, выяснил что из 6 имеющихся клавиатур работают две. полез в исходники, нашел пару багов в части работы с железом PS/2.
    собственно вот:

    Скрытый текст

    //---------------------------------------------------------------------------
    // Низкоуровневые функции протокола PS/2

    #define ps2_setClock0() { PORTD.PS2_CLOCK = 0; prepared_ddrd |= (1 << PS2_CLOCK); DDRD.PS2_CLOCK = 1; }
    #define ps2_setClock1() { prepared_ddrd &= ~(1 << PS2_CLOCK); DDRD.PS2_CLOCK = 0; }

    // DataIn и DataOut не нужны - выходы с ОК, 0==Out, In==1
    #define ps2_setData0() { PORTD.PS2_DATA = 0; prepared_ddrd |= (1 << PS2_DATA); DDRD.PS2_DATA = 1; }
    #define ps2_setData1() { prepared_ddrd &= ~(1 << PS2_DATA); DDRD.PS2_DATA = 0; }

    //#define ps2_setData0() { PORTD.PS2_DATA = 0; }
    //#define ps2_setData1() { PORTD.PS2_DATA = 1; }

    #define ps2_waitClock0() { while(PIND.PS2_CLOCK); }
    #define ps2_waitClock1() { while(PIND.PS2_CLOCK==0); }
    #define ps2_waitClock() { ps2_waitClock1(); ps2_waitClock0(); }
    #define ps2_data() PIND.PS2_DATA
    #define ps2_wait() (PIND.PS2_DATA || PIND.PS2_CLOCK)

    и вот:

    // Отправить байт клавиатуре
    // Вход: v_a - байт

    void ps2_send() {
    // ps2_setDataOut();
    ps2_setData0();
    delay_us(20);
    ps2_setClock1();
    delay_us(10);
    v_j=0;
    ps2_waitClock0();
    for(v_i=0; v_i<8; v_i++) {
    delay_us(10);
    if(v_a&1) { ps2_setData1(); v_j++; } else ps2_setData0();
    v_a >>= 1;
    ps2_waitClock();
    #asm
    WDR
    #endasm
    }
    // Бит четности
    delay_us(10);
    if(v_j&1) { ps2_setData0(); } else { ps2_setData1(); }
    ps2_waitClock();
    // Стоповый бит
    delay_us(10);
    ps2_setData1();
    ps2_waitClock();

    // Пропуск ACK
    // ps2_setDataIn();

    // Лишний waitClock, из-за него не работали старые клавы
    // ps2_waitClock();

    if(ps2_data()) reboot(); // Ошибка клавиатуры. Перезагружаем её.
    ps2_waitClock1();
    ps2_transmitMode();
    #asm
    WDR
    #endasm
    }
    [свернуть]
    Последний раз редактировалось Serg6845; 19.08.2025 в 09:12.

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Ответов: 153
    Последнее: 16.12.2021, 19:07
  2. Адаптер Z80->ZX-BUS
    от zx-kit в разделе Несортированное железо
    Ответов: 12
    Последнее: 05.10.2011, 11:35
  3. CD адаптер
    от alexsan в разделе БК-0010/0011
    Ответов: 2
    Последнее: 12.09.2011, 21:54
  4. Изучается спрос на плату для Специалиста
    от Павел Рябцов в разделе Барахолка (архив)
    Ответов: 109
    Последнее: 30.11.2010, 10:16
  5. Продается Лик (клон Специалиста)
    от KALDYH в разделе Барахолка (архив)
    Ответов: 1
    Последнее: 20.02.2010, 14:29

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •