Перейти к содержанию

Помогите Найти Ошибку, Мудрые Люди!


Рекомендуемые сообщения

Подключил клавиатуру 4*4. Написал код для нее:

/*****************************************************
This program was produced by the
CodeWizardAVR V2.04.0a Evaluation
Automatic Program Generator
© Copyright 1998-2009 Pavel Haiduc, HP InfoTech s.r.l.
[url="http://www.hpinfotech.com"]http://www.hpinfotech.com[/url]

Project :
Version :
Date : 21.03.2009
Author : Freeware, for evaluation and non-commercial use only
Company :
Comments:


Chip type : ATmega8
Program type : Application
AVR Core Clock frequency: 8,000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
*****************************************************/

#include <mega8.h>
#include <delay.h>
#include <stdio.h>

// Declare your global variables here

unsigned int n=20;

void klava(void)
{


PORTB.4=1;// ?????? ?? 1 ??????
PORTB.5=1;
PORTC.0=1;
PORTC.1=0;
delay_ms(40);
if (!PINC.5)
{
	delay_ms(40);
	n=1;
}
else
{
	if (!PINC.4)
	{
		delay_ms(40);
		n=2;
	}
	else
	{
		if (!PINC.3)
		{
			delay_ms(40);
			n=3;
		}
		else
		{
			if (!PINC.2)
			{
				{
					delay_ms(40);
					n=12;
				}
			}
		}
	}
}

PORTB.4=0;// ?????? ?? 4 ??????
PORTB.5=1;
PORTC.0=1;
PORTC.1=1;
delay_ms(30);
if (!PINC.5)
{
	delay_ms(30);
	n=10;
}
else
{
	if (!PINC.4)
	{
		delay_ms(30);
		n=0;
	}
	else
	{
		if (!PINC.3)
		{
			delay_ms(30);
			n=11;
		}
		else
		{
			if (!PINC.2)
			{
				delay_ms(30);
				n=15;

			}
		}
	}
}

PORTB.4=1;// ?????? ?? 3 ??????
PORTB.5=0;
PORTC.0=1;
PORTC.1=1;
delay_ms(30);
if (!PINC.5)
{
	delay_ms(30);
	n=7;
}
else
{
	if (!PINC.4)
	{
		delay_ms(30);
		n=8;
	}
	else
	{
		if (!PINC.3)
		{
			delay_ms(30);
			n=9;
		}
		else
		{
			if (!PINC.2)
			{
				delay_ms(30);
				n=14;

			}
		}
	}
}

PORTB.4=1;// ?????? ?? 2 ??????
PORTB.5=1;
PORTC.0=0;
PORTC.1=1;
delay_ms(20);
if (!PINC.5)
{
	delay_ms(20);
	n=4;
}
else
{
	if (!PINC.4)
	{
		delay_ms(20);
		n=5;
	}
	else
	{
		if (!PINC.3)
		{
			delay_ms(20);
			n=6;
		}
		else
		{
			if (!PINC.2)
			{
				delay_ms(20);
				n=13;

			}
		}
	}
}
n=20;
}

void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=Out Func4=Out Func3=In Func2=In Func1=Out Func0=In
// State7=T State6=T State5=0 State4=0 State3=T State2=T State1=0 State0=T
PORTB=0x00;
DDRB=0x32;

// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=Out Func0=Out
// State6=T State5=P State4=P State3=P State2=P State1=0 State0=0
PORTC=0x3C;
DDRC=0x03;

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

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;

// 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=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

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

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


while (1)
{
	klava();
	if (n==12)
	{
                       n = -1;
		PORTB.1=1;
		delay_ms(20);
		PORTB.1=0;
		delay_ms(20);
	}
               n = -1;
}
}

Когда ставлю любое n кроме n=12, при нажатии светодиод нормально загорается (он подключен к DB1).Но когда ставлю n=12 светодиод моргает сам без нажатия на кнопку. В Чем ошибка??? Подскажите ПОЖАЛУЙСТА!!!!

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Конешно не очень напсано... Нужно было использовать цикл и програма была бы короче в 4 раза... После проверки в МАИН сбросте n на -1. Я исправил в вашем коде.. попробуйте его взять отсюда снова..

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Hongfa для различных применений в Компэл. Большой выбор в наличии!

Компания HONGFA - это не только крупнейший в мире производитель электромеханических реле, но также производитель конденсаторов, вакуумных прерывателей, трансформаторов и низковольтного коммутационного оборудования. На складе КОМПЭЛ регулярно поддерживаются около 100 самых популярных позиций электромеханических реле. Реле Hongfa могут заместить многие изделия производства недоступных брендов. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Переменная n у вас типа unsigned а вы присваиваете ей отрицательное значение

Изменено пользователем bekor

1 километр = 1024 метр

Ссылка на комментарий
Поделиться на другие сайты

Тренды и лучшие решения для разработки зарядных станций в России

К 2029 году в России прогнозируется увеличение числа зарядных станций до 40 000. При этом отечественный рынок электротранспорта имеет климатические, потребительские и географические особенности. Для успешной разработки и построения инфраструктуры станций заряда в России идеальным вариантом является использование решений и электронных компонентов китайских производителей – лидеров индустрии электротранспорта и возобновляемой энергетики, которые уже представлены в КОМПЭЛ. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Секреты депассивации литиевых батареек FANSO EVE Energy

Самыми лучшими параметрами по энергоемкости, сроку хранения, температурному диапазону и номинальному напряжению обладают батарейки литий-тионилхлоридной электрохимической системы. Но при длительном хранении происходит процесс пассивации. Разберем в чем плюсы и минусы, как можно ее избежать или уменьшить последствия и как проводить депассивацию батареек на примере продукции и рекомендаций компании FANSO EVE Energy. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Проблема в следующем - проверяются кнопки и при нажатии одной из них наставляете переменную n на номер кнопки. Потом всё проходит нормально аж на то что даже если кнопка не нажата - n УЖЕ РАВНО 12 из прошлого цикла!!! И сразу срабатывает мигание... Я немного сглупил - надо переменную n устанавливать в нейтральное положение (например 0 или -1) при начале проверки клавеш а в главном цикле при нейтральном положении ничего не делать.. Дерзайте :)

Ссылка на комментарий
Поделиться на другие сайты

Пробовал...Что то не получается......

klava();
      if (n==20)
      {
       PORTB.1=0;
      }
      if (n==12)
      {
      PORTB.1=1;
      delay_ms(100);
      PORTB.1=0;
      }

На выходе тоже самое. На нажатие иногда не реагирует. Самопроизвольно иногда загорается!

И если не сложно подскажите ПОЖАЛУЙСТА как сделать так: набираем на клавиатуре пароль - чтобы нажал на одну кнопку и потом он ждет нажатие следующей, а если более 3 секунд нажатия второй клавиши не произошло начиналось все сначало!!!! ПОМОГИТЕ ПОЖАЛУЙСТА ОЧЕНЬ НУЖНО!!!!!!!

Я вот так пробовал но не получается....ПОДСКАЖИТЕ ПОЖАЛУЙСТА!!!!

/*****************************************************
This program was produced by the
CodeWizardAVR V2.04.0a Evaluation
Automatic Program Generator
© Copyright 1998-2009 Pavel Haiduc, HP InfoTech s.r.l.
[url="http://www.hpinfotech.com"]http://www.hpinfotech.com[/url]

Project :
Version :
Date : 21.03.2009
Author : Freeware, for evaluation and non-commercial use only
Company :
Comments:


Chip type : ATmega8
Program type : Application
AVR Core Clock frequency: 8,000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
*****************************************************/

#include <mega8.h>
#include <delay.h>
#include <stdio.h>
#include <math.h>

// Declare your global variables here

unsigned int n;
int i;
int pwd [2];
int vpwd[2];

void klava(void)
{

   n=20;
   PORTB.4=1;// на  1 строку
   PORTB.5=1;
   PORTC.0=1;
   PORTC.1=0;
   delay_ms(30);
   if (!PINC.5)
   {
       delay_ms(30);
       n=1;
   }
   else
   {
       if (!PINC.4)
       {
           delay_ms(30);
           n=2;
       }
       else
       {
           if (!PINC.3)
           {
               delay_ms(30);
               n=3;
           }
           else
           {
               if (!PINC.2)
               {
                   {
                       delay_ms(30);
                       n=12;

                   }
               }
           }
       }
   }

   PORTB.4=0;// на 4 строку
   PORTB.5=1;
   PORTC.0=1;
   PORTC.1=1;
   delay_ms(30);
   if (!PINC.5)
   {
       delay_ms(30);
       n=10;
   }
   else
   {
       if (!PINC.4)
       {
           delay_ms(30);
           n=0;
       }
       else
       {
           if (!PINC.3)
           {
               delay_ms(30);
               n=11;
           }
           else
           {
               if (!PINC.2)
               {
                   delay_ms(30);
                   n=15;

               }
           }
       }
   }

   PORTB.4=1;// на 3 строку
   PORTB.5=0;
   PORTC.0=1;
   PORTC.1=1;
   delay_ms(30);
   if (!PINC.5)
   {
       delay_ms(30);
       n=7;
   }
   else
   {
       if (!PINC.4)
       {
           delay_ms(30);
           n=8;
       }
       else
       {
           if (!PINC.3)
           {
               delay_ms(30);
               n=9;
           }
           else
           {
               if (!PINC.2)
               {
                   delay_ms(30);
                   n=14;

               }
           }
       }
   }

   PORTB.4=1;// на 2 строку
   PORTB.5=1;
   PORTC.0=0;
   PORTC.1=1;
   delay_ms(20);
   if (!PINC.5)
   {
       delay_ms(20);
       n=4;
   }
   else
   {
       if (!PINC.4)
       {
           delay_ms(20);
           n=5;
       }
       else
       {
           if (!PINC.3)
           {
               delay_ms(20);
               n=6;
           }
           else
           {
               if (!PINC.2)
               {
                   delay_ms(20);
                   n=13;

               }
           }
       }
   }

}

void main(void)
{
   // Declare your local variables here



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

   // Port C initialization
   // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=Out Func0=Out
   // State6=T State5=P State4=P State3=P State2=P State1=0 State0=0
   PORTC=0x3C;
   DDRC=0x03;

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

   // Timer/Counter 0 initialization
   // Clock source: System Clock
   // Clock value: Timer 0 Stopped
   TCCR0=0x00;
   TCNT0=0x00;

   // 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=0x00;
   TCNT1H=0x00;
   TCNT1L=0x00;
   ICR1H=0x00;
   ICR1L=0x00;
   OCR1AH=0x00;
   OCR1AL=0x00;
   OCR1BH=0x00;
   OCR1BL=0x00;

   // Timer/Counter 2 initialization
   // Clock source: System Clock
   // Clock value: Timer 2 Stopped
   // Mode: Normal top=FFh
   // OC2 output: Disconnected
   ASSR=0x00;
   TCCR2=0x00;
   TCNT2=0x00;
   OCR2=0x00;

   // External Interrupt(s) initialization
   // INT0: Off
   // INT1: Off
   MCUCR=0x00;

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

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


   vpwd[0]=1;
   vpwd[1]=2;


   while (1)
   {   
    b: klava();
    if (n==20)
    {
    goto b;
    }
    else
    {
    pwd[0]=n;
    }
    a: klava();
    if (n==20)
    {
    goto a;
    }      
    else
    {
    pwd[1]=n;
    }
    if (pwd[0]==vpwd[0] & pwd[1]==vpwd[1])
    {
    PORTB.1=1;
    delay_ms(100);
    PORTB.1=0;
    }

   }
}         

Изменено пользователем ovictor
Ссылка на комментарий
Поделиться на другие сайты

Программа слушком усложнена для матричной клавиатуры,

чтоб небыло когда клавиатура нереагировала, надо убрать эти задержки в каждом блоке

    PORTB.4=1;// на 3 строку
   PORTB.5=0;
   PORTC.0=1;
   PORTC.1=1;
   [b]delay_ms(30);[/b] //вырезать

поставить одну в главном цикле, например delay_us(100); ...

Электроника это целый океан творчества...

Ссылка на комментарий
Поделиться на другие сайты

Тогда возможно проблема в вашем реальном железе например клавиатура испорчена

поскольку я симулировал вашу программу в протеусе и она работала

только убрал n=20; в конце подпрограммы klava()

1 километр = 1024 метр

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...