Thông báo

Collapse
No announcement yet.

Led ma trận 7 màu

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

  • Led ma trận 7 màu

    Chào mọi người trong diễn đàn !
    Em đang làm về led ma trận 7 màu.Hiện tại e mới chỉ test hiển thị chữ A sáng 1 màu.em tắt hết led trong while(1) của hàm main,bật led bằng tràn timer0.Nhưng thực tế nó bị nháy led liên tục,không ra chữ nào.Mọi người giúp em với ạ.(Em up cả project lên thì web báo lỗi)
    Em cảm ơn

    Hàm main :

    #include <avr/io.h>
    #define F_CPU 8000000UL
    #include <util/delay.h>
    #include "74hc595.h"
    #include "timer0.h"
    #include "font.h"

    #define sbi(port , bit) (port)|=(1<<(bit)) //set bit -> 1
    #define cbi(port, bit) (port) &= ~(1 << (bit)) //clear bit -> 0
    #define bit_is_set(sfr,bit) (_SFR_BYTE(sfr) & _BV(bit)) //hoi bit 1
    #define bit_is_clear(sfr,bit) (!(_SFR_BYTE(sfr) & _BV(bit))) //hoi bit 0

    void main(){
    int i;
    timer0(); //kich hoat hien thi bang timer0
    while(1){
    convert(0xff,0xff,0xff,0xff); //tat tat ca led
    }
    }


    Hàm 74hc595:

    #include <avr/io.h>
    #define F_CPU 8000000UL
    #include <util/delay.h>

    #define sbi(port , bit) (port)|=(1<<(bit)) //set bit -> 1
    #define cbi(port, bit) (port) &= ~(1 << (bit)) //clear bit -> 0

    #define DDRX DDRA
    #define PORTX PORTA
    #define SCK1 sbi(PORTX,6) //set chan 11(SH_CP)-xung clock len =1,suong duong 0->1 =>1 bit dc dich vao IC
    #define DS1 sbi(PORTX,4) //set chan 14(DS)-du lieu len =1
    #define LAT1 sbi(PORTX,5) //set chan 12(ST_CP)-chot,xuat du lieu len =1. suong duong 0->1

    #define SCK0 cbi(PORTX,6) //clear chan 11 =0;
    #define DS0 cbi(PORTX,4) //clear chan 14 =0;
    #define LAT0 cbi(PORTX,5)

    void convert(int byte1,int byte2,int byte3,int byte4){
    DDRX = 0xff; //PORTA output
    int bit_q,i;

    bit_q = byte4; //gia tri byte4 la gia tri can dich vao IC
    for(i=0;i<8;i++) { //kiem tra su xuat hien cua bit1 trong day 8bit khoi tao cua byte4;
    //DS1 = (bit_q & 0x80)? 1:0; //so sanh bit_q & 0x80 va 0x80,dung =>DS=1 ; sai =>DS=0;
    PORTX = bit_q; //kq : DS7|DS6|DS5|DS4|DS3|DS2|DS1|DS0
    PORTX &= 0x80;
    if(PORTX == 0x80) DS1; //lay dc bit1
    else DS0; //lay dc bit0

    SCK0;
    _delay_us(5); //xung kich 74hc595 phai >5us
    SCK1; // 0->1 dich bit vao IC
    bit_q = bit_q<<1; //kiem tra lan luot tu D7->D6->...->D0
    }

    bit_q = byte3; //gia tri byte3 la gia tri can dich vao IC
    for(i=0;i<8;i++) { //kiem tra su xuat hien cua bit1 trong day 8bit khoi tao cua byte3;
    //DS1 = (bit_q & 0x80)? 1:0; //so sanh bit_q & 0x80 va 0x80,dung =>DS=1 ; sai =>DS=0;
    PORTX = bit_q; //kq : DS7|DS6|DS5|DS4|DS3|DS2|DS1|DS0
    PORTX &= 0x80;
    if(PORTX == 0x80) DS1; //lay dc bit1
    else DS0; //lay dc bit0

    SCK0;
    _delay_us(5); //xung kich 74hc595 phai >5us
    SCK1; // 0->1 dich bit vao IC
    bit_q = bit_q<<1; //kiem tra lan luot tu D7->D6->...->D0
    }

    bit_q = byte2; //gia tri byte1 la gia tri can dich vao IC
    for(i=0;i<8;i++) { //kiem tra su xuat hien cua bit1 trong day 8bit khoi tao cua byte2;
    //DS1 = (bit_q & 0x80)? 1:0; //so sanh bit_q & 0x80 va 0x80,dung =>DS=1 ; sai =>DS=0;
    PORTX = bit_q; //kq : DS7|DS6|DS5|DS4|DS3|DS2|DS1|DS0
    PORTX &= 0x80;
    if(PORTX == 0x80) DS1; //lay dc bit1
    else DS0; //lay dc bit0

    SCK0;
    _delay_us(5); //xung kich 74hc595 phai >5us
    SCK1; // 0->1 dich bit vao IC
    bit_q = bit_q<<1; //kiem tra lan luot tu D7->D6->...->D0
    }

    bit_q = byte1; //gia tri byte1 la gia tri can dich vao IC
    for(i=0;i<8;i++) { //kiem tra su xuat hien cua bit1 trong day 8bit khoi tao cua byte1;
    //DS1 = (bit_q & 0x80)? 1:0; //so sanh bit_q & 0x80 va 0x80,dung =>DS=1 ; sai =>DS=0;
    PORTX = bit_q; //kq : DS7|DS6|DS5|DS4|DS3|DS2|DS1|DS0
    PORTX &= 0x80;
    if(PORTX == 0x80) DS1; //lay dc bit1
    else DS0; //lay dc bit0

    SCK0;
    _delay_us(5); //xung kich 74hc595 phai >5us
    SCK1; // 0->1 dich bit vao IC
    bit_q = bit_q<<1; //kiem tra lan luot tu D7->D6->...->D0
    }
    LAT0;
    _delay_us(5); //xung kich 74hc595 phai >5us
    LAT1; //0->1 : xuat du lieu
    _delay_us(5); //xung kich 74hc595 phai >5us
    }


    Hàm timer0:

    #include <avr/io.h>
    #define F_CPU 8000000UL
    #include <avr/interrupt.h>
    #include <util/delay.h>

    #define sbi(port , bit) (port)|=(1<<(bit)) //set bit -> 1
    #define cbi(port, bit) (port) &= ~(1 << (bit)) //clear bit -> 0
    #define bit_is_set(sfr,bit) (_SFR_BYTE(sfr) & _BV(bit)) //hoi bit 1
    #define bit_is_clear(sfr,bit) (!(_SFR_BYTE(sfr) & _BV(bit))) //hoi bit 0

    #define blue 1
    #define red 2
    #define green 3


    void timer0(){
    //timer0 : 20ms
    TCCR0 |=(1<<CS12)|(1<<CS10); //(1<<CS12)|(0<<CS11)|(1<<CS10);prescaler = 1024
    TCNT0= 98; //khoi tao TCNT1=255-(thoi_gian/((1/F_crystal)*prescaler))=255 - 156.25 ; thoi_gian(s)
    TIMSK |=(1<<TOIE0); //cho phep ngat khi tran T/C0
    sei(); //set bit I (SREG) gloabal interrupt
    }

    //phuc vu ngat tran T/C1
    ISR (TIMER0_OVF_vect ){
    TCNT0=98; //gan lai TCNT1 sau khi tran
    A_upper_single(blue); //hien thi chu A mau xanh

    }


    Hàm font chữ:

    #include <avr/io.h>
    #define F_CPU 8000000UL
    #include <avr/interrupt.h>
    #include <util/delay.h>


    #define sbi(port , bit) (port)|=(1<<(bit)) //set bit -> 1
    #define cbi(port, bit) (port) &= ~(1 << (bit)) //clear bit -> 0
    #define bit_is_set(sfr,bit) (_SFR_BYTE(sfr) & _BV(bit)) //hoi bit 1
    #define bit_is_clear(sfr,bit) (!(_SFR_BYTE(sfr) & _BV(bit))) //hoi bit 0

    #define blue 1
    #define red 2
    #define green 3

    int hang[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

    int A[]={0xff,0x03,0x01,0xcc,0xcc,0x01,0x03,0xff};
    int a[]={0xff,0x8d,0x06,0x36,0x36,0x00,0x81,0x7f};

    ///// convert(hang,blue,red,green);

    void A_upper_single(int x){ //chu A hoa 1 mau
    int i;
    for(i=0;i<8;i++){
    if(x == blue){
    convert(hang[i],A[i],0xff,0xff);
    _delay_ms(1);
    }
    if(x == red){
    convert(hang[i],0xff,A[i],0xff);
    _delay_ms(1);
    }
    if(x == green){
    convert(hang[i],0xff,0xff,A[i]);
    _delay_ms(1);
    }
    }
    }


    void a_lower_single(int x){ //chu a thuong 1 mau
    int i;
    for(i=0;i<8;i++){
    if(x == blue){
    convert(hang[i],a[i],0xff,0xff);
    _delay_ms(1);
    }
    if(x == red){
    convert(hang[i],0xff,a[i],0xff);
    _delay_ms(1);
    }
    if(x == green){
    convert(hang[i],0xff,0xff,a[i]);
    _delay_ms(1);
    }
    }
    }
    /////////////////////////////////////////////////////////////////////
    Attached Files

  • #2
    Em nhầm chỗ kích transistor A1015,kích mức thấp.phải khai báo lại là :
    int hang[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
    Nhưng chương trình vẫn không chạy như ý.
    Mọi người giúp em với ạ ?

    Comment


    • #3
      Em đã tình cờ làm được bằng cách : bỏ chế độ luôn luôn sẵn sàng kích hoat con 74hc595 bằng việc không cho chân 13(OE) nối đất,mà e cho nối với 1 chân vdk,e gửi hết bit dữ liệu ra 4 con 74hc595 thì kích hoạt chân 13,ngay sau đó khoảng 5us thì disable chân 13.
      Nhưng e muốn quay lại cách cũ,đó là nối chân 13 với đất,và tắt led bằng cách gửi data cho 4 con 74hc595 đều là OxFF,theo mạch nguyên lí của e (có 1 con 74hc595 kích A1015 cho 8 anot chung)thì rõ ràng là nó phải tắt chứ ạ ?
      Nhưng tại sao lại không thể tắt được,và khi e chạm tay vào bất kỳ chân con 74hc595 nào thì nó đều bị thay đổi nhấp nháy led ?

      Comment


      • #4
        Đoạn dịch bit sai rồi. Sao lại lấy PORTA làm biến đệm để check bit cần dịch???
        AVR đã quay trở lại: ATMEGA32: 66k, ATMEGA8A: 30k, ATMEGA48: 30k.
        Xem thêm tại Online Store ---> Click here
        Mob: 0982.083.106

        Comment


        • #5
          Dịch bit của e vẫn đúng mà a, PORTA làm biến đệm để lấy lần lượt các bit 1 cao nhất thông qua việc dịch trái lần lượt bit_q = bit_q<<1;và e đã chạy thực tế bình thường hiển thị tất cả bảng chữ cái với 7 màu rồi ạ.
          Nhưng e chỉ muốn được giải đáp thắc mắc là e nối chân 13 của 74HC595 với GND thì nó luôn bị nháy led ma trận liên tục,khi e chạm vào mạch thì nó lại nháy kiểu khác.Mà nếu e dùng PORT bất kỳ để on-off chân 13 này thì không còn hiện tượng đó nữa,e chạm tay vào mạch cũng không sao.

          Comment

          Về tác giả

          Collapse

          toan.ndn Tìm hiểu thêm về toan.ndn

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

          Collapse

          Đang tải...
          X