Код: Выделить всё
#include "motor.c"
#define MEM_SIZE 40
#define TMR_DX 50
// Данные с ИК пульта ДУ
unsigned char ir_data=0;
// Данные о пройденном пути
unsigned int mem[MEM_SIZE];
unsigned char mem_cmd[MEM_SIZE];
// Размер массива данных пройденного пути
unsigned char mem_size=0;
// Декодирование данных с пульта
void decode()
{
if(ir_data=='a' || ir_data=='A') ir_data=1;
else if(ir_data=='b' || ir_data=='B') ir_data=2;
else if(ir_data=='c' || ir_data=='C') ir_data=3;
else if(ir_data=='d' || ir_data=='D') ir_data=4;
else ir_data=0;
}
// Приём данных с пульта
void interrupt()
{
char i;
// Проверка флага прерывания
if(INTCON.INTF)
{
Delay_us(416);
for(i=0;i<8;i++)
{
Delay_us(833);
// Сдвиг данных на 1 бит вправо
ir_data = ir_data>>1;
// Если на входе RB0 1, то в конец ir_cmd добавить 1
if((PORTB & 0x01)==1) ir_data = ir_data | 0x80;
}
Delay_us(833);
decode(); // Декодировать даннные
// Сбросить флаг прерывания
INTCON.INTF = 0;
}
}
// Очистка памяти
void mem_clear()
{
unsigned int i;
for(i=0;i<MEM_SIZE;i++)
{
mem[i]=0;
mem_cmd[i]=0;
}
}
void _go()
{
unsigned int i,j;
unsigned char cmd;
unsigned int tmr;
for(i=0;i<=mem_size;i++)
{
cmd = mem_cmd[i];
tmr = mem[i];
if(cmd==1)
{
m_left_bwd();
m_right_bwd();
}
else if(cmd==2)
{
m_left_bwd();
m_right_fwd();
}
else if(cmd==3)
{
m_left_fwd();
m_right_bwd();
}
else if(cmd==4)
{
m_left_fwd();
m_right_fwd();
}
for(j=0;j<tmr;j++) Delay_ms(TMR_DX+10);
}
m_left_stop();
m_right_stop();
}
void main()
{
unsigned char key;
// RB0 в цифровой вход
ANSELH.F4 = 0;
TRISA.F4=1;
// Прерывание происходит по спаду уровня сигнала
OPTION_REG.INTEDG = 0;
// Разрешить прерывания по изменению уровня сигнала INT/PB0
INTCON.INTE = 1;
// Разрешить прерывания
INTCON.GIE = 1;
// Инициализируем двигатели
m_init();
// Настроить вывод светодиода и мигнуть им когда очиститься память
TRISB.F3=0;
PORTB.F3=1;
mem_clear();
Delay_ms(200);
PORTB.F3=0;
for(;;)
{
Delay_ms(TMR_DX);
if(!PORTA.F4) _go(); // Запускаем движение по карте
if(ir_data!=0)
{
//Загружаем данные из временной переменной ir_data
key = ir_data;
ir_data = 0;
// Если команда отличается от предыдущей
if(mem_cmd[mem_size]!=key)
{
// Выбираем следующую ячейку памяти
mem_size++;
if(mem_size==MEM_SIZE)
{
PORTB.F3=1; // Зажигаем светодиод
while(1) if(!PORTA.F4) _go(); // Запускаем движение по карте
}
// Сохраняем команду для её последующего сравнения
mem_cmd[mem_size]=key;
// Увеличиваем время простоя команды
mem[mem_size]++;
}
else
{
// Увеличиваем время простоя команды
mem[mem_size]++;
}
if(key==1)
{
m_left_bwd();
m_right_bwd();
}
else if(key==2)
{
m_left_bwd();
m_right_fwd();
}
else if(key==3)
{
m_left_fwd();
m_right_bwd();
}
else if(key==4)
{
m_left_fwd();
m_right_fwd();
}
}
else
{
m_left_stop();
m_right_stop();
}
}
}