Thông báo

Collapse
No announcement yet.

Cần giúp đỡ về lập trinh ic 89 với 74HC595

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

  • Cần giúp đỡ về lập trinh ic 89 với 74HC595

    Chào các bác, em mới tập lập trình nên còn mù mờ lắm
    Tình hình lá thế này, mấy ngày qua em đang đau đầu về cái chạy chữ matrix đơn giản dùng 1 ic 89C52, 2 ic 595, 2 cái led 8x8 mà làm hoài không xong, tham khảo đủ chỗ vẫn vậy . Có vài vấn đề em còn mù mờ lắm, vì vậy em xin các bác vui lòng giải thích cho em hiểu cái nha
    1. làm sao để gom 2 byte riêng rẽ (mỗi byte 8 bit) thành 2 byte chung với nhau (dãy 16 bit) vd: 0xfe và 0x7f thành 0xfe7f ??? à, viết bằng Keil C nha các bác.
    2. em đã cố gắng làm thử nhưng kết quả là cứ bị 'DATA': SEGMENT TOO LARGE là như thế nào vậy các bác? mong các bác xem và ráng dành chút thời gian quý báu giúp dùm em khỏi mất ngủ trong những ngày tới .code cua em đây các bác
    #include <REGX52.H>
    sbit DAT = P2^0;
    sbit SCK = P2^1;
    sbit LACH = P2^2;
    int n;
    void delay(int ms)
    {for(n=0;n<ms;n++)
    {;}}
    void xuatdulieu(unsigned char x,unsigned char y)
    {
    unsigned long i,temp;
    temp=(x<<8)|y;
    temp=temp&0x8000;
    for(i=0;i<16;i++)
    {
    if(temp==0x8000)
    {DAT=1;}
    else
    {DAT=0;}
    SCK=0;
    SCK=1;
    temp*=2;
    }
    LACH=0;
    LACH=1;
    }
    unsigned int hang[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
    unsigned long cot1[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x0 0,0xf9,0xf3,0xe7,0xcf,0x00,0x00,0xff,0xe7,0xe7,0xe 7,0xff,0xfd,0xfd,0xfd,0xff,0xff,0xff,0xff,0xff,0xf f,0xff,0xff};
    unsigned long cot2[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf f,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0xf9,0xf 3,0xe7,0xcf,0x00,0x00,0xff,0xe7,0xe7,0xe7,0xff,0xf d,0xfd,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf f};
    void main()
    {
    int m=0;
    int j,p;
    while(1)
    {
    for(j=0;j<8;j++)
    {
    P3=hang[j];delay(2);
    p=j+m;
    xuatdulieu(cot1[p],cot2[p]);
    delay(10);
    }
    m++;
    if(m==40)
    m=0;
    }
    }

    Xin các bác chỉ rõ chỗ sai và fix nó lại dùm em nha. em xin đa tạ

  • #2
    Nguyên văn bởi phanbanhut Xem bài viết
    Chào các bác, em mới tập lập trình nên còn mù mờ lắm
    Tình hình lá thế này, mấy ngày qua em đang đau đầu về cái chạy chữ matrix đơn giản dùng 1 ic 89C52, 2 ic 595, 2 cái led 8x8 mà làm hoài không xong, tham khảo đủ chỗ vẫn vậy . Có vài vấn đề em còn mù mờ lắm, vì vậy em xin các bác vui lòng giải thích cho em hiểu cái nha
    1. làm sao để gom 2 byte riêng rẽ (mỗi byte 8 bit) thành 2 byte chung với nhau (dãy 16 bit) vd: 0xfe và 0x7f thành 0xfe7f ??? à, viết bằng Keil C nha các bác.
    2. em đã cố gắng làm thử nhưng kết quả là cứ bị 'DATA': SEGMENT TOO LARGE là như thế nào vậy các bác? mong các bác xem và ráng dành chút thời gian quý báu giúp dùm em khỏi mất ngủ trong những ngày tới .code cua em đây các bác

    Xin các bác chỉ rõ chỗ sai và fix nó lại dùm em nha. em xin đa tạ
    chào em.
    em không nên viết hàm dịch 595 dạng 16 bít vì mở rộng thêm 595 rất khó.
    viết theo dạng dịch 8bit thôi . tham khảo thử code sau:
    Code:
        #include <REGX52.H>
    sbit data1=P2^0;
    sbit SCK=P2^1;
    sbit CL=P2^2;
    const unsigned char hang[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
    const unsigned char cot1[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0xf9,0xf3,0xe7,0xcf,0x00,0x00,0xff,0xe7,0xe7,0xe7,0xff,0xfd,0xfd,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
    const unsigned char cot2[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0xf9,0xf3,0xe7,0xcf,0x00,0x00,0xff,0xe7,0xe7,0xe7,0xff,0xfd,0xfd,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
    int n;
    int m=0;
    int j,p,toc_do_dich;
    void delay(int ms)
    {for(n=0;n<ms;n++)
    {;}}
    xuatdulieu(unsigned char k)
    {
    unsigned char i,tem;
    for(i=0;i<=7;i++)
    {
    tem=k;
    tem=tem&0x80;
    if(tem==0x80)
    data1=1;
    else
    data1=0;
    k*=2;
    SCK=0;
    SCK=1;
    }
    }
    void chot()
    {
    CL=0;
    CL=1;
    }
    
    void main()
    {
    CL=1;
    SCK=1;
    while(1)
    {
    for(toc_do_dich=0;toc_do_dich<20;toc_do_dich++)
    {
    for(j=0;j<8;j++)
    {
    P3=hang[j];
    p=j+m;
    xuatdulieu(cot1[p]);
    xuatdulieu(cot2[p]);
    chot();
    delay(10);
    }
    }
    m++;
    if(m==40)
    m=0;
    }
    }
    |

    Comment


    • #3
      Nguyên văn bởi tdm Xem bài viết
      chào em.
      em không nên viết hàm dịch 595 dạng 16 bít vì mở rộng thêm 595 rất khó.
      viết theo dạng dịch 8bit thôi . tham khảo thử code sau:
      vâng ạ, để em thử xem, hì, cảm ơn anh nhiều lắm!

      Comment


      • #4
        Con 8051 được có mấy byte sram mà bạn khai báo 1 đống byte thế kia thì nó báo lỗi rồi.Bạn nên khai báo mã trên ROM.
        unsigned char code Data[]={...};
        char code Data[]={...};
        đừng lạm dụng biến vượt quá 8 bit nhé.Phải hiểu 8051 là VĐK 8 bit.Nên những số trên 8 bit thì tốc độ tính toán giảm đó nha.
        , , ,

        Comment


        • #5
          Nguyên văn bởi rptdnmqs Xem bài viết
          Con 8051 được có mấy byte sram mà bạn khai báo 1 đống byte thế kia thì nó báo lỗi rồi.Bạn nên khai báo mã trên ROM.
          unsigned char code Data[]={...};
          char code Data[]={...};
          đừng lạm dụng biến vượt quá 8 bit nhé.Phải hiểu 8051 là VĐK 8 bit.Nên những số trên 8 bit thì tốc độ tính toán giảm đó nha.
          hì, em mù mờ cái này quá, nhưng đúng là khi em dùng hàm delay() với khai báo biến như sau:
          Code:
          void delay(unsigned long ms)
          {
          unsigned long n;
          for(n=0;n<ms<n++)
          {;}
          }
          thì thời gian delay chậm hơn nhiều so với khai báo biến n,ms là int???
          như vậy việc khai báo biến ảnh hưởng đến tốc độ xử lý của ic hả bác?
          hix, bác hay có bác nào biết giải thích tường tận dùng em vụ này với, và phải khai báo sao cho đúng?

          p/s: cảm ơn bác tdm một lần nữa vì đã giúp đỡ em

          Comment


          • #6
            Tổng thống + điện = Ăn mày + điện = die => Tổng thống = ăn mày

            Comment

            Về tác giả

            Collapse

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

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

            Collapse

            • bqviet
              Trả lời cho Đấu tắt điện cho máy tính bảng
              bởi bqviet
              Bqv cáo lỗi vì chưa đủ khả năng diễn giải để người đọc hiểu. Người làm kỹ thuật sâu đôi khi như thế đó. Về việc nạp pin không vào dù cell mới, khả năng cái mạch quản lý đó đã hỏng - cũng chính là nguyên nhân đám cell cũ hỏng từ đầu.
              06-12-2025, 17:17
            • nguyendinhvan
              Trả lời cho Xin hỏi về mạch thu FM/AM trong catsette
              bởi nguyendinhvan
              Theo tôi, nó chỉ là cái Tuy- ê - nơ, hoặc là khối Trung Văn Tần, nó một phần trong cái Da đì ô thôi. Vì có thấy một chỗ có ba chân hàn, giiống như chân Cờ rít sờ tăng 455 ki nô hẹc. Còn khối Tuy ê nơ thì không nhìn thây cái Di ốt Va di cáp...
              05-12-2025, 19:59
            • afrendly
              Trả lời cho Đấu tắt điện cho máy tính bảng
              bởi afrendly
              Có vẻ ngoài hiểu biết của mình rồi. Cuối cùng mình quyết định tìm mua 2 pin trên Shopee, giá 200K thay vào. Tuy nhận pin được 1%, sạc mãi không vào nhưng cũng mở được máy lên. Vậy cũng tạm. Cảm ơn bạn đã hỗ trợ nhé....
              04-12-2025, 01:27
            • nick22
              Trả lời cho Máy điện châm ?
              bởi nick22
              Đúng như bạn nói, máy điện châm hiện nay trên thị trường đã khá đa dạng về mẫu mã, chức năng và giá thành.
              01-12-2025, 13:23
            Đang tải...
            X