Фанат науки

 
  • Увеличить размер шрифта
  • Размер шрифта по умолчанию
  • Уменьшить размер шрифта
Василий Алексеевич. Блютуз-приёмник с контролем LCD-дисплея и ИК-пульта с NEC-протоколом для ардуино.

Блютуз-приёмник с контролем LCD-дисплея и ИК-пульта с NEC-протоколом для ардуино. Микроконтроллер - ATmega8515.  Этот e-mail адрес защищен от спам-ботов, для его просмотра у Вас должен быть включен Javascript

Программа на CVAVR:

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

// инициализация порта В под ЖКИ
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm

char vasa;
unsigned int i=0;

//Прием и передача по UART--------------------------------------------
unsigned char uart_getc(void) //прием с uart
{
//ждем приема байта
while( ( UCSRA & ( 1 << RXC ) ) == 0  );
//считываем принятый байт
return UDR;
}
void uart_putc( char x ) // передача char по uart
{
//ждем окончания передачи предыдущего байта
while( ( UCSRA & ( 1 << UDRE ) ) == 0 );
UDR = x;
}
void uart_puts( char *str ) // передача строк по uart
{
unsigned char p;
while( ( p = *str++ ) != 0 ) {
uart_putc( p );
}
}
//------------------------------------------------------------
//обработчик ик сигнала nec протокола-------------------------
unsigned char spad=0;//флаг фронта
unsigned long int comand;
// External Interrupt 0 service routine прерывания по int 0 при любом логическом изменении
interrupt [EXT_INT0] void ext_int0_isr(void)
{
if (spad==1) {  // При спадающем фронте запускаем таеймер и указываем что сделующий нарастающий фронт для получение данных с таймера
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 7,813 kHz
// Mode: Normal top=0xFF
// OC0 output: Disconnected
// Timer Period: 32,768 ms
TCCR0=(0<<PWM0) | (0<<COM01) | (0<<COM00) | (0<<CTC0) | (1<<CS02) | (0<<CS01) | (1<<CS00);
TCNT0=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=(0<<TOIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<TICIE1) | (1<<TOIE0) | (0<<OCIE0);
spad=0; //указываем что сделующий нарастающий фронт для получение данных с таймера
}
else{// При нарастающем фронте снимаем показания таймера и обрабатываем. Первый нарост. фронт игнорируем. Отключаем и сбрасываем таймер
if(TCNT0==0){
//если таймер ноль игнорируем
}
else if(TCNT0<8){ //0
//lcd_putchar(0x30); //Убираем комментарии для просмотра в двоичном кодеж, выдает если значение 0
comand<<=1;
}
else if(TCNT0<15){ //1
//lcd_putchar(0x31);  //Убираем комментарии для просмотра в двоичном кодеж, выдает если значение 1
comand<<=1;
comand|=1;
}
else{
//lcd_putchar(0x32);//2
}
TCNT0=0x00;  //Сбрасываем таймер
spad=1; // Указываем что следует спад фронта для запуска таймера
}
}

// Timer 0 overflow interrupt service routine прерывания при переполнении таймера
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
switch (comand) {
case 0x00FFA25D:
lcd_puts("CH-");
break;
case 0x00FF629D:
lcd_puts("CH");
break;
case 0x00FFE21D:
lcd_puts("CH+");
break;
case 0x00FF22DD:
lcd_puts("<<|");
break;
case 0x00FF02FD:
lcd_puts(">>|");
break;
case 0x00FFC23D:
lcd_puts(">||");
break;
case 0x00FFE01F:
lcd_puts("-");
break;
case 0x00FFA857:
lcd_puts("+");
break;
case 0x00FF906F:
lcd_puts("EQ");
break;
case 0x00FF6897:
//lcd_puts("0");
lcd_clear();
break;
case 0x00FF9867:
lcd_puts("100+");
break;
case 0x00FFB04F:
lcd_puts("200+");
break;
case 0x00FF30CF:
lcd_puts("1");
break;
case 0x00FF18E7:
lcd_puts("2");
break;
case 0x00FF7A85:
lcd_puts("3");
break;
case 0x00FF10EF:
lcd_puts("4");
break;
case 0x00FF38C7:
lcd_puts("5");
break;
case 0x00FF5AA5:
lcd_puts("6");
break;
case 0x00FF42BD:
lcd_puts("7");
break;
case 0x00FF4AB5:
lcd_puts("8");
break;
case 0x00FF52AD:
lcd_puts("9");
break;
};

//lcd_puts("ti");// выводит конец таймера
TCCR0=0x00;
TCNT0=0x00;
spad=0;
}
//---------------------------------------------------------------------

void vivod(char data)
{
lcd_gotoxy(5,0);
lcd_putchar(data);
vasa =data;
lcd_gotoxy(i,2);
lcd_putchar(vasa);
i++;
if(i==21){lcd_clear();i=0;}
uart_putc(data);
}
//---------------------------------------------------------------------
void main(void)
{
    lcd_init(20);
    sei();
DDRA=0b00000000;
PORTA=0b00000000;

// Port B initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0);

// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);

// Port D initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);

// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);

// Port E initialization
// State: Bit2=T Bit1=T Bit0=T
// Function: Bit2=In Bit1=In Bit0=In
PORTE=0b000;
DDRE=0b000;

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=(0<<RXC) | (0<<TXC) | (0<<UDRE) | (0<<FE) | (0<<DOR) | (0<<UPE) | (0<<U2X) | (0<<MPCM);
UCSRB=(0<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (1<<RXEN) | (1<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8);
UCSRC=(1<<URSEL) | (0<<UMSEL) | (0<<UPM1) | (0<<UPM0) | (0<<USBS) | (1<<UCSZ1) | (1<<UCSZ0) | (0<<UCPOL);
UBRRH=0x00;
UBRRL=0x33;

// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Any change
// INT1: Off
// INT2: Off
GICR|=(0<<INT1) | (1<<INT0) | (0<<INT2);
MCUCR=(0<<SRE) | (0<<SRW10) | (0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (1<<ISC00);
EMCUCR=(0<<SRL2) | (0<<SRL1) | (0<<SRL0) | (0<<SRW01) | (0<<SRW00) | (0<<SRW11) | (0<<ISC2);
GIFR=(0<<INTF1) | (1<<INTF0) | (0<<INTF2);

while( 1 )
{
  vivod(uart_getc());
}
}
//Подключение LCD
//VSS=GND
//VDD=+5V
//V0=РЕГУЛИРУЕМЫЙ РЕЗИСТОР(ИЛИ СВЕТОДИОД)
//PC0=RS
//PC1=RW
//PC2=E
//RC3
//PC4=D4
//PC5=D5
//PC6=D6
//PC7=D7
//A=+5V
//K=GND
 
   © Фанат науки 2010 - 2017.  Все права защищены.  При использовании материалов обязательна ссылка на сайт  www.fanatnauki.ru    Сайт участвует в Союзе образовательных сайтов