Thông báo

Collapse
No announcement yet.

[Góp ý]Led7đoạn+Mega8+Ir(remote tv Sony)

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • [Góp ý]Led7đoạn+Mega8+Ir(remote tv Sony)

    chào các bạn hè rảnh không có việc gì làm nên làm cái mạch này chơi!
    Phần cứng:
    mega8 nối PORTB là data của led 7 đoạn còn PORTC là quét nối 6 con tran còn IR nối với chân INT0 nói chung phần cứng rất đơn giản
    Phần mền:
    hiện giờ thì mình đã có đủ phần hiển thị giờ(ko có RealTime) và giải mã remote Sony rất good nhưng ko hiểu sao gép 2 phần lại thì lại có vẻ là do delay nên sai số
    rất mong các cao thủ góp ý cái nhak
    CODE:

    /************************************************** ***
    This program was produced by the
    CodeWizardAVR V2.03.4 Standard
    Automatic Program Generator
    © Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.
    HP InfoTech, Development Tools for Microcontrollers, C Compilers, In-System Programmers

    Project :
    Version :
    Date :
    Author :
    Company :
    Comments:


    Chip type : ATmega8
    Program type : Application
    Clock frequency : 1,000000 MHz
    Memory model : Small
    External RAM size : 0
    Data Stack size : 256
    ************************************************** ***/
    #include <mega8.h>
    #include <delay.h>
    #define data_led PORTB
    #define quet_led PORTC
    #define un unsigned
    un char gio,phut,giay;
    flash unsigned char ma_led[]={0x80,0xF3,0x49,0x60,0x33,0x25,0x05,0xF1,0x01,0x2 1,255,255};
    void ht()
    { un int i=1000;
    while(--i>0)
    {
    quet_led=0b11111110;
    data_led=ma_led[giay%10];
    delay_ms(1);data_led=255;

    quet_led=0b11111101;
    data_led=ma_led[giay/10];
    delay_ms(1);data_led=255;

    quet_led=0b11111011;
    data_led=ma_led[phut%10];
    delay_ms(1);data_led=255;

    quet_led=0b11110111;
    data_led=ma_led[phut/10];
    delay_ms(1);data_led=255;

    quet_led=0b11101111;
    data_led=ma_led[gio%10];
    delay_ms(1);data_led=255;

    quet_led=0b11011111;
    data_led=ma_led[gio/10];
    delay_ms(1);data_led=255;
    }
    }
    //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    void tang_so()
    {
    if(++giay>59)
    {giay=0;
    if(++phut>59)
    { phut=0;
    if(++gio>23) gio=0;
    }
    }
    }
    unsigned int read_IR (void);
    void Control (unsigned char code, unsigned char address);
    void port_init(void)
    {
    PORTB = 0xff;
    DDRB = 0xff;
    PORTC = 0xff;
    DDRC = 0xff;
    PORTD = 0xff;
    DDRD = 0x00;

    }
    //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    interrupt [TIM0_OVF] void timer0_ovf_isr(void)
    {
    TCCR0 = 0x03; //CLK / 64
    TCNT0 = 0;
    }
    interrupt [EXT_INT0] void ext_int0_isr(void)
    {
    unsigned char count, code, address;
    unsigned int IR_input;
    TCNT0 = 0;
    while(!(PIND & 0x04));
    count = TCNT0;
    if(count < 30) //Bit Start (2.4 ms long)
    {
    //delay_ms(20);
    GICR |= 0x40;
    return;
    }
    gio++;
    IR_input = read_IR ();

    code = (unsigned char) ((IR_input & 0xff00) >> 8);
    address = (unsigned char) (IR_input & 0x00ff);

    Control ( code, address );
    }
    unsigned int read_IR (void)
    {
    unsigned char pulseCount=0, code = 0, address = 0, timerCount;
    unsigned int IR_input;

    while(pulseCount < 7) //7bit command(ma lenh)
    {
    while(PIND & 0x04);
    TCNT0 = 0;

    while(!(PIND & 0x04));
    pulseCount++;

    timerCount = TCNT0;

    if(timerCount > 14)
    code = code | (1 << (pulseCount-1));
    else
    code = code & ~(1 << (pulseCount-1));
    }
    pulseCount = 0;
    while(pulseCount < 5) //5bit address(dia chi)
    {
    while(PIND & 0x04);
    TCNT0 = 0;

    while(!(PIND & 0x04));
    pulseCount++;

    timerCount = TCNT0;

    if(timerCount > 14)
    address = address | (1 << (pulseCount-1));
    else
    address = address & ~(1 << (pulseCount-1));
    }

    IR_input = (((unsigned int)code) << 8) | address;

    return(IR_input);
    }
    void Control (unsigned char code, unsigned char address)
    {

    if (address != 1)
    return;

    if((code == 16) || (code == 17)) //Channel+ or Channel- button is pressed
    {
    gio++;
    }

    if(code == 18) //Volume- button pressed
    {
    gio++;
    }

    if(code == 19) //Volume+ button pressed
    {
    gio++;
    }

    if(code == 9) //'0' button pressed
    {
    gio++;
    }

    if(code == 0) //'1' button pressed
    {
    gio++;
    }
    }
    void init_devices(void)
    {
    #asm("cli")
    port_init();
    MCUCR = 0x02;
    GICR = 0x40;
    TIMSK = 0x00;
    #asm("sei")
    }
    void main(void)
    {
    while(1)
    {
    tang_so();
    ht();
    init_devices();
    }
    }

Về tác giả

Collapse

cogaihalan Tìm hiểu thêm về cogaihalan

Bài viết mới nhất

Collapse

Đang tải...
X