Каждая кнопка может иметь 4 значения.
В прерывании функция get_bt передает номер последней нажатой кнопки с времени последнего вызова функции.
Номер кнопки должен быть кратен 4-ем... таким образом в младших двух битах будет указываться вариантная часть кнопки.
НАПРИМЕР:
кнопка имеет номер 0x04
возможные варианты результата: 0x04,0x05,0x06,0x07.
При наборе текста возможны два варианта:
1 - новый символ
2 - заменить последний введенный на новый "вместо предыдущего" (причем новый здесь - это всегда вариантная часть кнопки)
Второй вариант еще можно показать как два символа: BS и символ ..."предыдущий стереть и новый на его место".
В нашем примере флагом "BS" служит условие, что младшие два бита в результате не равны нулям... если они не равны, значит это вариантная часть, значит нужно прошлый символ убрать и новый поставить.
Код:
|
#define TIME 0x80 //Время TimeOut
unsigned char pr_k, //предыдущая нажатая кнопка
count, //к-во нажатий на кнопку
time; //время между нажатиями
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
unsigned char k,r;
TCNT0=0xFC;
k = get_bt(); //Получаю номер кнопки нажатой с двумя битами младшими "00"
if (time ‹ TIME) //Дабы избежать переполнения
time++;
if(time ‹ TIME) //Светодиод показывает исход времени
PORTD |= 1;
else
PORTD &= ~1;
if (k == 0) //ничего не нажато - выходим
return;
if ((k == pr_k) &&(time ‹ TIME)) //нажали старую и время не вышло
count++; //Номер варианта кнопки +1
else //новая или время вышло
count = 0;
time =0;
pr_k = k; //Запоминаем старуя кнопку
r = r|(k & ~0x03)|(count & 0x03); //собираем результат
if (r)
putchar(r);
} |
Полный пример с демо в Proteus
www.AndryG.ho.com.ua/bt_4.txt -›RAR-архив