=0x02 ;скан-код кнопки DOWN .equ K_UP =0x04 ;скан-код кнопки UP .equ K_EN =0x08 ;скан-код кнопки ENTER ;Сканирование клавиатуры: ;temp – выходной скан-код SCAN: ldi temp,0xF7 ;инициализация переменной temp ldi Cnt,8 ;счетчик циклов сканирования sc1: cbi PORTB,CLK ;CLK=0 rol temp ;C <- temp.7..temp.0 <- C brcs sc11 sc10: cbi PORTB,DATA ;DATA=0 или rjmp sc2 sc11: sbi PORTB,DATA ;DATA=1 sc2: dec Cnt sbi PORTB,CLK ;CLK=1 sec sbis PINB,RETL ;C <- RETL clc brne sc1 ;цикл, если сканирование не завершено rol temp ;temp.0 <- C, последний бит скан-кода com temp ;инвертирование temp andi temp,0x0F ;temp = скан-код ret Несмотря на то, что на выходе получается 4-х разрядный скан-код, циклов сканирования 8. Первые 4 цикла подготавливают сдвиговый регистр, записывая в него единицы. Затем осуществляется сканирование «бегущим нулем». На выходе скан-код инвертируется, чтобы нажатие кнопки давало единицу в соответствующем разряде. Необходимо отметить, что подпрограмма сканирования не производит операцию подавления дребезга. Для подавления дребезга нужно убедится, что в течение 20 – 30 мс состояние кнопки не изменилось. Только после этого скан-код можно считать действительным. Такое время на обработку нажатий клавиатуры, когда никакие другие процессы выполняться не могут, в некоторых системах может оказаться недопустимо большим. В таких случаях процесс подавления дребезга нужно оформить как одну из задач многозадачного ядра. Естественно, привести текст такой обработки для общего случая невозможно. |