Re: Светодиод и кнопка
Добавлено: 29 окт 2014, 19:27
Тут буфер уже не нужен, кстати ИОН посмотри как подключен, вход PC1Scroodge писал(а):И почему ты вот эту строчку закомментировал? //adc_bufer = ADCH; // Считываем ADC
Тут буфер уже не нужен, кстати ИОН посмотри как подключен, вход PC1Scroodge писал(а):И почему ты вот эту строчку закомментировал? //adc_bufer = ADCH; // Считываем ADC
Код: Выделить всё
while(1)
{
if((PIND&(1 << PD0)) == 0) //если включен выключатель
{if (i < 255)
{i=i+1; // Плавное включение подсветки пола салона до 100%
OCR1A=i;
_delay_ms(4);
}
}
else
if (i>0)
{i=i-1; // плавно тужнет светодиод
OCR1A=i;
_delay_ms(4);
}
}
Код: Выделить всё
if((PIND&(1 << PD0)) == 0) // если кнопка нажата
{
while((PIND&(1 << PD0)) == 0){} // ждем отпускания кнопки
_delay_ms(50);
PORTB ^= (1 << PB0); // переключаем светодиод
}
if((PIND&(1 << PD1)) == 0) // если кнопка нажата
{
while((PIND&(1 << PD1)) == 0){} // ждем отпускания кнопки
_delay_ms(50);
PORTB ^= (1 << PB1); // переключаем светодиод
}
Огромное спасибо, проверил, код работает. Добавляя этот блок 4 раза в бесконечный цикл while(1) и меняя в каждом блоке от PD0 до PD3 всё заработало идеально и независимо. Сам я тоже решил эту проблему, Но думаю, что потребление тока в моем случае гораздо выше.AntonChip писал(а):Код: Выделить всё
if((PIND&(1 << PD0)) == 0) // если кнопка нажата { while((PIND&(1 << PD0)) == 0){} // ждем отпускания кнопки _delay_ms(50); PORTB ^= (1 << PB0); // переключаем светодиод } if((PIND&(1 << PD1)) == 0) // если кнопка нажата { while((PIND&(1 << PD1)) == 0){} // ждем отпускания кнопки _delay_ms(50); PORTB ^= (1 << PB1); // переключаем светодиод }
Код: Выделить всё
/*
* Gcc_switch 1led.c
*
* Created: 10.05.2017 14:24:41
* Author : maxvest
*/
#define F_CPU 1000000
#include <avr/io.h>
#include <util/delay.h>
/* оъбявление переменных flag... для временного хранения
прикосновения-снятия пальца с контактов сенсоров т.е. 0 или 1*/
unsigned char flag0=0, flag1=0, flag2=0, flag3=0;
/* объявление переменных val... для временного хранения
количества нажатия- отжатия кнопок для исключения дребезга контакта - 30 измерений*/
unsigned char val0=0, val1=0, val2=0, val3=0;
/* блок переключения пинов PORTB*/
void swPINB0()
{
PORTB ^= (1<<0);
PORTB ^= (1<<4);
}
void swPINB1()
{
PORTB ^= (1<<1);
PORTB ^= (1<<5);
}
void swPINB2()
{
PORTB ^= (1<<2);
PORTB ^= (1<<6);
}
void swPINB3()
{
PORTB ^= (1<<3);
PORTB ^= (1<<7);
}
/* блок проверки прикосновения-снятия пальца с контактов сенсоров т.е. 0 или 1*/
void button0()
{
if (!(PIND & (1<<0))) // проверка на 0 те. нажата то условие сразу за условием (см схему в Протеусе)
{
if ( flag0 == 0) // фиксирование НЕ нажатие, если ДА то >> 1.1
{
if (val0 == 30) // проверка количества опроса (30 раз в сек)
{ flag0 = 1; //1.1
val0 = 0;
return;
}
val0++;
}
else val0 = 0;
}
else
{
if ( flag0 == 1) // фиксирование нажатия, если нет то count =0
{
if (val0==30)
{ flag0=0;
val0=0;
swPINB0();
}
val0 ++;
}
else val0=0;
}
}
void button1()
{
if (!(PIND & (1<<1))) // проверка на 0 те. нажата то условие сразу за условием (см схему в Протеусе)
{
if ( flag1 == 0) // фиксирование НЕ нажатия, если ДА то >> 1.1
{
if (val1 == 30) // проверка количества опроса (30 раз в сек)
{ flag1 = 1; //1.1
val1 = 0;
return;
}
val1 ++;
}
else val1 = 0;
}
else
{
if ( flag1 == 1) // фиксирование нажатия, если нет то count =0
{
if (val1 == 30)
{ flag1 = 0;
val1 = 0;
swPINB1();
}
val1 ++;
}
else val1=0;
}
}
void button2()
{
if (!(PIND & (1<<2))) // проверка на 0 те.- если нажата то условие сразу за условием
{
if ( flag2 == 0) // фиксирование НЕ нажатие, если ДА то >> 1.1
{
if (val2 == 30) // проверка количества опроса (30 раз в сек)
{ flag2 = 1; //1.1
val2 = 0;
return;
}
val2++;
}
else val2 = 0;
}
else
{
if ( flag2 == 1) // фиксирование нажатия, если нет то count =0
{
if (val2==30)
{ flag2=0;
val2=0;
swPINB2();
}
val2 ++;
}
else val2=0;
}
}
void button3()
{
if (!(PIND & (1<<3))) // проверка на 0 те. если нажата то условие сразу за условием
{
if ( flag3 == 0) // фиксирование НЕ нажатия, если ДА то >> 1.1
{
if (val3 == 30) // проверка количества опроса (30 раз в сек)
{ flag3 = 1; //1.1
val3 = 0;
return;
}
val3++;
}
else val3 = 0;
}
else
{
if ( flag3 == 1) // зафиксирование нажатия, если нет то count =0
{
if (val3==30)
{ flag3=0;
val3=0;
swPINB3();
}
val3 ++;
}
else val3=0;
}
}
int main(void)
{
DDRB = 0xFF; // настройка PORTB на выход
PORTB = 0xF0; // устанавливаем на этих выходах 1111 0000(управляющий младший нимбл 0, на индикаторы -старший нимбл 1)
DDRD = 0x0F; // настройка ножки PD0, PD1, PD2, PD3 на вход
PORTD |= (1<<0)|(1<<1)|(1<<2)|(1<<3); // подтягиваем к этим входах внутренние PULL_rezistor'ы
while(1)
{
button0();
button1();
button2();
button3();
}
}