помогите переделать программу

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
mrbin
Родился
Сообщения: 17
Зарегистрирован: Пт май 31, 2013 06:00:06

помогите переделать программу

Сообщение mrbin »

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



#include <io.h>
#include <delay.h>
#include <interrupt.h>

// Временные пределы
#define Tmin 40 // длинный промежуток
#define Tmax 68
#define TminK 22 // короткий промежуток
#define TmaxK 34

//------------------0-----1-----2-----3-----4
char SEGMENTE[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99,
//------------------5-----6-----7-----8-----9
0x92, 0x82, 0xF8, 0x80, 0x90};

volatile unsigned char segcounter = 0;
volatile int display1 = 0;
volatile int display2 = 0;

unsigned char sct_bit = 0; // Счетчик битов RC5
unsigned char RC5_buffer [14]; // Буфер RC5
unsigned char centre = 0; // Флаг центра
unsigned char not_korr = 0; // Флаг попадания в промежутки
unsigned char Timer = 0; // число в счетчике таймера
unsigned char command = 0; // переменная для команды

// Функция очистки буфера
void rc5_cl_buf(void)
{
unsigned char i = 0;
for (i=0; i<14; i++)
{
RC5_buffer = 0;
}
}

// функция остановки таймера
void rc5_ti_stop(void)
{
GICR = 0x00;
TCCR0 = 0x00;
TCNT0 = 0;
sct_bit = 0;
}

// Обработчик прерывния по переполнению Т0
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
rc5_ti_stop(); //останавливаем таймер
rc5_cl_buf(); //очищаем буфер
GICR |= (1 << INT0); // разрешаем прерывания по входу INT0
GIFR |= (1 << INTF0); // сбрасываем флаг прерывания
// (если произошло)
}

// Обработчик прерывния по переполнению Т1
// Динамическая индикация
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
PORTB = 0x00;
PORTD = (1 << segcounter);

switch (segcounter)
{
case 0:
PORTB = ~(SEGMENTE[display1]);
break;
case 1:
PORTB = ~(SEGMENTE[display2]);
break;
}
if ((segcounter++) > 0)
segcounter = 0;
}

// Обработчик внешнего прерывания INT0
interrupt [EXT_INT0] void ext_int0_isr(void)
{
Timer = TCNT0; // запоминаем значение счетчика
TCNT0 = 0; // обнуляем счетчик
not_korr = 1;

if(sct_bit==0)
{
TCCR0 |= (1 << CS02); // запускаем таймер (31.250 KHz)
//записываем в эл.массива
RC5_buffer [sct_bit] = !(PIND&(1 << PORTD2));
sct_bit++; // +1 к счётчику принятых битов
centre = 1;
}
else
{
// Проверка короткого промежутка
if ((Timer > TminK)&&(Timer < TmaxK))
{
if (centre)
{
centre = 0;
not_korr = 0;
}
else
{
centre = 1;
RC5_buffer [sct_bit] = !(PIND&(1 << PORTD2));
sct_bit++;
not_korr = 0;
}
}
// проверка длинного промежутка
if ((Timer > Tmin)&&(Timer < Tmax))
{
RC5_buffer [sct_bit] = !(PIND&(1 << PORTD2));
sct_bit++;
not_korr = 0;
}

if (not_korr == 1)
{ // если не попали ни в один из промежутков то
rc5_ti_stop(); // останавливаем таймер
rc5_cl_buf(); // очищаем буфер
}

if (sct_bit == 14)
{ // если бит последний то
rc5_ti_stop(); // останавливаем таймер

// Формируем код команды
command = (RC5_buffer [8] << 5)|(RC5_buffer [9] << 4)|
(RC5_buffer [10] << 3 )|(RC5_buffer [11] << 2)|
(RC5_buffer [12] << 1)|RC5_buffer [13];

// Выводим данные на дисплей
display1 = command%10; // преобразование для 1 цифры
command = command/10; // преобразование кода команды
display2 = command%10; // преобразование для 2 цифры
}
GICR |= (1 << INT0); // разрешаем прерывания по входу INT0
GIFR |= (1 << INTF0); // сбрасываем флаг прерывания по входу INT0
}
}


void main(void)
{

DDRC = 0xFF; // выход
PORTC = 0x00;
DDRB = 0xFF; // выход
PORTB = 0x00;
DDRD |= (1 << PORTD1)|(1 << PORTD0); // выход
DDRD &= ~(1 << PORTD2); // вход ИК
PORTD = 0x00;

TIMSK |= (1 << TOIE0); // разрешение прерывания по таймеру0
TIMSK |= (1 << TOIE1); // разрешение прерывания по таймеру1
TCCR1B |= (1 << CS10); // без предделителя

GICR |= (1 << INT0); // разрешаем прерывания по входу INT0
MCUCR |= (1 << ISC00); // прерывание по любому фронту
GIFR |= (1 << INTF0); // сбрасываем флаг прерывания

#asm("sei"); // глобально разрешаем прерывания
while(1){ // бесконечный цикл



}


}
Реклама
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Re: помогите переделать программу

Сообщение pokk »

Я так понял что код команды получается в переменной command ?
Ну вот и делайте с ней что хотите.

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

....
// Выводим данные на дисплей
display1 = command%10; // преобразование для 1 цифры
command = command/10; // преобразование кода команды
display2 = command%10; // преобразование для 2 цифры 
if(command==xxxxxxxx){  

if(Флаг==0){
Зажечь светодиод 
Флаг=1;
}
else{
Потушить светодиод
Флаг=0;
}

}
Реклама
mrbin
Родился
Сообщения: 17
Зарегистрирован: Пт май 31, 2013 06:00:06

Re: помогите переделать программу

Сообщение mrbin »

спасибо попробую
mrbin
Родился
Сообщения: 17
Зарегистрирован: Пт май 31, 2013 06:00:06

Re: помогите переделать программу

Сообщение mrbin »

еще вопрос команды для семисегментного индикатора удалить нужно,и команды для диода писать ниже команды для вывода данных на дисплей
Реклама
Эиком - электронные компоненты и радиодетали
mrbin
Родился
Сообщения: 17
Зарегистрирован: Пт май 31, 2013 06:00:06

Re: помогите переделать программу

Сообщение mrbin »

не понятно мне можно по подробней я в програмировании не селен,заместо флаг что прописовать?
Реклама
Ответить

Вернуться в «Разные вопросы по МК»