Thông báo

Collapse
No announcement yet.

Hướng dẫn mình cách quét led matrix theo cột với !

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

  • Hướng dẫn mình cách quét led matrix theo cột với !

    Phần cứng mình có : 89s52 và 595 và 6 tấm led matrix 8x8
    mình muốn viết code = C cho nó theo kiểu mình sẽ tạo cho nó 1 thư viện font.c , Nội dung hiển thị mình chỉ cần nhập chuỗi kí tự vào rồi biên dịch ra file nạp luôn chứ ko cần fai tạo table . Mình muốn viết code cho 6 con 595 dịh cột , 1 port vdk hoặc dùng 74138 để quét hàng . Mọi người có code mẫu hay cách viết code như thế nào thì share mình với . Chứ dùng 595 quét cột nó giật quá . Mình có đoạn code này dùng 595 dịch cột và quét hàng chạy ok nhưng khổ cái là số lượng kí tự ít quá

    #include<REG52.h>
    #include<string.h>
    #include<stdio.h>
    #include<stdlib.h>
    #include<font.c>
    //////////////////////////////////
    sbit DATA1 = P3^0;
    sbit SCK1 = P3^1;
    sbit LACH1 = P3^2;

    sbit DATA2 = P2^0;
    sbit SCK2 = P2^1;
    sbit LACH2 = P2^2;
    unsigned char temp1;
    unsigned int i,j,d,k,c;

    unsigned char x;
    unsigned char string[]= " TRAN VAN HOANG ";
    unsigned char idata font[195];
    unsigned char ma[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

    void xuly()
    {
    unsigned int i,j,l;
    l=(strlen(string)); //l la so dai cua xau ki tu
    for(i=0;i<=l-1;i++)
    {
    for(j=0;j<8;j++)
    {
    font[8*i+j]=font2[8*(string[i]-32)+j];
    d++;
    }
    }
    }
    //******************ham tao tre ********************/
    void delay1(unsigned int t)
    {
    unsigned int i;
    for(i=0;i<t;i++)
    {}
    }
    /******** ham dich hien thi******/
    void dich_hien_thi()
    {
    unsigned int in,tg;
    tg=font[0];
    for(in=0;in<=d-1;in++)
    {
    font[in]=font[in+1];
    }
    font[d-1]=tg;
    }
    ///////////////////
    void hienthi(unsigned char x)
    {
    unsigned int i,temp;
    for(i=0;i<8;i++)
    {
    temp=x;
    temp=temp&0x80; //lay ra bit dau tien (bit 7)
    if(temp==0x80)//so sanh bit
    DATA1=1; // = 1 thi xuat data vao chip =1
    else
    DATA1=0; // nguoc lai thi data =0 dc xuat vao chip
    x*=2; // dich bit lay bit trong so thap
    SCK1=0; // tao xung tren chan 11
    SCK1=1; // 1 xung dc dua vao 1 bit
    }
    }
    ///////////////////////
    void hienthi1(unsigned char x)
    {
    unsigned int i,temp;
    for(i=0;i<8;i++)
    {
    temp=x;
    temp=temp&0x80; //lay ra bit dau tien (bit 7)
    if(temp==0x80) //so sanh bit
    DATA2=1; // bang 1 thi xuat data vao chip =1
    else
    DATA2=0; // nguoc lai thi data =0 dc xuat vao chip
    x*=2; // dich bit lay bit trong so thap
    SCK2=0; // tao xung tren chan 11
    SCK2=1; // 1 xung dc dua vao 1 bit
    }
    }
    void matrix()
    {
    for(k=0;k<5;k++)
    {
    for(j=0;j<8;j++)
    {
    delay1(30);
    hienthi(0x00);
    hienthi(0x00);
    hienthi(0x00);
    hienthi(0x00);
    hienthi(0x00);
    LACH1=0;
    LACH1=1;
    hienthi1(ma[j]);
    LACH2=0;
    LACH2=1;
    hienthi(font[(j+32)]);
    hienthi(font[(j+24)]);
    hienthi(font[(j+16)]);
    hienthi(font[(j+8)]);
    hienthi(font[j]);
    LACH1=0;
    LACH1=1;
    }
    }
    dich_hien_thi();
    }
    void main()
    {
    xuly();

    while(1)
    {
    matrix();
    }
    }
    ................. Pleiku .................... GIA LAI ...................

  • #2
    cái code này hình như lấy trên machdientu.net của thằng bạn mình, code này là nó mới làm mô phỏng chưa chạy mạch thật lên có thể vẫn có lỗi, còn việc giật khi quét ko phải do quét hàng hay quét cột đâu bạn, bạn cho chạy nhanh thì nhanh hết chữ, chạy chậm thì cảm giác nó giật chữ, do delay thôi
    số lượng kí tự ít thì phải chịu thôi, mảng nó chỉ chứa dc tối đa ngần ấy phần tử, bạn muốn tăng lên thì phải sửa lại code, ghép nhiều mảng con động lại mới được nhiều
    cái này chỉ là demo để người ta học cách điều khiển led ma trận và sử dụng 595 thôi, bạn hãy đọc và tự mò ra phương án giải quyết, quét hàng và quét cột về cơ bản cũng chả khác j nhau đâu
    Website chính thức đổi địa chỉ website thành
    Mời các bạn ghé thăm !!!

    Comment


    • #3
      uhm , code trên là bên mdt . Quét cột và quét hàng sao ko # chứ bạn ? vd mình ghép 2 led matrix 8x8 ta dc 8 hàng và 16 cột , nếu ta quét 16 cột thì nó sẽ lâu hơn so vs ta quét 8 hàng chứ . Mình thấy người ta toàn dùng cách quét hàng để điều khiển nhìu led matrix ghép lại vs nhau .Cách phổ biến là dùng 595 dịch cột ( xuất data ra cột ) và dùng 74138 hoặc 1 port của vdk để quét hàng , cách này mình thấy nội dung hiển thị chạy mượt và ko bị giật khi ta ghép nhìu led matrix lại .Bạn có tài liệu hay vd tương tự như ý mình muốn làm ở trên ko thì share cho mình với !
      ................. Pleiku .................... GIA LAI ...................

      Comment


      • #4
        thế thì bạn hiểu sai quét hàng vs quét cột rồi, quét hàng hay quét cột ở đây cũng đều xét là 8 hàng hoặc 8 cột chư ko phải xoay cái con led 8x16(2con 8x8 ghep lại) đi thì 8 thành 16 và 16 thành 8. điểm khác ở đây là cách dịch bit của nó, ở cách quét thông dụng là quét cột mỗi lần người ta dịch 8bit tức là 1 byte, còn ở cách quét hàng mỗi lần dịch có 1bit, nói chung cũng khó nói và cách quét hàng ko phổ biến, theo ý hiểu thôi. quét cột là pp đơn giản dễ nhất, quét dùng vdk,595,138 cũng đều như nhau cả, 138 vs 595 chỉ là tiết kiệm chân vdk, cái code kia cũng là quét cột, bạn đọc kĩ ko hiểu đâu thì mình giúp cho thôi
        Website chính thức đổi địa chỉ website thành
        Mời các bạn ghé thăm !!!

        Comment


        • #5
          Bạn mast090 và mọi người có thể giúp mình chuyển từ quét cột qua 595 sang quét hàng qua 74138 hay dùng 1 port vdk từ code sau đc ko ? Quang bao.rar . Thanks bạn nhé ! Mình đang rất cần gấp
          Last edited by thi tran; 31-12-2011, 18:07.
          ................. Pleiku .................... GIA LAI ...................

          Comment


          • #6
            Giúp mình với mọi người ơi ! ý nghĩa của đoạn code sau là như thế nào ?
            while(1){
            SDA=1;
            for(j=Pos;j<32+Pos;j++)
            {
            Temp_code=code_Tab[ String_input[(j%lengh_STR)/With_of_font] -32][j%With_of_font]; // dòng này có ý nghĩa là gì ?
            DataPort=0xFF;
            SCL=1;
            SCL=0;
            STR=1;
            STR=0;
            DataPort = Temp_code;
            SDA=0;
            wait(60);
            }
            }
            Ở đoạn code trên thì data dc xuất ra DataPort tương ứng với chân 14 của 595 SDA=1 , giờ mình muốn từ đoạn code trên mình chuyển cho Data dịch nối tiếp vào 595 thì fai viết ntn vậy ? giúp mình với . ở trên có file mô phỏng và code . Mọi người chỉ mình cách làm với
            ................. Pleiku .................... GIA LAI ...................

            Comment


            • #7
              Hix , sao ko ai giúp mình với nhỉ ? hay vấn đề này khó quá chăng ?
              ................. Pleiku .................... GIA LAI ...................

              Comment


              • #8
                Dịch data vào 595

                Đây là 1 đoạn code dịch 1byte (8bit) vào 595
                //Start of code
                Temp=Data;//Data:dữ liệu cần dịch vào 595
                For(i=0;i<8;i++)
                {
                Temp<<=1;//Dịch dữ liệu temp sang trái 1 bit rồi gán vào temp
                SDI=CF;//dữ liệu tại chân SDI bằng bit trong cờ nhớ (cờ Carry, xem trong Thanh ghi STATUS nó nằm bit thứ 0 đối với PIC16F877-887)
                SH_CP=0;SH_CP=1;//tao một xung bằng cách cho xuống 0 rồi lên 1 để dịch dữ liệu và thanh ghi dịch của 595
                }
                ST_CP=0;ST_CP=1;///tao một xung bằng cách cho xuống 0 rồi lên 1 để chốt dữ liệu
                OE=0;//Load dữ liệu ra các chân output của 595
                //-----end of code

                Hy vọng có ích cho bạn!

                Comment


                • #9
                  off ko ở nhà lên ko đọc được bài, hjc, đây là 1 đoạn code mà như mình đã nói là dịch từng bit của mỗi hàng thay vì dịch từng byte của chỉ 1 hàng
                  Code:
                  #include<REGX52.H>
                  #include<stdio.h>
                  #include <intrins.h>
                  
                  sbit	DATA = P1^0;
                  sbit	SCK = P1^1;
                  sbit	SCL = P1^2;
                  
                  unsigned char i,j,n;
                  unsigned char hang[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
                  unsigned char machu[24]={
                  56,120,126,
                  76,108,126,
                  12,102,24,
                  56,246,24,
                  24,246,24,
                  12,102,24,
                  76,108,24,
                  56,120,24
                  //3,T,D
                  };/*
                  unsigned char machu[24]={
                  56,126,120,
                  76,126,108,
                  12,24,102,
                  56,24,246,
                  24,24,246,
                  12,24,102,
                  76,24,108,
                  56,24,120
                  //3,D,T
                  };		*/
                  
                  //// doi vi tri ma chu, lam chu dich sang trai
                  void change_vitri()
                  {
                  	unsigned char tg,m,z;
                  	for(m=8;m>0;m--)
                  		{
                  		for(z=1;z<3;z++)
                  			{
                  			tg=machu[m*3-1]>>7;
                  			machu[m*3-z]=(machu[m*3-z]<<1)+((machu[m*3-z-1])>>7);
                  			}
                  		machu[(m-1)*3]=(machu[(m-1)*3]<<1)+tg;
                  		}
                  
                  }
                  
                  ///// dung timer tao tre
                  void delay_ms(unsigned char time)
                  {
                  	unsigned char t1,t2;
                  	for(t1=time;t1>0;t1--)
                  		for(t2=0;t2<125;t2++);
                  }
                  
                  ////// chuyen song song sang nt			
                  void nhan_data(unsigned char x)
                  {
                  	unsigned char k;
                  	for(k=0;k<8;k++)
                  	{
                  		DATA=0x01&x;
                  		x=x>>1;
                  		SCK=0;
                  		SCK=1;
                  	}
                  }
                  ///// cho phep xuat qua 595
                  void xuat_data()
                  {
                      SCL=0;
                      SCL=1;
                  }
                  ///// xoa du lieu cu cua cac port
                  
                  void main(void)
                  {
                  SCK=1;
                  SCL=1;
                  	while (1)
                  	{
                        	for(n=0;n<30;n++)
                  	 	{
                  			for (i=0;i<=7;i++)
                  			{	
                           	  	 for (j=0;j<3;j++)
                                	  nhan_data(~machu[3*i+j]);
                            	 	 xuat_data();
                             		 P2=hang[i];
                             		 delay_ms(2);
                  				 P2=0;
                          	}
                  	   	}
                  		change_vitri();
                  		P2=0;
                      }
                  }
                  Website chính thức đổi địa chỉ website thành
                  Mời các bạn ghé thăm !!!

                  Comment


                  • #10
                    Nguyên văn bởi mast090 Xem bài viết
                    cái code này hình như lấy trên machdientu.net của thằng bạn mình, code này là nó mới làm mô phỏng chưa chạy mạch thật lên có thể vẫn có lỗi, còn việc giật khi quét ko phải do quét hàng hay quét cột đâu bạn, bạn cho chạy nhanh thì nhanh hết chữ, chạy chậm thì cảm giác nó giật chữ, do delay thôi
                    số lượng kí tự ít thì phải chịu thôi, mảng nó chỉ chứa dc tối đa ngần ấy phần tử, bạn muốn tăng lên thì phải sửa lại code, ghép nhiều mảng con động lại mới được nhiều
                    cái này chỉ là demo để người ta học cách điều khiển led ma trận và sử dụng 595 thôi, bạn hãy đọc và tự mò ra phương án giải quyết, quét hàng và quét cột về cơ bản cũng chả khác j nhau đâu
                    haha,em cũng đã ngâm cứu cái code trên machdientu.net rồi,cái code ấy nếu muốn cho chuỗi kí tự dài thì đổi kiểu thành unsigned char code
                    vanduc0211@gmail.com

                    Comment


                    • #11
                      Nguyên văn bởi 150292
                      cam on b rat nhieu . nhung ba co the giai thich cho minh doan code nay dc khong . rat cam on b

                      void change_vitri()
                      {
                      unsigned char tg,m,z;
                      for(m=8;m>0;m--)
                      {
                      for(z=1;z<3;z++)
                      {
                      tg=machu[m*3-1]>>7;
                      machu[m*3-z]=(machu[m*3-z]<<1)+((machu[m*3-z-1])>>7);
                      }
                      machu[(m-1)*3]=(machu[(m-1)*3]<<1)+tg;
                      }

                      }
                      mình cũng ngại đọc cái code đó quá,bạn xem cái này của mình nè Led 3 mau.rar
                      vanduc0211@gmail.com

                      Comment

                      Về tác giả

                      Collapse

                      thi tran Tìm hiểu thêm về thi tran

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

                      Collapse

                      Đang tải...
                      X