Thông báo

Collapse
No announcement yet.

Sửa giùm mình đoạn code này với !

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

  • Sửa giùm mình đoạn code này với !

    Mình có đoạn code quét 5 led matrix 8x8 dùng ic 74595 .đoạn code này không bị lỗi mà khi mình nhập nhiều hơn 21 kí tự vào ô chuỗi hiển thị thì không biên dịch debug và mô phỏng đc ! mong mọi người sửa giúp mình để có thể hiển thị nội dung bất kì và không hạn chế số lượng kí tự
    code mình đây :
    #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();
    }
    }

    mong mọi người chỉ mình cách sửa !
    ................. Pleiku .................... GIA LAI ...................

  • #2
    đơn giản thôi, khi câu khai báo kiểu như thế này:
    PHP Code:
    unsigned char string[]= " TRAN VAN HOANG ";
    unsigned char idata font[195];
    unsigned char ma[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; 
    trình biên dịch sẽ xem xét nó như là 1 biến và nó sẽ được lưu ở RAM của vi điều khiển, với 128byte RAM của 89c52 thì over là phải đạo rồi.

    cách chỉnh sửa như sau: đối với các mảng mà cậu dự định sẽ không tác động hoặc làm thay đổi gì khi chạy chuơng trình thì cậu sẽ khai báo nó dưới dạng hằng số.

    ví dụ:
    PHP Code:
    unsigned char code string[]= " manhcuong.k08 ";
    unsigned char code ma[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; 
    còn đối với mảng mà cậu dự định sẽ lưu trữ khi sử chạy chương trình:
    PHP Code:
    /*maximum đối với 128byte RAM*/
    unsigned char array[128]; 
    //điều này sẽ không hay cho lắm, việc này sẽ lấy hết số lượng ô nhớ sử dụng cho các biến khác//
    /*nếu như VDK có không gian Xdata trong bộ nhớ nội thì sẽ như sau*/
    xdata tên_mảng[maximum];

    /*đối với VDK không có không gian xdata tốt nhất là sử dụng eeprom ngoại */ 
    hình như đã gặp bác này ở trên diễn đàn nào rồi thì phải, sv Tây Nguyên phải không nhỉ

    Comment


    • #3
      cái code này nhìn quen quen, cách sửa chumanh nói đúng rồi, bạn phải để ý đến ram của nó, với loại mảng ma trận ngắn nó chạy mà dài nó ko chạy thì thường chỉ có do ram
      Website chính thức đổi địa chỉ website thành
      Mời các bạn ghé thăm !!!

      Comment


      • #4
        Nguyên văn bởi chumanh Xem bài viết
        đơn giản thôi, khi câu khai báo kiểu như thế này:
        PHP Code:
        unsigned char string[]= " TRAN VAN HOANG ";
        unsigned char idata font[195];
        unsigned char ma[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; 
        trình biên dịch sẽ xem xét nó như là 1 biến và nó sẽ được lưu ở RAM của vi điều khiển, với 128byte RAM của 89c52 thì over là phải đạo rồi.

        cách chỉnh sửa như sau: đối với các mảng mà cậu dự định sẽ không tác động hoặc làm thay đổi gì khi chạy chuơng trình thì cậu sẽ khai báo nó dưới dạng hằng số.

        ví dụ:
        PHP Code:
        unsigned char code string[]= " manhcuong.k08 ";
        unsigned char code ma[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; 
        còn đối với mảng mà cậu dự định sẽ lưu trữ khi sử chạy chương trình:
        PHP Code:
        /*maximum đối với 128byte RAM*/
        unsigned char array[128]; 
        //điều này sẽ không hay cho lắm, việc này sẽ lấy hết số lượng ô nhớ sử dụng cho các biến khác//
        /*nếu như VDK có không gian Xdata trong bộ nhớ nội thì sẽ như sau*/
        xdata tên_mảng[maximum];

        /*đối với VDK không có không gian xdata tốt nhất là sử dụng eeprom ngoại */ 
        hình như đã gặp bác này ở trên diễn đàn nào rồi thì phải, sv Tây Nguyên phải không nhỉ
        Hì ! đúng rồi ! bạn nhớ dai thế . code này mình tìm đc trên mạng thôi ko fai mình viết ! Mình gà phần lập trình này lắm , bạn có thể giải thích rõ hơn chút xíu nữa đc ko? "khai báo dưới dạng hằng số "là như thế nào ? " mảng tác động tới và mảng ko tác động tới " là ntn?bạn cho mình vd minh họa vs nha !^^ Mình chỉ quen vs việc quét led matrix vs cái bảng data dài ngoằng bên asm thôi , nay đang mò mẫm sang bên C nên còn gà lắm mong bạn chỉ mình với !
        vd mình muốn hiển thị chuỗi này thì fai sửa code ntn ?
        //////////////////////////////////////

        unsigned char x;
        unsigned char string[]=" LENGUYENNGOCCUONG@GMAIL.COM.VN ";
        unsigned char idata font[195];
        unsigned char ma[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

        ////////////////////////////////////////////////////////////////////////////////
        ................. Pleiku .................... GIA LAI ...................

        Comment


        • #5
          Nguyên văn bởi thi tran Xem bài viết
          Mình có đoạn code quét 5 led matrix 8x8 dùng ic 74595 .đoạn code này không bị lỗi mà khi mình nhập nhiều hơn 21 kí tự vào ô chuỗi hiển thị thì không biên dịch debug và mô phỏng đc ! mong mọi người sửa giúp mình để có thể hiển thị nội dung bất kì và không hạn chế số lượng kí tự
          code mình đây :
          #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();
          }
          }

          mong mọi người chỉ mình cách sửa !
          pm mình yh:vubang07. mình giúp cho, khai bào ram nhiều quá sẽ bị tình trạng này

          Comment


          • #6
            Hix , mọi người giúp mình với ! code trên mình fai sửa ntn để hiện đc nhiều kí tự mà không bị lỗi
            ................. Pleiku .................... GIA LAI ...................

            Comment


            • #7
              Nguyên văn bởi thi tran Xem bài viết
              Hix , mọi người giúp mình với ! code trên mình fai sửa ntn để hiện đc nhiều kí tự mà không bị lỗi
              làm sao mà cái bảng led matrix nó có thể hiểu được mã ascii hả cậu, cậu đưa ra mã ascii thế thì phải sử dụng 1 bảng tra tức là font nữa để hiển thị nó, giống như trong windows ấy, muốn hiển thị một chuỗi ký tự thì nó cũng phải có 1 bảng font để đưa ra màn hình.
              Nếu như cậu muốn hiển thị cố định mà ko phải sử dụng bảng font thì cậu phải tạo ra bộ mã cho chuỗi ký tự của cậu sau đó xuất nó ra ledmatrix !

              Comment


              • #8
                ac ac! code của mình sao lại ở đây nhể ??? Đúng là code trục trặc ở chỗ hiển thi 22 ký tự trở lên thì vdk bị treo , đọc mấy comment trên mới ngộ ra .Định post cái font.c lên nhưng đang ở quê ... Tạo cái font này mình đã hướng dẫn rất cụ thể trên web rồi ai muốn tìm hiểu thì coi lại .

                Comment


                • #9
                  Hic , code trên mình có nhận là mình viết đâu , nếu mình viết mình đã sửa đc nó rồi , ^^ .Nó là của bạn fee_08
                  àh , vậy bạn có thể sửa nó giúp mình vs đc ko? mình đang cần nó cho cái mạch của mình . Mình muốn cho nó hiện nhiều kí tự . bảng mã font.c mình cũng có ! Fai làm ntn hả các bạn ? post code mấy hôn rồi mà chưa ai giúp mình đc cả hix hix ..................
                  ................. Pleiku .................... GIA LAI ...................

                  Comment


                  • #10
                    Nguyên văn bởi thi tran Xem bài viết
                    Hic , code trên mình có nhận là mình viết đâu , nếu mình viết mình đã sửa đc nó rồi , ^^ .Nó là của bạn fee_08
                    àh , vậy bạn có thể sửa nó giúp mình vs đc ko? mình đang cần nó cho cái mạch của mình . Mình muốn cho nó hiện nhiều kí tự . bảng mã font.c mình cũng có ! Fai làm ntn hả các bạn ? post code mấy hôn rồi mà chưa ai giúp mình đc cả hix hix ..................
                    Ram trong 89xx có giới hạn muốn hiện nhiều kí tự bạn phải dùng Ram ngoài thôi .
                    vd như con Sram 6264.(con này có dung lượng 8kbyte,giả sử font của bạn là 5*8 thì bạn có thể viết được 1618 kí tự.)
                    Last edited by tdm; 13-07-2011, 12:07.
                    |

                    Comment


                    • #11
                      Nguyên văn bởi tdm Xem bài viết
                      Ram trong 89xx có giới hạn muốn hiện nhiều kí tự bạn phải dùng Ram ngoài thôi .
                      vd như con Sram 6264.(con này có dung lượng 8kbyte,giả sử font của bạn là 5*8 thì bạn có thể viết được 1618 kí tự.)
                      Vậy theo ý bạn là mình nên dùng Ram ngoài àh?nếu dùng ram ngoài như bạn nói thì mình phải sửa code lại như thế nào vậy bạn ? mình chưa làm mạch nào phải dùng tới Ram ngoài nên chưa hỉu j về chỗ này cả ! mong bạn chỉ mình với ^^
                      ................. Pleiku .................... GIA LAI ...................

                      Comment


                      • #12
                        Nguyên văn bởi thi tran Xem bài viết
                        Vậy theo ý bạn là mình nên dùng Ram ngoài àh?nếu dùng ram ngoài như bạn nói thì mình phải sửa code lại như thế nào vậy bạn ? mình chưa làm mạch nào phải dùng tới Ram ngoài nên chưa hỉu j về chỗ này cả ! mong bạn chỉ mình với ^^
                        đại ka có kiến thức về mạch số, vi điều khiển chứ, vậy việc giáo tiếp với RAM thì có gì khó, mọi người không thể vẽ mạch, viết code từng dòng và giải thích từng chút được, những gì mọi người có thể giúp là đưa ra định hướng cho những câu hỏi để người hỏi tự tìm kiếm những thứ có liên quan tới câu hỏi....Ngoại trừ việc share project thì mới có code nhưng cũng chỉ là share chứ ko thể có 1 câu trả lời tường tận là làm sao họ làm được như thế, cái này chạy như thế nào?? đặt một câu hỏi cho mình là, liệu mình có làm được không, kiến thức của mình đã đủ chưa???

                        Comment


                        • #13
                          Nguyên văn bởi chumanh Xem bài viết
                          đại ka có kiến thức về mạch số, vi điều khiển chứ, vậy việc giáo tiếp với RAM thì có gì khó, mọi người không thể vẽ mạch, viết code từng dòng và giải thích từng chút được, những gì mọi người có thể giúp là đưa ra định hướng cho những câu hỏi để người hỏi tự tìm kiếm những thứ có liên quan tới câu hỏi....Ngoại trừ việc share project thì mới có code nhưng cũng chỉ là share chứ ko thể có 1 câu trả lời tường tận là làm sao họ làm được như thế, cái này chạy như thế nào?? đặt một câu hỏi cho mình là, liệu mình có làm được không, kiến thức của mình đã đủ chưa???
                          oh , mình nhận mình ko biết thì mình mới hỏi mà . Ý mình muốn hỏi là fai làm như thế nào để 89 nó đọc data từ ram ngoài ? Có lẽ kiến thức mình còn gà nên ko biết nhiều , mà đã nhận ko biết thì fai hỏi cho tường tận chứ đúng ko? cần j bạn fai nặng lời thế nhỉ ! '' có tài mà ko có đức thì cũng bỏ "
                          ................. Pleiku .................... GIA LAI ...................

                          Comment


                          • #14
                            Nguyên văn bởi thi tran Xem bài viết
                            oh , mình nhận mình ko biết thì mình mới hỏi mà . Ý mình muốn hỏi là fai làm như thế nào để 89 nó đọc data từ ram ngoài ? Có lẽ kiến thức mình còn gà nên ko biết nhiều , mà đã nhận ko biết thì fai hỏi cho tường tận chứ đúng ko? cần j bạn fai nặng lời thế nhỉ ! '' có tài mà ko có đức thì cũng bỏ "
                            '' có tài mà ko có đức thì cũng bỏ " câu này nên suy nghĩ kỹ trước khi nói nhé !!! ko phải e nặng lời, e chỉ nêu ra cách thức người ta thường giúp như thế! còn topic trên có gì hơi quá thì e xin nhận lỗi. Còn về phuơng pháp đọc data từ RAM ngoài e sẽ vẽ sơ đồ và sử dung C trên KeilC cho anh thấy, OK!:

                            Khai báo mảng dữ liệu theo kiểu:
                            PHP Code:
                            xdata unsigned char ten_mang[số_lượng_lưu_trữ]; 
                            để sử dụng được RAM ngoài, trong Keil-C, vào project->Options for Target(hoặc alt+f7), tại thẻ Target tìm list Memory model: chọn Large: variables in XDATA

                            Xong!

                            Dưới đây là 1 ví dụ, trong ví dụ này e sẽ lấy khai báo dữ liệu ở RAM ngoài sau đó đọc lại nó, đưa ra P1 để hiển thị.

                            PHP Code:
                            #include <reg51.h>

                            /*khai bao bien' trong RAM ngoai`*/
                            xdata unsigned char _external_data 0x12//test value

                            void main()
                            {
                                 
                            P1 _external_data//out to port
                                
                            while(1);          //stop here



                            Diễn đàn là để trao đổi kinh nghiệm, ace ko nên nói năng nhau làm gì !
                            Attached Files

                            Comment


                            • #15
                              Nguyên văn bởi chumanh Xem bài viết
                              '' có tài mà ko có đức thì cũng bỏ " câu này nên suy nghĩ kỹ trước khi nói nhé !!! ko phải e nặng lời, e chỉ nêu ra cách thức người ta thường giúp như thế! còn topic trên có gì hơi quá thì e xin nhận lỗi. Còn về phuơng pháp đọc data từ RAM ngoài e sẽ vẽ sơ đồ và sử dung C trên KeilC cho anh thấy, OK!:

                              Khai báo mảng dữ liệu theo kiểu:
                              PHP Code:
                              xdata unsigned char ten_mang[số_lượng_lưu_trữ]; 
                              để sử dụng được RAM ngoài, trong Keil-C, vào project->Options for Target(hoặc alt+f7), tại thẻ Target tìm list Memory model: chọn Large: variables in XDATA

                              Xong!

                              Dưới đây là 1 ví dụ, trong ví dụ này e sẽ lấy khai báo dữ liệu ở RAM ngoài sau đó đọc lại nó, đưa ra P1 để hiển thị.

                              PHP Code:
                              #include <reg51.h>

                              /*khai bao bien' trong RAM ngoai`*/
                              xdata unsigned char _external_data 0x12//test value

                              void main()
                              {
                                   
                              P1 _external_data//out to port
                                  
                              while(1);          //stop here



                              Diễn đàn là để trao đổi kinh nghiệm, ace ko nên nói năng nhau làm gì !
                              Cái thằng cha này không biết làm được cái trò trống gì mà chưởi om xòm thế nhỉ. Spam khắp diễ đàn ah, có tí RAM thôi mà, chuyện đó làm như to lắm vậy. Đúng là ngu mà còn la làng linh tinh.

                              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