кодовый замок нужна помощь

Обсуждаем контроллеры компании Atmel.
Ответить
alexval2006
Прорезались зубы
Сообщения: 225
Зарегистрирован: Сб мар 10, 2007 20:05:39
Откуда: валуйки
Контактная информация:

кодовый замок нужна помощь

Сообщение alexval2006 »

кодовый замок нужна помощь
в архиве имеются проект с исходниками и файл протеуса почему то не работает переписал с CV на WIN AWR ну и мк сменил с тини 2313 на мегу8

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

/******************************************************
Простой Кодовый замок на ATmega8
В устройстве примененён LCD дисплей 16x2
для пользовательского интерфейса.
Код написан и скомпилирован в  avr-gcc + Studio AVR.
******************************************************/
//ATmega8
#define F_CPU 1600000UL
#include <avr/io.h>        // Библиотека ввода/вывода
#include <util/delay.h>    // Библиотека для работы с задержками
#include <avr/interrupt.h>
#include <avr/eeprom.h>
#include <avr/pgmspace.h>
#include "lcd.h"
//*****************************************************************************
unsigned char  temp;      // Вспомогательный регистр
//*****************************************************************************
//Константы
#define LOAD_DDR DDRB
#define LOAD_PORT PORTB   // Порт для управления соленойдом замка PORTB.3
#define LOAD_POS PB3      // Порт для управления соленойдом замка PORTB.3

// инициализация энергонезависимой памяти для хранения кода и установка его "1111"
EEMEM unsigned char eeprom_kod[4]={'1','1','1','1'}; 

// массив символов, соответствующих кнопкам на клавиатуре
const unsigned char buttons[3][4] PROGMEM = {{'1','4','7','*'},{'2','5','8','0'},{'3','6','9','#'}};
// переменные для хранения промежуточных данных
unsigned char kod[4], nkod[4], nkod2[4];
unsigned char i,j,k,n,state;
//*****************************************************************************
//;***********************Модуль инициализации*********************************           
void setup(void);
//***********************Инициализация портов В/В******************************
 void setup(void){                 
 DDRD= 0b00000001; // Настраиваем порт D на вывод (передача на радиомодуль) D1 на ввод
 PORTD=0b11111100; // по умолчанию в ноль. Все остальные порты на ввод без резисторов.
 
 DDRB= 0b11111111; // Настраиваем порты на вывод.   
 PORTB=0b00000000; //     
        
 DDRC=0b00000111;  // PC3-PC6 ввод на матрицу клавиатуры строки
                   // PC0-PC2 ввод с матрицы клавиатуры столбцы
 PORTC=0b01111000; // Включаем подтягивающие резисторы на PB3-PB6
//*****************************************************************************
InitLCD(0);  // Инициализируем LCD
// считываем текущий код из энергонезависимой памяти
kod[0]=eeprom_kod[0];
kod[1]=eeprom_kod[1];
kod[2]=eeprom_kod[2];
kod[3]=eeprom_kod[3];

 LCDClear(); // Очищаем дисплей.
 LCDWriteString(" Kodoviy zamok "); // Приветсвие при включении устройства.
 LCDWriteStringXY(0,1," v0.1 ");    // Наименование устройства.
 _delay_ms(8000);  // пауза, чтобы можно было
 _delay_ms(8000);  // прочитать приветствие
 LCDClear();       // Очищаем дисплей.
 state=0;          // устанавливаем состояние 0 (ввод кода)

} // Конец модуля инициализации
//*******************************************************************************
void Wait(uint8_t n){
   uint8_t i,temp;
   temp=n*28;
   for(i=0;i<temp;i++)
      _delay_loop_2(0);
}
//*******************************************************************************
void LoadOn(){  // Подпрограмма включения нагрузки.
   LOAD_PORT|=(1<<LOAD_POS);
}
//*******************************************************************************
void LoadOff(){  // Подпрограмма выключения нагрузки.
   LOAD_PORT&=(~(1<<LOAD_POS));
}
//*******************************************************************************
//                          Опрос клавиатуры для замка
//*******************************************************************************
char key_press(){                   // функция опроса клавиатуры
 while(1){                          //
   while((~PINC & 0b01111000)!=0);  // ничего не делать, пока не отпустят кнопку
   for(i=0;i<3;i++){                // цикл перебора столбцов
    PORTC=0xff & ~(0x01 << i);
    for(j=3;j<7;j++){               // цикл перебора строк
     if((PINC & (0x01 << j))==0){   // проверка нажатия на кнопу
      _delay_ms(100);               // пауза для исключения дребезга контактов
      if(buttons[i][j-3]=='*'){     // дополнительная проверка для кнопки смены пароля
       for(k=0;((PINC & (0x01 << j))==0 && k<100);k++){
        _delay_ms(50);              // пауза
       }
       if((PINC & (0x01 << j))==0){ // если удерживаем кнопку смены пароля больше 5 сек
        state=1;                    // то устанавливаем состояние 1 (смена пароля)
        return 0;                   // и выходим из функции, возвращая вместо символа ноль
       }
      else return buttons[i][j-3]; // если меньше 5 сек, то возвращаем символ
      }
     
     if((PINC & (0x01 << j))==0) return buttons[i][j-3]; // возвращаем символ
     
    } // конец проверки нажатия на кнопу
    } // конец цикла перебора строк
   } // конец цикла перебора столбцов
  } // конец while(1)
} // конец char key_press()

//*******************************************************************************
char key_obrabotka(){
 while(1){   
switch (state){
    case 0:                       // режим "0" - ввод кода
     LCDClear();                  // Очищаем дисплей.
     LCDWriteStringXY(0,0,"Vvedite kod:"); // просим ввести код
     LCDWriteStringXY(0,1," ");   // переводим курсор на начало второй строки
   
     for(n=0;n<4;n++){            // опрашиваем клавиатуру и записывам символы в массив nkode[]
      k=key_press();              // Вызываю функцию опроса клавиатуры
      if(k==0)break;              // если ф-я опроса клавиатуры вернула "0", то прекращаем ввод кода
      nkod[n]=k;                  // иначе, сохраняем полученый символ в nkode[]
      LCDWriteStringXY(0,1,"*");  // выводим на дисплей "*"
     }
     if(k==0)break;               // если ф-я опроса вернула "0", то прервыаем выполнение оператора switch
                                  // в результате он будет выполнен сначала и мы перейдем к смене кода
     while(key_press()!='#');     // дожидаемся нажатия "#" в подтверждение ввода кода
   
     // проверяем, совпадает ли ввеленный код с сохраненным в памяти
     // если да - открываем замок, а если нет, то ничего не делаем
     // потом, в любом случае, переходим к вводу пароля
     if(nkod[0]==kod[0] && nkod[1]==kod[1] && nkod[2]==kod[2] && nkod[3]==kod[3]){
      LCDClear();                         // Очищаем дисплей
      LCDWriteStringXY(0,0,"Kod verniy"); // Выводим текст
      LoadOn();        // Подпрограмма включения нагрузки.
      _delay_ms(2500); // Время удержания электромагнита замка
      LoadOff();       // Подпрограмма выключения нагрузки.
      _delay_ms(2500); // пауза для прочтения текста
     }else{
      LCDClear();                             // Очищаем дисплей
      LCDWriteStringXY(0,0,"Kod ne verniy!"); // Выводим текст
      _delay_ms(5000); // пауза для прочтения текста
     }
     break;  // выходим из оператора switch
   
    case 1:  // режим "1" - изменение пароля
     LCDClear();                             // Очищаем дисплей
     LCDWriteStringXY(0,0,"Izmenenie koda"); // Выводим текст
     _delay_ms(5000); // пауза для прочтения текста
   
     LCDClear();                             // Очищаем дисплей
     LCDWriteStringXY(0,0,"Stariy kod:");    // Выводим текст
     _delay_ms(5000); // пауза для прочтения текста

     for(n=0;n<4;n++){
      k=key_press();
      if(k==0)break;
      nkod[n]=k;
      LCDWriteStringXY(0,1,"*");  // выводим на дисплей "*"
     }
     if(k==0)break;

     while(key_press()!='#');
   
     if(nkod[0]!=kod[0] || nkod[1]!=kod[1] || nkod[2]!=kod[2] || nkod[3]!=kod[3]){
     LCDClear();                             // Очищаем дисплей
     LCDWriteStringXY(0,0,"Kod ne verniy!"); // Выводим текст
     _delay_ms(5000); // пауза для прочтения текста
      state=0;
      break;
     }
     
    LCDClear();                             // Очищаем дисплей
     LCDWriteStringXY(0,0,"Noviy kod:"); // Выводим текст
     _delay_ms(5000); // пауза для прочтения текста
 
     for(n=0;n<4;n++){
      k=key_press();
      if(k==0)break;
      nkod[n]=k;
      LCDWriteStringXY(0,1,"*");  // выводим на дисплей "*"
     }
     if(k==0)break;
     while(key_press()!='#');
   
     LCDClear();                             // Очищаем дисплей
     LCDWriteStringXY(0,0,"Povtorite kod:"); // Выводим текст
     _delay_ms(5000); // пауза для прочтения текста
   
     for(n=0;n<4;n++){
      k=key_press();
      if(k==0)break;
      nkod2[n]=k;
     LCDWriteStringXY(0,1,"*");  // выводим на дисплей "*"
     }
     if(k==0)break;

     while(key_press()!='#');

     if(nkod[0]!=nkod2[0] || nkod[1]!=nkod2[1] || nkod[2]!=nkod2[2] || nkod[3]!=nkod2[3]){
      LCDClear();                             // Очищаем дисплей
      LCDWriteStringXY(0,0,"Ne sovpadayut!"); // Выводим текст
      _delay_ms(5000); // пауза для прочтения текста
      state=0;
      break;           // выходим из оператора switch
     }else{
      // сохраняем новый код в энергонезависимую память
      eeprom_kod[0]=nkod2[0];
      eeprom_kod[1]=nkod2[1];
      eeprom_kod[2]=nkod2[2];
      eeprom_kod[3]=nkod2[3];

      // обновляем текущий код в оперативной памяти
      kod[0]=nkod2[0];
      kod[1]=nkod2[1];
      kod[2]=nkod2[2];
      kod[3]=nkod2[3];

      LCDClear();                           // Очищаем дисплей
      LCDWriteStringXY(0,0,"Kod izmenen!"); // Выводим текст
      _delay_ms(5000); // пауза для прочтения текста
      state=0;
     }
     break; // выходим из оператора switch
   }
};
}// конец char key_obrabotka()
//*******************************************************************************
//                           Основной програмный цикл.
//*******************************************************************************
int main(void){
  setup();     // Вызываю функцию инициализации МК
  while(1){
  key_obrabotka();
  } // конец while(1)
return 1;
}   


zamok.zip
проект целиком
(137.04 КБ) 289 скачиваний
Кот-тоК
Открыл глаза
Сообщения: 42
Зарегистрирован: Чт окт 28, 2010 19:33:35

Re: кодовый замок нужна помощь

Сообщение Кот-тоК »

Привет! Вероятно, я ошибаюсь, но, может, вместо:

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

_delay_ms(8000)


попробовать

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

_delay_us(8000)


и так везде. :) :)
alexval2006
Прорезались зубы
Сообщения: 225
Зарегистрирован: Сб мар 10, 2007 20:05:39
Откуда: валуйки
Контактная информация:

Re: кодовый замок нужна помощь

Сообщение alexval2006 »

не помогло стало только хуже перестал выводить приветствие
vetal911
Родился
Сообщения: 2
Зарегистрирован: Пн фев 07, 2011 22:55:22

Re: кодовый замок нужна помощь

Сообщение vetal911 »

попробуй этот код

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

#include <mega8.h>               //библиотека ввода\вывода
#include <delay.h>               //библиотека задержки
#asm                             //сообщаем куда подключен датчик
   .equ __lcd_port=0x18;PORTB
#endasm
#include <lcd.h>

#define ZAMOK PORTB.3

// инициализация энергонезависимой памяти для хранения кода и установка его "0000"
eeprom unsigned char eeprom_kod[4]={'0','0','0','0'}; 

// массив символов, соответствующих кнопкам на клавиатуре
flash unsigned char buttons[3][4]={{'1','4','7','*'},{'2','5','8','0'},{'3','6','9','#'}};

// переменные для хранения промежуточных данных
unsigned char kod[4], nkod[4], nkod2[4];
unsigned char i,j,k,n,state;


char key_press()                    // функция опроса клавиатуры
{
while(1)
{
   while((~PIND & 0b01111000)!=0);  // ничего не делать, пока не отпустят кнопку
   for(i=0;i<3;i++)                 // перебор столбцов
   {
    PORTD=0xff & ~(0x01 << i);
    for(j=3;j<7;j++)                // пребор строк
    {
     if((PIND & (0x01 << j))==0)    // проверка нажатия на кнопу
     {
      delay_ms(100);                // пауза для исключения дребезга контактов
      if(buttons[i][j-3]=='*')      // дополнительная проверка для кнопки смены пароля
      {
       for(k=0;((PIND & (0x01 << j))==0 && k<100);k++)
       {
        delay_ms(50);
       }
       if((PIND & (0x01 << j))==0)  // если удерживаем кнопку смены пароля больше 5 сек
       {
        state=1;                    // то устанавливаем состояние 1 (смена пароля)
        return 0;                   // и выходим из функции, возвращая вместо символа ноль
       }
       else return buttons[i][j-3]; // если меньше 5 сек, то возвращаем символ
      }
      if((PIND & (0x01 << j))==0) return buttons[i][j-3]; // возвращаем символ
     }
    }
   }
}
}

                   
   
void main(void)
{
// Declare your local variables here
// Crystal Oscillator division factor: 1
#pragma optsize-
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Input/Output Ports initialization
// Port A initialization
// Func2=In Func1=In Func0=In
// State2=T State1=T State0=T

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=Out Func1=Out Func0=Out
// State7=T State6=T State5=T State4=T State3=T State2=0 State1=0 State0=0
PORTB=0x00;
DDRB=0xff;

// Port D initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x78;
DDRD=0x07;   

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh


// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x05;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x1E;
OCR1AL=0x85;
OCR1BH=0x00;
OCR1BL=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// Interrupt on any change on pins PCINT0-7: Off

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x80;

// Universal Serial Interface initialization
// Mode: Disabled
// Clock source: Register & Counter=no clk.
// USI Counter Overflow Interrupt: Off


// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;

// LCD module initialization
lcd_init(16);
if(eeprom_kod[0]==0xff)
{
eeprom_kod[0]='0';
eeprom_kod[1]='0';
eeprom_kod[2]='0';
eeprom_kod[3]='0';
}


// считываем текущий код из энергонезависимой памяти
kod[0]=eeprom_kod[0];
kod[1]=eeprom_kod[1];
kod[2]=eeprom_kod[2];
kod[3]=eeprom_kod[3];

lcd_clear(); // очищаем дисплей

// выводим приветствие
lcd_gotoxy(2,0);
lcd_putsf("Kodoviy zamok");

// пауза, чтобы можно было прочитать приветствие
delay_ms(4000);

lcd_clear(); // очищаем дисплей

state=0;     // устанавливаем состояние 0 (ввод кода)

while (1)
{
 
   switch (state)
   {
    case 0:                       // режим "0" - ввод кода
     lcd_clear();
     lcd_putsf("Vvedite kod:");   // просим ввести код
     lcd_gotoxy(0,1);             // переводим курсор на начало второй строки
   
     for(n=0;n<4;n++)             // опрашиваем клавиатуру и записывам символы
     {                            // в массив nkode[]
      k=key_press();
      if(k==0)break;              // если ф-я опроса клавиатуры вернула "0", то прекращаем ввод кода
      nkod[n]=k;                  // иначе, сохраняем полученый символ в nkode[]
      lcd_putchar('*');           // и выводим на дисплей "*"
     }
     if(k==0)break;               // если ф-я опроса вернула "0", то прервыаем выполнение оператора switch
                                  // в результате он будет выполнен сначала и мы перейдем к смене кода
   
     while(key_press()!='#');     // дожидаемся нажатия "#" в подтверждение ввода кода
   
     // проверяем, совпадает ли ввеленный код с сохраненным в памяти
     // если да - открываем замок, а если нет, то ничего не делаем
     // потом, в любом случае, переходим к вводу пароля
     if(nkod[0]==kod[0] && nkod[1]==kod[1] && nkod[2]==kod[2] && nkod[3]==kod[3])
     {
      lcd_clear();
      lcd_putsf("Kod verniy");
      ZAMOK=1;
      delay_ms(3000);
      ZAMOK=0;
      delay_ms(3000);
     }
     else
     {
      lcd_clear();
      lcd_putsf("Kod ne verniy!");
      delay_ms(3000);
     }
   
     break;                        // выходим из оператора switch
   
    case 1:                        // режим "1" - изменение пароля
     lcd_clear();
     lcd_putsf("Izmenenie koda");
     lcd_gotoxy(0,1);
     delay_ms(3000);

     lcd_clear();
     lcd_putsf("Stariy kod:");
     lcd_gotoxy(0,1);
   
     delay_ms(50);
   
     for(n=0;n<4;n++)
     {
      k=key_press();
      if(k==0)break;
      nkod[n]=k;
      lcd_putchar('*');
     }
     if(k==0)break;

     while(key_press()!='#');
   
     if(nkod[0]!=kod[0] || nkod[1]!=kod[1] || nkod[2]!=kod[2] || nkod[3]!=kod[3])
     {
      lcd_clear();
      lcd_putsf("Kod ne verniy!");
      delay_ms(3000);
      state=0;
      break;
     }

     lcd_clear();
     lcd_putsf("Noviy kod:");
     lcd_gotoxy(0,1);
   
     for(n=0;n<4;n++)
     {
      k=key_press();
      if(k==0)break;
      nkod[n]=k;
      lcd_putchar('*');
     }
     if(k==0)break;

     while(key_press()!='#');
   
     lcd_clear();
     lcd_putsf("Povtorite kod:");
     lcd_gotoxy(0,1);
   
     for(n=0;n<4;n++)
     {
      k=key_press();
      if(k==0)break;
      nkod2[n]=k;
      lcd_putchar('*');
     }
     if(k==0)break;

     while(key_press()!='#');

     if(nkod[0]!=nkod2[0] || nkod[1]!=nkod2[1] || nkod[2]!=nkod2[2] || nkod[3]!=nkod2[3])
     {
      lcd_clear();
      lcd_putsf("Ne sovpadayut!");
      delay_ms(3000);
      state=0;
      break;                        // выходим из оператора switch
     }
     else
     {
      // сохраняем новый код в энергонезависимую память
      eeprom_kod[0]=nkod2[0];
      eeprom_kod[1]=nkod2[1];
      eeprom_kod[2]=nkod2[2];
      eeprom_kod[3]=nkod2[3];

      // обновляем текущий код в оперативной памяти
      kod[0]=nkod2[0];
      kod[1]=nkod2[1];
      kod[2]=nkod2[2];
      kod[3]=nkod2[3];

      lcd_clear();
      lcd_putsf("Kod izmenen!");
      delay_ms(5000);
      state=0;
     }
     break;                        // выходим из оператора switch
   }
}
}
alexval2006
Прорезались зубы
Сообщения: 225
Зарегистрирован: Сб мар 10, 2007 20:05:39
Откуда: валуйки
Контактная информация:

Re: кодовый замок нужна помощь

Сообщение alexval2006 »

уважаемый этот код и у меня есть, я же его пытаюсь переписать под avr-gcc + Studio AVR.
vetal911
Родился
Сообщения: 2
Зарегистрирован: Пн фев 07, 2011 22:55:22

Re: кодовый замок нужна помощь

Сообщение vetal911 »

тогда извиняюсь, думал что трудности с переделкой под атмега8
alexval2006
Прорезались зубы
Сообщения: 225
Зарегистрирован: Сб мар 10, 2007 20:05:39
Откуда: валуйки
Контактная информация:

Re: кодовый замок нужна помощь

Сообщение alexval2006 »

не атмегу 8 я знаю нормально трудности с переходом с одного компилятора на другой
Аватара пользователя
shurikss123
Грызет канифоль
Сообщения: 271
Зарегистрирован: Пн окт 25, 2010 20:47:04
Откуда: Казахстан, Астана

Re: кодовый замок нужна помощь

Сообщение shurikss123 »

А где проблема? что не работает
Изображение
Мастер на все руки, кручу, кручу, кручу и матерюсь
Повелитель паяльной станции, лома, и пинцета!!!
alexval2006
Прорезались зубы
Сообщения: 225
Зарегистрирован: Сб мар 10, 2007 20:05:39
Откуда: валуйки
Контактная информация:

Re: кодовый замок нужна помощь

Сообщение alexval2006 »

не работает в среде avr-gcc + Studio AVR.
Аватара пользователя
shurikss123
Грызет канифоль
Сообщения: 271
Зарегистрирован: Пн окт 25, 2010 20:47:04
Откуда: Казахстан, Астана

Re: кодовый замок нужна помощь

Сообщение shurikss123 »

Так Первое!
чтение еером (пример)

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

    
if (eeprom_is_ready())
    {
        error_eep=eeprom_read_byte(0x00);
        if (error_eep==1)
        {
            //Vol=eeprom_read_byte(0x01);
            Bass=eeprom_read_byte(0x02);
            Treb=eeprom_read_byte(0x03);
            LF=eeprom_read_byte(0x04);
            RF=eeprom_read_byte(0x05);
            LR=eeprom_read_byte(0x06);
            RR=eeprom_read_byte(0x07);
            AS_db=eeprom_read_byte(0x08);
            AS_s=eeprom_read_byte(0x09);
            ra=eeprom_read_word(0x0a);
        }

запись (пример)

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

if (eeprom_is_ready())
         {
            eeprom_write_byte(0x00,0x01);
            eeprom_write_byte(0x01,Vol);
            eeprom_write_byte(0x02,Bass);
            eeprom_write_byte(0x03,Treb);
            eeprom_write_byte(0x04,LF);
            eeprom_write_byte(0x05,RF);
            eeprom_write_byte(0x06,LR);
            eeprom_write_byte(0x07,RR);
            eeprom_write_byte(0x08,AS_db);
            eeprom_write_byte(0x09,AS_s);
            eeprom_write_word(0x0a,ra);
         }


второе в протеусе есть замечательная вешь которая дает возможность видеть данные еером
блин как это ты так? куда смотрел? переделал?
Изображение
Мастер на все руки, кручу, кручу, кручу и матерюсь
Повелитель паяльной станции, лома, и пинцета!!!
alexval2006
Прорезались зубы
Сообщения: 225
Зарегистрирован: Сб мар 10, 2007 20:05:39
Откуда: валуйки
Контактная информация:

Re: кодовый замок нужна помощь

Сообщение alexval2006 »

ну запись данных в еепром можно и авр студио прекрасно посмотреть код нужно дорабатывать согласен сейчас мало времени на работе завал у меня были некоторые проблемные места в переводе кода но я думаю смогу их обойти

shurikss123 писал(а):второе в протеусе есть замечательная вешь которая дает возможность видеть данные еером
блин как это ты так? куда смотрел? переделал?
и не надо столько эмоций все будет хорошо :))
Аватара пользователя
perehiniak
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Пн ноя 07, 2011 21:08:10

Re: кодовый замок нужна помощь

Сообщение perehiniak »

vetal911 писал(а):попробуй этот код
а под mega32 можете педелать? чтоб клавиатура на порте D висела? Зарание спасибо
Ответить

Вернуться в «AVR»