Thông báo

Collapse
No announcement yet.

LED MATRIX DISPLAY

Collapse
This topic is closed.
X
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • #76
    cac cao thu pic cho hoi
    khi noi cac chan pic toi moèt co can fai gan them cai mo gi khong
    co ai biet lap trinh hien thuc pid tren pic khong
    xin da ta cac bac truoc

    Comment


    • #77
      Nguyên văn bởi picpopo
      cac cao thu pic cho hoi
      khi noi cac chan pic toi moèt co can fai gan them cai mo gi khong
      co ai biet lap trinh hien thuc pid tren pic khong
      xin da ta cac bac truoc
      PID hiểu được thì làm trên con gì cũng được. Bạn xem tại box PSoC, Falleaf có post 1 bài có cả code nữa. Tìm kỹ lại chút.
      Mà bạn đặt câu hỏi như vậy thật khó mà trả lời. Bởi nó ko liên quan tới PIC mà liên quan tới điện tử căn bản(Mosfet)... bạn mở 1 luồng và hỏi thì sẽ hay hơn và được chú ý hơn.

      Comment


      • #78
        Code cho mach Quang bao

        Đây là chương trình LED matrix tôi đã làm cho đồ án môn Thiết kế mạch logic. Chương trình sử dụng PIC16F88 là
        phần tử điều khiển chính, dùng 74154 để quét 16 cột(kích thước bảng Led là 16x8) và 74595 để gửi dữ liệu hàng
        có dung thêm A1015 để đệm dòng cho hàng.
        Tính năng chính của chương trình:
        - Hiển thị bản tin được lưu trong Flash, khi đó kích thước nội dung bản tin tuỳ thuộc vào Flash
        - Copy bản tin vào eeprom và hiển thị nội dung đó.
        - Nội dung bản tin được cập nhật bằng máy tính thông qua cổng COM, nội dung cập nhật sẽ lưu vào eeprom và khi
        đó chương trình sẽ hiển thị nội dung từ EEPROM
        Chương trình cập nhật sẽ bao gồm:
        1. Hiển thị nội dung hiện tại của eeprom
        2. Cập nhật số ký tự tối đa của bản tin (biến max_char và lưu vào vị trí 0xff của eeprom)
        3. Vị trí eeprom cần thay đổi (nếu vị trí này lớn hơn giá trị của max_char thì biến max_char được cập nhật)
        4. Số ký tự cần thêm mới
        - Tốc độ chữ chạy được quy định bởi biến time và giá trị được thay đổi thông qua giá trị ADC-8bit được lấy tại chân
        RA4 (kênh AN4).

        Chương trình con bao gồm các phần: - Giải mã ký tự ASCII.
        - Copy vào bộ đệm màn hình (buff_disp[16])
        - Chương trình hiển thị sẽ đọc nội dung của buff_disp[16] đưa ra bảng LED
        Here CODE for PIC16F88:

        //+===Chuong trinh LED matrix display===========+
        //| Thiet ke: Nguyen Chi Linh - DT8K47 - DHBKHN |
        //| MCU: PIC16F88 (4K FLASH ROM, 256K EEPROM) |
        //| Cac IC khac: 74154 - demux/decode 1-of-16 |
        //| 74595 - Ghi dich 8bit |
        //+=============================================+

        #include <16f88.h>
        #include <defs_88.h>
        #device *=16 ADC=8
        #FUSES NOWDT, HS, NOPUT, MCLR, NOBROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG, NOPROTECT, NOFCMEN, NOIESO
        #use delay(clock=10000000)
        #use rs232(baud=4800,parity=N,xmit=PIN_B5,rcv=PIN_B2,bi ts=9)

        #include <input.c>
        #include <font_ascii.c>

        // Dinh nghia cac chan cho ket noi 74595
        #bit data = 0x06.1 //RB1
        #bit clk = 0x06.0 //RB0
        #bit latch = 0x06.3 //RB3

        // Bo nho dem man hinh hien thi
        int8 buff_disp[17]; //Bo nho dem cho man hinh LED
        int8 max_char=68; //SO ky tu hien thi toi da
        int8 time=5; //Bien quy dinh toc do chu chay

        //=========KHAI BAO CAC CHUONH TRINH CON================
        int8 doc_eeprom(int8 addr);
        void send_2_595(int8 temp);
        void display();
        void copy_2_ram1(int8 index_char);
        void copy_2_ram2(int8 index_char);
        void update_eeprom();
        void convert_bcd(int8 x);

        //=============================================
        //===========Chuong trinh chinh================
        void main() {
        int8 i,j;
        #bit update_flag = 0x06.4
        char const a[70]= " Bang thong tin dien tu.Nguyen Chi Linh-DT8 DAI HOC BACH KHOA HA NOI ";// Ky tu NULL duoc them vao cuoi
        char const adc[6] = " ADC=";
        TRISA=0x10; // Thiet lap chan vao ra
        TRISB=0x14;

        setup_adc_ports(sAN4); //Chon kenh AN4 nhung ko hieu sao can them phan khai bao
        setup_adc(ADC_CLOCK_INTERNAL);// ben duoi dechon dung kenh AN4 cho no chay dung
        //Chon kenh AN4 clear cac bit tai thang ghi ADCON1 (chs0 : 2)
        chs0=0; //Clear bit 1f.3
        chs1=0; //Clear bit 1f.4
        chs2=1; //Clear bit 1f.5
        delay_ms(10);

        for(i=0;i<6;++i)
        write_eeprom(0xf0+i,adc[i]);
        for(i=0;i<69;++i)
        write_eeprom(i,a[i]);
        write_eeprom(0xff,max_char); // Luu so ky tu toi da vao ROM
        do {
        for (i=0;i<=16;i++) // Clear RAM of buff_disp
        buff_disp[i]=0xff;
        //max_char=doc_eeprom(0xff); // Doc lay gia tri max_char
        if(update_flag)
        update_eeprom();
        time = read_adc()/10; //Cap nhat bien quy dinh toc do chu chay
        for (i=0;i<=max_char;i++) // Begin of text
        {
        j=read_eeprom(i)-32;
        if (j<=51)
        copy_2_ram1(j);
        else
        {
        j=j-52;
        copy_2_ram2(j);
        }
        }
        j=read_adc();
        convert_bcd(j);
        for(i=0;i<8;++i)
        {
        j = doc_eeprom(0xf0 + i)-32;
        copy_2_ram1(j);
        }
        } while(true);
        }
        //========= END MAIN ==============

        // === CAC CHUONG TRINH CON =========
        //=======Gui du lieu theo duong noi tiep toi 595============
        void send_2_595(int8 temp) {
        #bit flag_bit = temp.7 // bien temp la du lieu 8-bit can gui
        int8 i;
        clk=0;
        for(i=0;i<8;i++)
        {
        if(flag_bit)
        data=1; //bit 1
        else data=0; //bit 0
        clk=1;
        clk=0;
        temp<<=1; // Dich trai 1 bit
        }
        latch=1; //Chot du lieu
        latch=0;
        }
        //===========Chuong trinh con hien thi=========
        void display() {
        int8 count,column_count;
        int8 i;

        for (i=0;i<=time;i++) //Toc do chu chay thay doi boi bien time
        {
        column_count=0;
        for(count=16;count>0;count--)
        {
        send_2_595(buff_disp[count]);
        PORTA=column_count;
        delay_ms(1);
        column_count++;
        }
        }
        }

        //========Copy to Ram1=====================
        void copy_2_ram1(int8 index_char) {
        int8 i,j;

        for (j=0;j<=5;j++)
        { // Dich RAM
        for (i=16;i>0;i--)
        buff_disp[i]= buff_disp[i-1]; // Dich RAM sang trai
        buff_disp[0]=font[index_char].b[j]; // Luu ma ascii vao RAM
        display(); // Goi hien thi
        }
        buff_disp[0]=0xff;
        }
        //========Copy to Ram 2===================
        void copy_2_ram2(int8 index_char) {

        int8 i,j;

        for (j=0;j<=5;j++)
        {
        for (i=16;i>0;i--) // Dich RAM
        buff_disp[i]= buff_disp[i-1]; //Dich RAM sang trai
        buff_disp[0]=font2[index_char].b[j]; //Luu ma ascii vao RAM
        display(); // Goi hien thi
        }
        buff_disp[0]=0xff; // Them mot khoang trang giua hai ky tu
        }
        //=========Update EEPROM===================
        void update_eeprom() {
        byte i,j,addr,max;
        char temp;
        char string[64];
        //#locate i=0x33
        //#locate j=0x34
        //#locate addr=0x35
        //#locate max=0x36
        //#locate string = 0x37

        printf("\r\n256 byte EEPROM of PIC16F88:\r\n"); // Display contents of the first 64
        for(i=0; i<=15; ++i) // bytes of the data EEPROM in hex
        {
        for(j=0; j<=15; ++j)
        printf( "%2x ", doc_eeprom( i*16+j ) );
        printf("\n\r");
        }
        printf("\r\nTong so chu: %2x", doc_eeprom(0xff));
        printf("\r\n\nCo thay doi ban tin ko(Y/N)? ");temp=getc();
        if (temp == 'y' || temp == 'Y')
        {
        printf("\r\nSo chu hien thi moi la: ");
        max_char=gethex();
        write_eeprom(0xff,max_char);
        printf("\r\nDia chi EEPROM can thay doi: ");
        addr = gethex();
        if (addr >= max_char)
        write_eeprom(0xff,addr);
        printf("\r\nSo ky tu them vao: ");
        max = gethex(); // Tra ve gia tri Hexa
        if(max >= max_char)
        write_eeprom(0xff,max); // Cap nhat so ky tu
        printf("\r\nNew: ");
        get_string(string,max+1);
        for (i=0;i<max;i++) //bat dau qua trinh ghi vao ROM (cap nhat du lieu moi)
        {
        write_eeprom(addr,string[i]);
        addr=addr+1;
        }
        }
        else printf("Tro ve !"); // Ket thuc viec cap nhat, tro ve hien thi
        }
        //=============READ EEPROM=====================
        int8 doc_eeprom(int8 addr)
        {
        EEADR=addr;
        RD=1;
        return(EEDATA);
        }
        //=======Chuyen gia tri hex ra so ASCII=========
        void convert_bcd(int8 x)
        {
        int8 temp;
        int8 a;
        temp=x%10; //chia lay phan du, so hang don vi
        write_eeprom(0xf7,temp+0x30); //Cong them 0x30 de tra ve gia tri SCII
        a=x/10; //tach hang tram va hang chuc
        temp=a%10; //tach so hang chuc
        write_eeprom(0xf6,temp+0x30);
        temp=x/100;
        write_eeprom(0xf5,temp+0x30);
        }
        Ethernet-RS232, PIC Webserver, RFID Reader
        CallerID, Cảnh báo BTS, ...
        0988006696
        linhnc308@gmail.com
        http://linhnc308.blogspot.com

        Comment


        • #79
          Nói nhiều rồi bây giờ tại hạ vào chủ đề chính để các hạ khỏi phải đợi lâu
          Đầu tiên, em dùng 8 con transistor cho anot của LMD,ở catot em dùng ULN2803 để hút dòng.Kết quả là khi lập trình cho nó hiển thị chữ thì nó hiển thị bình thường.Nhưng tại sao cột đầu tiên và cột cuối cùng có 1 số led vẫn sáng.... tại hạ không hiểu tại sao .Mong các huynh giúp em vóii

          Comment


          • #80
            Van de nay do truoc khi xuat va sau khi xuat ban da tinh toan du het 1 dong/ 1 hang, chi can hieu chinh lai chuong trinh la duoc !

            Comment


            • #81
              Nguyên văn bởi BinhAnh
              //Font cho LED MATRIX
              typedef struct{
              char b[5]; /* Data */
              }T_font;

              const T_font font[] = {
              //{{' ', 5, 7},{
              0b00000000, /* ........ */
              0b00000000, /* ........ */
              0b00000000, /* ........ */
              0b00000000, /* ........ */
              0b00000000 /* ........ */
              //}}
              ,
              //{{'!', 5, 7},{
              0b00000000, /* ........ */
              0b00000000, /* ........ */
              0b11111010, /* .@.@@@@@ */
              0b00000000, /* ........ */
              0b00000000 /* ........ */
              //}}
              ,
              //{{'"', 5, 7},{
              0b00000000, /* ........ */
              0b11100000, /* .....@@@ */
              0b00000000, /* ........ */
              0b11100000, /* .....@@@ */
              0b00000000 /* ........ */
              //}}
              ...
              }

              Hàm Printchar:
              void printchar()
              {
              unsignded char i1;
              for (i1=0;i1<MAX_CHU;i1++)
              {
              buff_disp[5*i1]=font[buff_data[i1]].b[0];
              buff_disp[5*i1+1]=font[buff_data[i1]].b[1];
              buff_disp[5*i1+2]=font[buff_data[i1]].b[2];
              buff_disp[5*i1+3]=font[buff_data[i1]].b[3];
              buff_disp[5*i1+4]=font[buff_data[i1]].b[4];

              }
              }

              Trong đó buff_disp[] là mảng buff màn hình.
              Có nhiều cách để làm, nhưng trên là 1 cách cho led matrix. Tốn ít RAM, ít thời gian xử lý, đương nhiên phải đủ FLASH để chứa Font
              em cũng thử làm giống bác bình anh khai bảo font kiểu này nhưng ko hỉu seo
              mới khai báo đuọc mấy chục font thì báo lỗi data segment too large
              em dùng con 89c
              SHARE KHO PHIM LỚN

              Comment


              • #82
                code demo day


                #include <at89x52.h>
                unsigned char buff[9];
                typedef struct
                {
                unsigned char b[9];
                } T_font;
                const T_font font[]={

                0xFF ,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, // dau cach
                0x00 ,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0x00, // chu H
                0x99 ,0x66,0x66,0x66,0x7E,0xBD,0xDB,0xE7, // trai tim
                0x00 ,0x66,0x99,0x00,0xDB,0xDB,0xBD,0x7E ,// BK
                0xFF ,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, // dau cach
                0x00 ,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0x00, // chu H
                0x99 ,0x66,0x66,0x66,0x7E,0xBD,0xDB,0xE7, // trai tim
                0x00 ,0x66,0x99,0x00,0xDB,0xDB,0xBD,0x7E ,// BK
                0xFF ,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, // dau cach
                0x00 ,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0x00, // chu H
                0x99 ,0x66,0x66,0x66,0x7E,0xBD,0xDB,0xE7, // trai tim
                0x00 ,0x66,0x99,0x00,0xDB,0xDB,0xBD,0x7E ,// BK
                0xFF ,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, // dau cach
                0x00 ,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0x00, // chu H
                0x99 ,0x66,0x66,0x66,0x7E,0xBD,0xDB,0xE7, // trai tim
                0x00 ,0x66,0x99,0x00,0xDB,0xDB,0xBD,0x7E ,// BK
                };

                unsigned char i,j;
                void delay(unsigned long time)
                {
                unsigned long k;
                for (k=0;k<time;k++) {}
                }

                void display(unsigned char index)
                {
                unsigned char i;
                for (i=0;i<=7;i++)
                {

                P1=font[index].b[i];
                P2=i;
                delay(1);
                }

                }
                SHARE KHO PHIM LỚN

                Comment


                • #83
                  tôi thiết kế cái bảng quang báo 16*32 dùng 8 con 154 để điều khiển 8 modul 8*8 (2 màu)
                  và 1 con 74ls138 để điều khiển 74154 .
                  hàng thì dùng trans a013 để đệm ,tuy nhiên bảng ko sáng lắm mà dùng con ULN2803 để đệm cột thì ko dc thì phải vi tui dùng con 154 active low ,vậy có cách nào để đảm bảo công suất ko nhỉ
                  trước thì có dùng con 595 nhưng con này điều khiển hơi rắc rối
                  SHARE KHO PHIM LỚN

                  Comment


                  • #84
                    đây sơ đồ đây ,bạn thử xem qua nhé
                    SHARE KHO PHIM LỚN

                    Comment


                    • #85
                      Thiết kế của bạn có vấn đề rồi bạn ơi, có phải các IC trên mạch là NOT và 74138?. Bạn xem kỹ nhé

                      Comment


                      • #86
                        không phải not đâu ,tôi thiết kế kiểu này
                        tôi thiết kế cái bảng quang báo 16*32 dùng 8 con 154 để điều khiển 8 modul 8*8 (2 màu) và 1 con 74ls138 để điều khiển 74154 . 154 dùng để quét cột
                        còn hàng thì dùng 8 con trans A013 để đệm
                        căn bản chưa kịp vẽ cái mạch orcad nên lấy tạm cai này
                        SHARE KHO PHIM LỚN

                        Comment


                        • #87
                          Bạn gái à,như vậy bạn quét như vậy thì mỗi led chỉ sáng trong thời gian:T/(16*32) a? vậy đâu có được nhỉ, dong trung bình sẽ hàng ampe, kết quả để led sáng như ý thì nó cháy hết rồi...

                          Comment


                          • #88
                            tôi cắm bo test thử roài ,chả cháy tì gì vẫn chạy ầm ầm ,cái chính là nó sáng ko được rực rỡ thôi ,
                            SHARE KHO PHIM LỚN

                            Comment


                            • #89
                              Bạn tăng công suất cho nó sáng rực thì cũng đồng nghĩa nó sẽ cháy hoặc chưa cháy nhưng tuổi thọ led sẽ giảm. Thử tính một bài toán tương đối:
                              Dòng trung bình = 10ma = Imax/(32*16)
                              Vậy Imax(dòng quét)=10*32*16=10*512=5A. Vậy ít ra bạn cũng phải quét tới 2A. Liệu dòng đỉnh 2A thì có an toàn cho led ko? tuổi thọ có lâu ko? và phần công suất có đủ đáp ứng được ko?

                              Comment


                              • #90
                                Chẳng có con LED nào chịu được tới 2A đâu! Các mạch quét chỉ quét ở 20-30mA là cùng. Không LED thì nó toi sớm! Mà 2A thì dùng cái chi để làm phần công suất nhỉ (nghĩ đến con FET mà giật mình! )
                                PNLab
                                Mạch nạp/debug ULink2, Jlink ARM USB
                                Mạch nạp AVR, PIC, 8051, MSP430 USB
                                Mạch phát triển STM32, ARM9, ARM11
                                more...www.pnlabvn.com

                                Comment

                                Về tác giả

                                Collapse

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

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

                                Collapse

                                Đang tải...
                                X