Thông báo

Collapse
No announcement yet.

Hỏi về thuật toán quét led matrix!!

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

  • #16
    To quoc_Thaibk:
    - 24h/s là tối thiểu nhé!
    -Góp ý để chúng ta phát triển từ cái đơn giản
    -font để trong Flash nhưng không mất bỏ phần select case đi! vì rất tốn thời gian để so sánh và chương trình dài ra( phức tạp ra) mục đích là trỏ index tới bộ font?? thay select case bằng mã ascii của chữ cái từ 0..256. Ví dụ chữ A có mã ascii là 65 tương ứng với index 65 trong font Flash ! đúng thế không quoc_thatbk!
    TO NAMBKCTK46:
    - Ledmatrix là các điểm LED gép lại với nhau nên tùy theo bạn gép thì nó trở thành mxn điểm ảnh thôi: nên tất cả đều là công nghệ và có yêu cầu >> co tiền tiêu thì sẽ làm được tất.Tôi đang nghiên cứu và đang test thử cái màn hình led của tôi nó vuông như cái TV 24 inc ấy để hiển thị các logo và một số hình ảnh.Khi nào xong thì sẽ post lên các anh em xem thử!ai có ý kiến gì hay cách gì thì bổ sung nhé! thank's
    --------------------------------------
    Cùng nhau tỏa sáng
    Email:

    Comment


    • #17
      Đúng như cậu nói thì rất tuyệt thế nhưng vui ở chỗ là mã Ascii thì không chỉ có kí tự (cái đồ án mình làm không đáng để ngồi vẽ hết).Hơn nữa 256 kí tự đó còn có kí tự điều khiển nữa.Đúng là có thể hiện thực theo kiểu index bằng mã ascii nhưng mình không hề làm bởi bản thân cái con matrix led mình làm chỉ để chơi thôi không đáng bỏ công thế.1 lý do nữa là 256 thì có khoảng 32 kí tự đầu là điều khiển (nếu mình nhớ không lầm) vẽ gì cho nó để lưu đây.
      PS:có muốn truy xuất kiểu mảng bình thường cũng chẳng được vì nó đặt trong flash phải dùng các hàm đọc flash để lấy ra (chỉ phức hơn chút nhưng đỡ tốn con eeprom lưu font).
      À cho hỏi cậu làm màn hình 24" à cool thế.Hiện thực bằng gì thế MCU à?

      Sông dài, Thuyền lớn, Biển rộng bao la.
      Tháo neo ngôn ngữ, lèo lái con thuyền kiến thức nhân loại.

      Comment


      • #18
        ok!ý tôi muốn nói đến để bổ sung & phát triển đề tài mà Thái đã làm thôi. còn trong 256 ký tự thì không dùng hết chẳng hạn như với mã Ascii từ 0...20 thì trên bảng font sẽ không chấm gì cả đến 21 là dấu "!" thì chấm font tương ứng với kiểu mình cần hiển thị,vì không khi nào hiển thị các nội dung tương ứng với nó. Vây khi nội dung cần hiển thị chẳng hạn "Chúc mừng năm mới" thì index đầu tiên của mảng data này sẽ là chữ "C" =ASCII(67) như thế index=67 của bảng font và tương tự cho cả câu cần hiển thị.
        -Hiện tại tôi đang làm với AVR at8515 , AT128
        --------------------------------------
        Cùng nhau tỏa sáng
        Email:

        Comment


        • #19
          Nguyên văn bởi luonghanh Xem bài viết
          ok!ý tôi muốn nói đến để bổ sung & phát triển đề tài mà Thái đã làm thôi. còn trong 256 ký tự thì không dùng hết chẳng hạn như với mã Ascii từ 0...20 thì trên bảng font sẽ không chấm gì cả đến 21 là dấu "!" thì chấm font tương ứng với kiểu mình cần hiển thị,vì không khi nào hiển thị các nội dung tương ứng với nó. Vây khi nội dung cần hiển thị chẳng hạn "Chúc mừng năm mới" thì index đầu tiên của mảng data này sẽ là chữ "C" =ASCII(67) như thế index=67 của bảng font và tương tự cho cả câu cần hiển thị.
          -Hiện tại tôi đang làm với AVR at8515 , AT128
          Đúng.hiện thực như bạn thì giải thuật tường minh hơn.thanks.Nhưng mình nộp lâu rùi .
          À cho mình hỏi cái board 24" của cậu bao nhiêu pixel thế hiện thực dc bao nhiêu bit màu.Có thể up hình lên xem không nhỉ.Làm bảng điện tử mà nhiều màu như tivi bằng MCU công lực siêu lắm.

          Sông dài, Thuyền lớn, Biển rộng bao la.
          Tháo neo ngôn ngữ, lèo lái con thuyền kiến thức nhân loại.

          Comment


          • #20
            Nguyên văn bởi vinhsnooker Xem bài viết
            Chương trình trên của bạn cho phép hiện thị mã ký tự đã được mã hóa sẵn và được đưa vào trong mảng 410 byte trên.
            bạn sử dụng 3 con leld ma trận 8x8,mình đoán rằng ở đây sử dụng cách quét theo cột.
            chương trình trên của bạn sẽ quét liên tục 8x8=64 cột ma trận,ban đầu cho cột đầu tiên sáng ứng với dữ liệu là byte đầu của mảng có 410byte ở trên,tiếp đó là đến cột thứ hai ứng với byte thứ hai của mảng 410byte trên,cứ như vậy cho đến cột thứ 64 của bạn.như vậy nếu chỉ quét không như vậy bạn chỉ có thể nhìn thấy 64 byte đầu của mảng trên,để có thể nhìn thấy các ký tự tiếp theo của mảng trên bạn phải sử dụng thuật toán là phải dịch mảng đi để hiển thị tiếp.
            bạn đã biết thuật toán để làm được chức năng đó chưa nhẩy.


            Em đã thực hiện dược thế này: mã hóa 1 ký tự là chữ A, sau đo quyét cột ( 1 ma trận led 8x8) hiển thị được chữ A rồi. Còn chưa dịch nó đi được.
            Em chưa biết thuật toán này. Anh nói rõ hơn được không!
            có thể cho em xin một cái code dơn giản để em "mổ xẻ" được không? Cảm ơn anh nhiều !

            Comment


            • #21
              Led

              Cảm ơn luonghanh, thực ra thì mình cũng đã làm được một vài bo LED con con rồi, chay hoài mà vẫn chưa thấy việc chi cả à. Nhưng mình thấy nó không hiệu quả lắm so với đồ của TQ.
              Nếu bạn nào biết chỗ mô bán mấy đồ đó thì chỉ giúp mình với nhé.

              TO dvnccbmacbt.
              Thực ra bài toán của cậu đặt ra chỉ là bài toán dịch bít của 1 byte thôi,
              Mình có thể đưa ra ngắn gọn sau nhé!

              Giả sử mình có 3 byte liên tiếp nhau là 0xXX, 0xYY và 0xZZ tạo thành một hàng của một biểu tượng nào đó. Giả sử tại một thời điểm LED của mình hiển thị được 2 bytes cũng giả sử luôn tại lúc này đây là 0xXX va 0xYY, Nếu muốn biểu tượng đó dịch sang trái 1pixel thì có nghĩa là phần LED hiển thị của mình lúc này phải hiển thị 2 bytes mới. Trong đó byte đầu tiên được tạo bởi 7 bits thấp của 0xXX, và 1 bit cao của 0xYY, byte tiếp theo được tạo bởi 7 bits thấp của 0xYY và 1 bit cao của 0xZZ. Như vậy ta có:

              byte 1 = (0xXX << 1) | (0xYY >> 7)
              byte 2 = (0xYY << 1) | (0xZZ >> 7)

              Tổng quát nếu dịch 0 <= n <= 8 thì ta có:
              byte 1 = (0xXX << n) | (0xYY >> n)
              byte 2 = (0xYY << n) | (0xZZ >> n)

              Tương tự cho tất cả các byte còn lại.
              Hiển thị các bytes mới sẽ được điều bạn muốn.
              Đường nào dìu tôi đi đến cơn say???????


              0953 735 178

              Comment


              • #22
                Chương trình của em bị sai chỗ nào?

                Chào mọi người!
                Em vừa làm một chương trình nhỏ : hiển thị và dịch một chữ A trêm một led matrix 8x8.
                Đây là sơ đồ mạch:

                Đây là chương trình em viết:
                Chương trình hiển thị chữ A:
                Code:
                #include <16F877A.h>
                #device *=16
                #fuses NOWDT,HS,NOPROTECT
                #use delay(clock=20000000)
                #use fast_io(b)
                #use fast_io(c)
                #use fast_io(a)
                #use fast_io(d)
                #use fast_io(e)
                
                //============Khai bao bien toan cuc====================//
                int8 a,i;
                int8 const kytu[]={224,219,187,123,187,219,224,255}; //mã hóa chữ A
                //=============khai bao ham====================//
                void hienthi();
                void xoa();
                //============chuong trinh chinh==================//
                void main()
                {set_tris_b(0);output_b(0);
                 set_tris_d(0);output_d(0);
                 while(1)
                 { for(i=0;i<24;i++)
                    {hienthi();
                    }
                 }
                }
                //=============chuong trinh con=================//
                //======chuong trinh hien thi kytu=======//
                void hienthi()
                {
                 output_b(kytu[0]);output_d(0x1);xoa(); //thực hiện quét cột 
                 output_b(kytu[1]);output_d(0x2);xoa();//( nối với portD )để hiển thị 
                 output_b(kytu[2]);output_d(0x4);xoa();
                 output_b(kytu[3]);output_d(0x8);xoa();
                 output_b(kytu[4]);output_d(0x10);xoa();
                 output_b(kytu[5]);output_d(0x20);xoa();
                 output_b(kytu[6]);output_d(0x40);xoa();
                 output_b(kytu[7]);output_d(0x80);xoa();
                }
                
                //======xoa ky tu=====//
                void xoa()
                {output_d(0);
                }
                Đây là kết quả chạy:


                Em sửa chương trinh trên như sau để dịch chữ A:
                Code:
                #include <16F877A.h>
                #device *=16
                #fuses NOWDT,HS,NOPROTECT
                #use delay(clock=20000000)
                #use fast_io(b)
                #use fast_io(c)
                #use fast_io(a)
                #use fast_io(d)
                #use fast_io(e)
                
                //============Khai bao bien toan cuc====================//
                int8 a,i;
                int8 const kytu[]={224,219,187,123,187,219,224,255,255,255,255,255,255,255};//them các phần tử của mảng để hiển thị 
                //=============khai bao ham====================//
                void hienthi( int8 );
                void xoa();
                //============chuong trinh chinh==================//
                void main()
                {set_tris_b(0);output_b(0);
                 set_tris_d(0);output_d(0);
                 while(1)
                 {for(a=0;a<8;a++)  //sau mỗi lần a tăng lên 
                   for(i=0;i<24;i++)  //thì bảng sẽ dịch 1 cột so với led matrix
                    {hienthi(a);
                    }
                 }
                }
                //=============chuong trinh con=================//
                //======chuong trinh hien thi kytu=======//
                void hienthi(int8 k)
                {
                 output_b(kytu[k+0]);output_d(0x1);xoa();
                 output_b(kytu[k+1]);output_d(0x2);xoa();
                 output_b(kytu[k+2]);output_d(0x4);xoa();
                 output_b(kytu[k+3]);output_d(0x8);xoa();
                 output_b(kytu[k+4]);output_d(0x10);xoa();
                 output_b(kytu[k+5]);output_d(0x20);xoa();
                 output_b(kytu[k+6]);output_d(0x40);xoa();
                 output_b(kytu[k+7]);output_d(0x80);xoa();
                }
                //======xoa ky tu=====//
                void xoa()
                {output_d(0);//output_b(0);
                }
                chương trinh không hiển thị và cũng không dịch chữ nào đi cả. Hàm hienthi(int8 k) bây giờ có tham số là k.
                Em không hiểu được tại sao? Có phải do em truyền tham số cho hàm không đúng hay tại vì sao? Em đau đầu 2 ngày rồi mà chưa tìm ra.Mong các bác giúp đỡ. Em cảm ơn nhiều.
                Em đang dùng Pic16f877a. Mọi người thông cảm.

                Comment


                • #23
                  Led

                  Cái này không hiển thị được là đúng rồi, do tất cả các linh kiện ít nhiều đều có "quán tính" nên nếu đứa dữ liệu ra liên tục như vậy thì không thể sáng được.
                  Quy trình: Xuất dữ liệu 1 -> dừng(khoảng vài ms) xuất dữ liệu 2.
                  Hơn nữa bạn không thể dùng tín hiệu của chíp để làm nguồn nuôi cho 8 chú LED được đâu.
                  Last edited by nambkctk46; 24-06-2007, 00:18.
                  Đường nào dìu tôi đi đến cơn say???????


                  0953 735 178

                  Comment


                  • #24
                    Em đã làm được cái bảng 7x25 và viết bằng C cho 8051 dung 32 con Transistor cho 32 cổng Thuật toán dịch chữ kiểu này cũng ngắn gọn đấy chứ nhỉ, và chạy rất ngon , bác nào có đoạn code dùng kiểu dịch bít hay dùng bộ ghi dịch thì post lên cho em tham khảo và trao đổi nhé
                    http://s178.photobucket.com/albums/w...ed_matrix4.flv

                    Code:
                    void timer0(void) interrupt 1
                           {
                    	   TR0=0;
                    	   TF0=0;
                    	   TL0=0x00;
                    	   TH0=0x00;
                    	   TR0=1;
                    	   tt++;
                    	   if (tt==3) {
                    	               m++;
                    		       if (m==25+dd+18) {m=0;};tt=0;}; // dk de chay lai dong chu moi nhanh hon
                    	   }
                    
                    void quet_chu()
                    {
                    while(1)				// lap lai viec quet chu
                    	   { 
                    	     n=m;
                    	     {
                    		 for (k=0;k<so_chu;k++)				// quet tat ca cac chu
                    	                 {
                    		             chu_hien_thi();			 
                    		             for (j=0;j<dodai;j++)				 //quet 1 chu cai, quet theo do dai chu
                    		                    {
                    		                    for (i=0;i<25;i++)		            	 //quet 1 cot cua chu
                    		                            {
                    			                        if (i==n) 
                    				                            {
                    				                            P0=P1=P2=P3=0xFF;
                    											switch (dodai)
                    							                     {
                    							                     	                 case 4 : {P0=c_cach[j];tru_n=1;break;}		  //  quet hang
                    												 case 5 : {P0=cot_chu[j];tru_n=1;break;}
                    								                 case 6 : {P0=cot_chu_dai[j];tru_n=1;break;}
                    								                 case 9 : {P0=chimbay[j];tru_n=0;break;}
                    												 };		
                    							                 if (i==0) {P0_7=0;} else if (i<9)  {P1=cot[i];} else if (i<17) {P2=cot[i];} else {P3=cot[i];}; 			  //quet cot lien tuc
                    			                                  delay(30);P0_7=1;                                               // P0_7 ko biet vi sao sang hon cac cot khac, nen phai tat luon !
                    											  }
                    			                          }
                    			  				 if (tru_n==1) {n--;} 	 // cot duoc quet n cua dong chu duoc dich tu trai sang phai, quet xong 1 dong chu quay ve n=m;
                    							 }
                    			          if (k==so_chu-1) {dd=dodai_all;dodai_all=0;}
                    					  } 			   
                    		 	 
                    		    }	   
                    		 
                    		 } 	// while
                    }
                    Last edited by hiodong; 05-08-2007, 00:22.
                    Cung cấp Oscilocope , Inverter , Switching , DC power supply , AC millivolt meter ....

                    Comment


                    • #25
                      Kiểu dùng mảng có chỉ số (index) là mã ASCII để tìm font cho chữ kể ra cũng hay, nhưng mà tốn bộ nhớ lắm. 8051 có mỗi một thanh ghi A, nó cứ đọc tới đọc lui, đọc lùi đọc tới,... => quá mất thời gian.
                      !e

                      Comment


                      • #26
                        Em cũng tìm hiểu về dịch bít (cũng giống cách dùng bộ ghi dịch đúng ko nhỉ?) nhưng chưa hiểu nguyên lý như thế nào? có phải là quét theo hàng và cấp thông tin ra cột ,dịch 1 bít thì ok, nhưng dịch nhiều bít cạnh nhau thì ko biết làm thế nào? cái chính là ý tưởng , chỉ cần hiểu ý tưởng là em làm được. Bác nào có code về dịch bít hay dùng bộ ghi dịch post cho em cái , em cám ơn nhiều!
                        Cung cấp Oscilocope , Inverter , Switching , DC power supply , AC millivolt meter ....

                        Comment


                        • #27
                          Nếu mà dùng ghi dịch để quét cột (mức thấp) thì chỉ cần cho SDA=0 ở xung đầu tiên (SCL=1;SCL=0) rồi,
                          for(i=1;i<tổng_cột;i++)
                          {
                          Port = dữ_liệu_cột_i;
                          SCL=1; SCL=0; //quét cột thứ i
                          }
                          //-----------------------------

                          Trường hợp dùng ghi dịch để xuất dữ liệu thì phải dịch từng bit dữ liệu ra chân SDA, có thể dùng cách xoay thanh ghi a có cờ nhớ c. Minh họa (dùng hợp ngữ) dịch 1 byte dữ liệu ra:

                          mov r7,#8
                          lặp:
                          mov a,dữ_liệu_1
                          rlc a
                          mov SDA,c
                          djnz r7, lặp
                          !e

                          Comment


                          • #28
                            Làm vậy thì chỉ chơi máy bảng con con 16x255 hoặc 16x512 là hết cở. Tốc độ khi làm như thế thì chậm lắm.

                            Comment


                            • #29
                              Nguyên văn bởi hiodong Xem bài viết
                              Em đã làm được cái bảng 7x25 và viết bằng C cho 8051 dung 32 con Transistor cho 32 cổng Thuật toán dịch chữ kiểu này cũng ngắn gọn đấy chứ nhỉ, và chạy rất ngon , bác nào có đoạn code dùng kiểu dịch bít hay dùng bộ ghi dịch thì post lên cho em tham khảo và trao đổi nhé
                              http://s178.photobucket.com/albums/w...ed_matrix4.flv

                              Code:
                              void timer0(void) interrupt 1
                                     {
                              	   TR0=0;
                              	   TF0=0;
                              	   TL0=0x00;
                              	   TH0=0x00;
                              	   TR0=1;
                              	   tt++;
                              	   if (tt==3) {
                              	               m++;
                              		       if (m==25+dd+18) {m=0;};tt=0;}; // dk de chay lai dong chu moi nhanh hon
                              	   }
                              
                              void quet_chu()
                              {
                              while(1)				// lap lai viec quet chu
                              	   { 
                              	     n=m;
                              	     {
                              		 for (k=0;k<so_chu;k++)				// quet tat ca cac chu
                              	                 {
                              		             chu_hien_thi();			 
                              		             for (j=0;j<dodai;j++)				 //quet 1 chu cai, quet theo do dai chu
                              		                    {
                              		                    for (i=0;i<25;i++)		            	 //quet 1 cot cua chu
                              		                            {
                              			                        if (i==n) 
                              				                            {
                              				                            P0=P1=P2=P3=0xFF;
                              											switch (dodai)
                              							                     {
                              							                     	                 case 4 : {P0=c_cach[j];tru_n=1;break;}		  //  quet hang
                              												 case 5 : {P0=cot_chu[j];tru_n=1;break;}
                              								                 case 6 : {P0=cot_chu_dai[j];tru_n=1;break;}
                              								                 case 9 : {P0=chimbay[j];tru_n=0;break;}
                              												 };		
                              							                 if (i==0) {P0_7=0;} else if (i<9)  {P1=cot[i];} else if (i<17) {P2=cot[i];} else {P3=cot[i];}; 			  //quet cot lien tuc
                              			                                  delay(30);P0_7=1;                                               // P0_7 ko biet vi sao sang hon cac cot khac, nen phai tat luon !
                              											  }
                              			                          }
                              			  				 if (tru_n==1) {n--;} 	 // cot duoc quet n cua dong chu duoc dich tu trai sang phai, quet xong 1 dong chu quay ve n=m;
                              							 }
                              			          if (k==so_chu-1) {dd=dodai_all;dodai_all=0;}
                              					  } 			   
                              		 	 
                              		    }	   
                              		 
                              		 } 	// while
                              }

                              bạn cho mình cái sơ đồ mạch trên proteus đi và cả code nữa để mình học hỏi thêm! cảm ơn bạn nha!
                              SỰ HỌC LÀ MÃI MÃI......!!!!

                              Comment


                              • #30
                                các bác chỉ nói với 1 con led metrix thi đó là trên lý thuyết thôi! , chứ nhiều con led ghép lại thì sáng = niềm tin à
                                Ngày mai bắt đầu từ ngày hôm nay!!!

                                Comment

                                Về tác giả

                                Collapse

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

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

                                Collapse

                                Đang tải...
                                X