Буфер клавиатуры на WinAVR

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
geniusbsd
Встал на лапы
Сообщения: 82
Зарегистрирован: Ср авг 19, 2009 09:34:50

Буфер клавиатуры на WinAVR

Сообщение geniusbsd »

Как организовать буфер клавиатуры 4х4 на Winavr
Пробовал так

Код: Выделить всё

unsigned char buf[];
void input_code()
{

for(int i=0;i<4;i++)
{
Key=ScanKeyb();
 if(Key!=KeyOld) {KeyOld=Key;

switch(Key)
 {case 0x0B:buf[i]="0";LcdStr(FONT_1X,"0");LcdUpdate();break;
  case 0x0C:buf[i]="1";LcdStr(FONT_1X,"1");LcdUpdate();break;
  case 0x08:buf[i]="2";LcdStr(FONT_1X,"2");LcdUpdate();break;
  case 0x04:buf[i]="3";LcdStr(FONT_1X,"3");LcdUpdate();break;
  case 0x0D:buf[i]="4"; LcdStr(FONT_1X,"4");LcdUpdate();break; 
  case 0x09:buf[i]="5"; LcdStr(FONT_1X,"5");LcdUpdate();break;
  case 0x05:buf[i]="6";LcdStr(FONT_1X,"6");LcdUpdate();break; 
  case 0x0E: buf[i]="7";LcdStr(FONT_1X,"7");LcdUpdate();break;
  case 0x0A: buf[i]="8";LcdStr(FONT_1X,"8");LcdUpdate();break;
  case 0x06: buf[i]="9";LcdStr(FONT_1X,"9");LcdUpdate();break;
  case 0x0F:LcdStr(FONT_1X,buf);LcdUpdate();break;
  case 0x07:LcdClear();LcdUpdate();break;}	
}
 else Key=0XFF;i=i--;
}
Но не получается. В чем моя ошибка
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18629
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

вопрос, как обычно, задан непонятно, будем гадать.

если под "буффером" подразумевается промежуточное хранение кодов введенных клавиш, то логика должна быть совсем не такая - процессы должны быть асинхронными, т.е. заносятся коды в буфер отдельно (по таймеру или по прерываниям, например), а извлекаются - отдельно (например, в основном цикле).

если подразумевается что-то иное - то тогда огласите, что именно.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
geniusbsd
Встал на лапы
Сообщения: 82
Зарегистрирован: Ср авг 19, 2009 09:34:50

Сообщение geniusbsd »

Например такая задача . ввод четырех значного пароля.

буфер теребуетя для хранения нажатых клавиш. и дальнейшего сравнения с переменной хранящей установленный пароль.
Student_X
Родился
Сообщения: 15
Зарегистрирован: Вт июл 07, 2009 14:15:20

Сообщение Student_X »

... обычно под клавиатуру используют кольцевой буфер, т.е. определяют размер под него и хранят указатель на первый (голова) и последний (хвост) элементы. Посмотри как это было сделано в DOS на PC - прерывание биоса int 0x16 кажется....
... какая гадость, эта ваша заливная рыба!
Реклама
Эиком - электронные компоненты и радиодетали
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Сообщение BerZerK-ku »

Ну во-первых, на сколько я знаю в одиночные апострофы ('1') заключают символ, а в кавычки строку ("1"). Но если ваш компилятор не выдает ошибку, то может и все нормально.
Ну и сам алгоритм непонятен, вернее он построен так что программа и не будет работать :)
Рассмотрим ситуацию:
Пусть вы нажали на кнопку '1'. При первом проходе цикла Key='1'; Key!=KeyOld -> KeyOld='1'; switch('1') { buf[0]='1' }.
Идем дальше, уверенности в том что кнопка уже отпущена нет, поэтому возможна такая ситуация: Key='1'; Key==KeyOld -> Key=0xff; i--; И т.д. Вероятность того что после отпускания кнопки i==1 всего лишь 50%.
Реклама
geniusbsd
Встал на лапы
Сообщения: 82
Зарегистрирован: Ср авг 19, 2009 09:34:50

Сообщение geniusbsd »

А как вы предлогаете организовать
Можно пример кода
Реклама
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Сообщение BerZerK-ku »

Ну например так:

Код: Выделить всё

Key=ScanKeyb();
if (Key!=KeyOld){
	KeyOld=Key;
	if (i<4){
		switch(Key){
			case 0x0B:buf[i++]="0";LcdStr(FONT_1X,"0");LcdUpdate();break;
			case 0x0C:buf[i++]="1";LcdStr(FONT_1X,"1");LcdUpdate();break;
			case 0x08:buf[i++]="2";LcdStr(FONT_1X,"2");LcdUpdate();break;
			case 0x04:buf[i++]="3";LcdStr(FONT_1X,"3");LcdUpdate();break;
			case 0x0D:buf[i++]="4";LcdStr(FONT_1X,"4");LcdUpdate();break;
			case 0x09:buf[i++]="5";LcdStr(FONT_1X,"5");LcdUpdate();break;
			case 0x05:buf[i++]="6";LcdStr(FONT_1X,"6");LcdUpdate();break;
			case 0x0E:buf[i++]="7";LcdStr(FONT_1X,"7");LcdUpdate();break;
			case 0x0A:buf[i++]="8";LcdStr(FONT_1X,"8");LcdUpdate();break;
			case 0x06:buf[i++]="9";LcdStr(FONT_1X,"9");LcdUpdate();break;		
		}  
	}
	switch(Key){
		case 0x0F:LcdStr(FONT_1X,buf);LcdUpdate();break;
		case 0x07:LcdClear();LcdUpdate();break; 
	}	
}
geniusbsd
Встал на лапы
Сообщения: 82
Зарегистрирован: Ср авг 19, 2009 09:34:50

Сообщение geniusbsd »

Получается точно такой же результат как у меня и был изначально
buf[]="1234" после нажатия 4 клавиш в буфере вот такое значение "/234"
Student_X
Родился
Сообщения: 15
Зарегистрирован: Вт июл 07, 2009 14:15:20

Сообщение Student_X »

... во Сишники "жарят" постой опрос клавиатуры "раздули" байт на 300, да еще не работает :)

... делал когда-то девайс с динамической индикацией, ну и клавиатура там тоже была - если надо могу поискать исходник (.. правда он на 51 ассемблере)
... какая гадость, эта ваша заливная рыба!
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Сообщение BerZerK-ku »

geniusbsd писал(а):Получается точно такой же результат как у меня и был изначально
buf[]="1234" после нажатия 4 клавиш в буфере вот такое значение "/234"
Ну по приведенному выше коду положить в буфер '/' это что-то из ряда фантастики. А что будет если нажать четыре единицы: "/111" или "////"?
Да и лучше бы выложить проект целиком.
Student_X писал(а): ... во Сишники "жарят" постой опрос клавиатуры "раздули" байт на 300, да еще не работает Smile

... делал когда-то девайс с динамической индикацией, ну и клавиатура там тоже была - если надо могу поискать исходник (.. правда он на 51 ассемблере)
Динамическая индикация + опрос клавиатуры да еще и на ассемблере? Да вы просто бог программирования.
geniusbsd
Встал на лапы
Сообщения: 82
Зарегистрирован: Ср авг 19, 2009 09:34:50

Сообщение geniusbsd »

все разобрался...

Код: Выделить всё

unsigned char keyscan()
{
	unsigned char key=11;	//если кнопка не нажата возвращаем 11
	TCCR1B = 0;
	PORTA=0xE0;	_delay_us(2);
	if(bit_is_clear(PINA,0)){key='1';}
	if(bit_is_clear(PINA,1)){key='4';}
	if(bit_is_clear(PINA,2)){key='7';}
	if(bit_is_clear(PINA,3)){key=10;}        	// *
	PORTA=0xB0;	_delay_us(2);
	if(bit_is_clear(PINA,0)){key='3';}
	if(bit_is_clear(PINA,1)){key='6';}
	if(bit_is_clear(PINA,2)){key='9';}
	if(bit_is_clear(PINA,3)){key=12;}
	PORTA=0xD0;	_delay_us(2);
	if(bit_is_clear(PINA,0)){key='2';}
	if(bit_is_clear(PINA,1)){key='5';}
	if(bit_is_clear(PINA,2)){key='8';}
	if(bit_is_clear(PINA,3)){key='0';}        	// #
	PORTA=0xFF;
	return key;
}

void getkey()
{
//	unsigned char a=0,b=0;
	static unsigned char n,oldkey;
	a=keyscan();
	_delay_ms(10);
	b=keyscan();
	n++; //количество сканирований клавы
	if(a==b)
	{	
    if(a==10 || a==12)	//если * или #
    {{LcdClear();
	LcdUpdate();
    	c=0;}	//счетчик буфера=0
		for(unsigned char i=0;i<4;i++) //очищаем буфер
    	{bufer[i]=0;}
    }
    else if(c<4>10){oldkey=0;n=0;}	//кнопка перестаёт быть старой после 10 сканирований клавы
	}
}


void timers_init(void)
{
 
    TCNT0 = 0x01;
	TCCR0 = (1<<CS02) | (1<<CS00);
	TIMSK = (1<<TOIE0>3)
   {
      i=0;
      getkey();
}
}

и проблема оказалась не с буфером, а кодировкой выводимой на гафический лсд
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

BerZerK-ku писал(а):Динамическая индикация + опрос клавиатуры да еще и на ассемблере? Да вы просто бог программирования.
ухахахахаха! :))) :))) :))) а что тут сложного то?
Ставим плюсы: )
Student_X
Родился
Сообщения: 15
Зарегистрирован: Вт июл 07, 2009 14:15:20

Сообщение Student_X »

... дык наоборот проще - совмещаешь сканирование с перебором знакоместа ... а тут "нахаляву" раздают "божественный статус" :)))
... какая гадость, эта ваша заливная рыба!
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Сообщение BerZerK-ku »

Student_X писал(а):... дык наоборот проще - совмещаешь сканирование с перебором знакоместа ... а тут "нахаляву" раздают "божественный статус" :)))
Мда... какой первый пост, такой и последующий. Если человек предлагает асм исходник, на вопрос по Си коду, то он и в божественность свою поверит.
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»