Lỗi không làm sao hiện thị được số lên LCD 16x2

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • havian
    Thành viên chính thức
    • Jun 2011
    • 66

    #1

    Lỗi không làm sao hiện thị được số lên LCD 16x2

    Chào các bác thân mến.
    Mình đang làm cái mạch đo nhiệt độ dùng adc0809 hiện thị lên LCD. Đây là code của mình.
    PHP Code:
                         #include <REGX52.H>
    #include <stdio.H>
    
    //------------Khoi tao bien va cac gia tri gan-------------//
    sbit RS_LCD = P2^5;
    sbit RW_LCD = P2^6;
    sbit E_LCD = P2^7;
    #define lcd_data_pin P0
    sbit ALE= P2^0;
    sbit start = P3^0;
    sbit EOC =P3^1;
    sbit OE= P3^3;
      int num[10];
    //sbit rd = P3^1;
    //sbit wr = P3^2;
    //sbit cs = P3^5;
    
    //---------------Sau day la cac chuong trinh con------------//
    
    //--------------Ham tre khoang thoi gian rat ngan phuc vu viec kiem tr co ban---------------//
    void delay_short()
    {
        unsigned int i;
        for(i=0;i<3;i++);
    }//--------------****------------------//
    
    //------------Ham tre 2---------------//
    void delay(unsigned int time)          // Thoi gian time ms
    {              
        TMOD = 0x01;                    // Timer 0 che do 1
        while (time--)
        {
            TH0 = -1000/256;
            TL0 = -1000%256;
            TR0 = 1;
            while (!TF0);
            TR0 = 0;
            TF0 = 0;
        }
    }
    //-----------------******----------------//
    
    //--------------Ham kiem tra co ban (busy_flag)--------------??
    void kt_ban()                      
    {
        unsigned char x;
        P0 = 0xff;
        RS_LCD = 0;
        RW_LCD = 1;
        do    
        {
            E_LCD = 1;
            delay(50);
            E_LCD = 0;
            x=P0;
            x=x&0x80;
        }
        while(x!=0x80);
    }//-----------*******--------------------// 
    
    //---------------Ham ghi lenh giao tiep voi LCD---------------//
    void LCD_lenh(unsigned char lenh)
    {
        kt_ban();
        delay(50);
        P0 = lenh;
        RS_LCD = 0;                       // Chon thanh ghi lenh
        RW_LCD = 0;                       // Chon che do ghi du lieu tu 8051 vao LCD
        E_LCD = 1;
        delay_short();
        E_LCD = 0;
    }//------------*******-----------------//
    
    //-----------Ham ghi ky tu ra LCD------------//
    void LCD_kytu(unsigned char kytu)
    {
        kt_ban();
        delay(50);
        P0 = kytu;
        RS_LCD = 1;                      // Chon che do doc du lieu tu 8051
        RW_LCD = 0;
        E_LCD =1;
        delay_short();
        E_LCD = 0;
    }//------------*******-----------------//
    
     //-----------Ham ghi nhanh ky tu ra LCD------------//
    
    
    //-----------Ham ghi chuoi ky tu ra LCD------------//    
    void ghi_chuoi(char *str)
    {
        while(*str)
        {
            delay(50);
            ghi_kytu(*str);
            str++;
            
        }
    }//-----------********------------//
    
    //-----------Ham ghi nhanh chuoi ky tu ra LCD------------//    
    
    //-----------************------------//
    
    //-----------Ham ghi so nguyen ra LCD------------//
    
    //-----------Ham khoi tao LCD------------//
    void setting_LCD()
    {
    LCD_lenh(0x38);
        LCD_lenh(0x01);                    // Xoa man hinh
        LCD_lenh(0x02);                 // Co dich hien thi 
    }
    //-----------**********------------//
    void dauvao_adc( unsigned char so)    // cho ADC 0809
    {  
    switch(so)
    { case 0: { P2_3=0; P2_2=0;P2_1=0;break;}
           case 1: { P2_3=0; P2_2=0;P2_1=0; break;}
            case 2: {  P2_3=0;P2_2=1;P2_1=0; break;}
            case 3: {  P2_3=0;P2_2=1;P2_1=1; break;}
            case 4: { P2_3=1;P2_2=0;P2_1=0; break;}
            case 5: {  P2_3=1;P2_2=0;P2_1=1; break;}
            case 6: {  P2_3=1;P2_2=1;P2_1=0; break;}
            case 7: {  P2_3=1;P2_2=1;P2_1=1; break;}
            }
            }
    
     void lcd_data(unsigned int i)     //Function to send data on LCD
    {   int p,c;
    int k=0;
    while(i>0)
    {
      num[k]=i%10;
      i=i/10;
      k++;
    }
    k--;
    for (p=k;p>=0;p--)
    { kt_ban();
      c=num[p]+48;
      lcd_data_pin = c;
      RW_LCD = 0;
      RS_LCD = 1;
      E_LCD = 1;
      delay(1);
      E_LCD = 0;
    }}
    /*********************************/
    /* CON DAY LA CHUONG TRINH CHINH */
    /* ----------??????--------------*/
    /*********************************/
    
    void main(void)
    {  
        float v;
        //char chuoi[32];
        unsigned char x;
        setting_LCD();
        LCD_lenh(0x01);
        LCD_lenh(0x0c);
        ghi_chuoi(" MACH DO NHIET DO");
        LCD_lenh(0x0c);
        LCD_lenh(0xc0);
        ghi_chuoi(" HIEN THI LCD" );
         ALE=0;
        start=0;
       OE=1;
        while(1)
        {  dauvao_adc(0);
         ALE=1;
         delay(2);
         ALE=0;
         start=1;
         delay(1);
         start=0;
         while( EOC==1)
          { OE=0;
        
                
                x=P1;
                v=(float)x;
                LCD_lenh(0x01);
                ghi_chuoi("Dien ap = ");
                LCD_lenh(0x0c);
                LCD_lenh(0xc0);
                lcd_data(23); // gia su nhiet do la 23 do C
                //lcs_data(x);
                delay(300);
        }
        }
          } 
    

    Nhưng không hiểu sao hiện thị kí tự thì vô tư, nhưng mà hiện thị số đoạn cuối thì chả lên cái gì cả( đã làm mạch thật rồi). Thử mô phong lại trên protues xem thế nào thì đến đoạn cuối nó báo thế này: " controller reveived command whilst busy" liên tục cả nghìn cái( bó tay).

    Các bác " chịu khó " giúp mình với, gận 3 ngày nay dậm chân tại chỗ đoạn này rồi.
  • thinking
    Thành viên chính thức
    • Mar 2010
    • 91

    #2
    bạn cần chuyển đổi số sang mã acsi ,tách ra từng hàng trăm,chục,đơn vi rồi +0x30 vào

    Comment

    • havian
      Thành viên chính thức
      • Jun 2011
      • 66

      #3
      PHP Code:
      void lcd_data(unsigned int i)     //Function to send data on LCD
      {   int p,c;
      int k=0;
      while(i>0)
      {
        num[k]=i%10;
        i=i/10;
        k++;
      }
      k--;
      for (p=k;p>=0;p--)
      { kt_ban();
        c=num[p]+48;
        lcd_data_pin = c;
        RW_LCD = 0;
        RS_LCD = 1;
        E_LCD = 1;
        delay(1);
        E_LCD = 0;
      }} 
      
      Thì nó đây chứ đâu hả bác, nhưng nó cứ im phăng phắc.

      Comment

      • baeyongbien
        Thành viên mới
        • May 2012
        • 3

        #4
        void lcd_data(unsigned int i) //Function to send data on LCD
        { int p,c;
        int k=0;
        while(i>0)
        {
        num[k]=i%10;
        i=i/10;
        k++;
        }
        k--;
        for (p=k;p>=0;p--)
        { kt_ban();
        c=num[p]+48;
        lcd_data_pin = c;
        RW_LCD = 0;
        RS_LCD = 1;
        E_LCD = 1;
        delay(1);
        E_LCD = 0;
        }}
        bạn cho lên delay(20); hoặc delay(50); xem được ko

        Comment

        • havian
          Thành viên chính thức
          • Jun 2011
          • 66

          #5
          Mình đã cho delay tận 100 rồi ấy chứ, nhưng nó cứ lác lác thế nào ý. Không hiện nổi số.

          Comment

          • bienhou
            Thành viên tích cực
            • Dec 2011
            • 971

            #6
            Nguyên văn bởi baeyongbien Xem bài viết
            void lcd_data(unsigned int i) //Function to send data on LCD
            { int p,c;
            int k=0;
            while(i>0)
            {
            num[k]=i%10;
            i=i/10;
            k++;
            }
            k--;
            for (p=k;p>=0;p--)
            { kt_ban();
            c=num[p]+48;
            lcd_data_pin = c;
            RW_LCD = 0;
            RS_LCD = 1;
            E_LCD = 1;
            delay(1);
            E_LCD = 0;
            }}
            bạn cho lên delay(20); hoặc delay(50); xem được ko
            phải để num[p+ 48] nhé bạn
            Nguyễn Huy Biên - 01649 802 694
            gmail :

            Comment

            • rptdnmqs
              Thành viên tích cực
              • Nov 2008
              • 440

              #7
              ai bao la num[p+48].sua lai cai int p,k,c; thanh char k,c; signed char p;
              Ban thu gui chu xong roi gui so roi gui chu xem.nhu vay moi biet duoc.co' the cai lenh write len lcd no' bi sai o ham nay day'.
              , , ,

              Comment

              • havian
                Thành viên chính thức
                • Jun 2011
                • 66

                #8
                PHP Code:
                int num[10]; 
                
                Bác bienhou ơi, mảng của em chỉ có đến 10 thôi, lấy đâu ra tận tới 48+

                rptdnmqs

                ai bao la num[p+48].sua lai cai int p,k,c; thanh char k,c; signed char p;
                Ban thu gui chu xong roi gui so roi gui chu xem.nhu vay moi biet duoc.co' the cai lenh write len lcd no' bi sai o ham nay day'.
                Em chỉnh theo của bác rồi, có chút tiến triển là nó không lác nữa nhưng nó hiện ra thế này
                PHP Code:
                 Dien ap = 
                          // 
                
                Nó lại hiện ra kí tự "/" cho mỗi chữ số ( 1 số thì 1 /; 2 số thì // ) chuối quá!

                Comment

                • rptdnmqs
                  Thành viên tích cực
                  • Nov 2008
                  • 440

                  #9
                  sua luon cai int num[10]; thanh char num[10];
                  , , ,

                  Comment

                  • tdm
                    Thành viên tích cực
                    • Sep 2005
                    • 349

                    #10
                    Nguyên văn bởi havian Xem bài viết
                    Chào các bác thân mến.
                    Mình đang làm cái mạch đo nhiệt độ dùng adc0809 hiện thị lên LCD. Đây là code của mình.
                    PHP Code:
                                         #include <REGX52.H>
                    #include <stdio.H>
                    
                    //------------Khoi tao bien va cac gia tri gan-------------//
                    sbit RS_LCD = P2^5;
                    sbit RW_LCD = P2^6;
                    sbit E_LCD = P2^7;
                    #define lcd_data_pin P0
                    sbit ALE= P2^0;
                    sbit start = P3^0;
                    sbit EOC =P3^1;
                    sbit OE= P3^3;
                      int num[10];
                    //sbit rd = P3^1;
                    //sbit wr = P3^2;
                    //sbit cs = P3^5;
                    
                    //---------------Sau day la cac chuong trinh con------------//
                    
                    //--------------Ham tre khoang thoi gian rat ngan phuc vu viec kiem tr co ban---------------//
                    void delay_short()
                    {
                        unsigned int i;
                        for(i=0;i<3;i++);
                    }//--------------****------------------//
                    
                    //------------Ham tre 2---------------//
                    void delay(unsigned int time)          // Thoi gian time ms
                    {              
                        TMOD = 0x01;                    // Timer 0 che do 1
                        while (time--)
                        {
                            TH0 = -1000/256;
                            TL0 = -1000%256;
                            TR0 = 1;
                            while (!TF0);
                            TR0 = 0;
                            TF0 = 0;
                        }
                    }
                    //-----------------******----------------//
                    
                    //--------------Ham kiem tra co ban (busy_flag)--------------??
                    void kt_ban()                      
                    {
                        unsigned char x;
                        P0 = 0xff;
                        RS_LCD = 0;
                        RW_LCD = 1;
                        do    
                        {
                            E_LCD = 1;
                            delay(50);
                            E_LCD = 0;
                            x=P0;
                            x=x&0x80;
                        }
                        while(x!=0x80);
                    }//-----------*******--------------------// 
                    
                    //---------------Ham ghi lenh giao tiep voi LCD---------------//
                    void LCD_lenh(unsigned char lenh)
                    {
                        kt_ban();
                        delay(50);
                        P0 = lenh;
                        RS_LCD = 0;                       // Chon thanh ghi lenh
                        RW_LCD = 0;                       // Chon che do ghi du lieu tu 8051 vao LCD
                        E_LCD = 1;
                        delay_short();
                        E_LCD = 0;
                    }//------------*******-----------------//
                    
                    //-----------Ham ghi ky tu ra LCD------------//
                    void LCD_kytu(unsigned char kytu)
                    {
                        kt_ban();
                        delay(50);
                        P0 = kytu;
                        RS_LCD = 1;                      // Chon che do doc du lieu tu 8051
                        RW_LCD = 0;
                        E_LCD =1;
                        delay_short();
                        E_LCD = 0;
                    }//------------*******-----------------//
                    
                     //-----------Ham ghi nhanh ky tu ra LCD------------//
                    
                    
                    //-----------Ham ghi chuoi ky tu ra LCD------------//    
                    void ghi_chuoi(char *str)
                    {
                        while(*str)
                        {
                            delay(50);
                            ghi_kytu(*str);
                            str++;
                            
                        }
                    }//-----------********------------//
                    
                    //-----------Ham ghi nhanh chuoi ky tu ra LCD------------//    
                    
                    //-----------************------------//
                    
                    //-----------Ham ghi so nguyen ra LCD------------//
                    
                    //-----------Ham khoi tao LCD------------//
                    void setting_LCD()
                    {
                    LCD_lenh(0x38);
                        LCD_lenh(0x01);                    // Xoa man hinh
                        LCD_lenh(0x02);                 // Co dich hien thi 
                    }
                    //-----------**********------------//
                    void dauvao_adc( unsigned char so)    // cho ADC 0809
                    {  
                    switch(so)
                    { case 0: { P2_3=0; P2_2=0;P2_1=0;break;}
                           case 1: { P2_3=0; P2_2=0;P2_1=0; break;}
                            case 2: {  P2_3=0;P2_2=1;P2_1=0; break;}
                            case 3: {  P2_3=0;P2_2=1;P2_1=1; break;}
                            case 4: { P2_3=1;P2_2=0;P2_1=0; break;}
                            case 5: {  P2_3=1;P2_2=0;P2_1=1; break;}
                            case 6: {  P2_3=1;P2_2=1;P2_1=0; break;}
                            case 7: {  P2_3=1;P2_2=1;P2_1=1; break;}
                            }
                            }
                    
                     void lcd_data(unsigned int i)     //Function to send data on LCD
                    {   int p,c;
                    int k=0;
                    while(i>0)
                    {
                      num[k]=i%10;
                      i=i/10;
                      k++;
                    }
                    k--;
                    for (p=k;p>=0;p--)
                    { kt_ban();
                      c=num[p]+48;
                      lcd_data_pin = c;
                      RW_LCD = 0;
                      RS_LCD = 1;
                      E_LCD = 1;
                      delay(1);
                      E_LCD = 0;
                    }}
                    /*********************************/
                    /* CON DAY LA CHUONG TRINH CHINH */
                    /* ----------??????--------------*/
                    /*********************************/
                    
                    void main(void)
                    {  
                        float v;
                        //char chuoi[32];
                        unsigned char x;
                        setting_LCD();
                        LCD_lenh(0x01);
                        LCD_lenh(0x0c);
                        ghi_chuoi(" MACH DO NHIET DO");
                        LCD_lenh(0x0c);
                        LCD_lenh(0xc0);
                        ghi_chuoi(" HIEN THI LCD" );
                         ALE=0;
                        start=0;
                       OE=1;
                        while(1)
                        {  dauvao_adc(0);
                         ALE=1;
                         delay(2);
                         ALE=0;
                         start=1;
                         delay(1);
                         start=0;
                         while( EOC==1)
                          { OE=0;
                        
                                
                                x=P1;
                                v=(float)x;
                                LCD_lenh(0x01);
                                ghi_chuoi("Dien ap = ");
                                LCD_lenh(0x0c);
                                LCD_lenh(0xc0);
                                lcd_data(23); // gia su nhiet do la 23 do C
                                //lcs_data(x);
                                delay(300);
                        }
                        }
                          } 
                    

                    Nhưng không hiểu sao hiện thị kí tự thì vô tư, nhưng mà hiện thị số đoạn cuối thì chả lên cái gì cả( đã làm mạch thật rồi). Thử mô phong lại trên protues xem thế nào thì đến đoạn cuối nó báo thế này: " controller reveived command whilst busy" liên tục cả nghìn cái( bó tay).

                    Các bác " chịu khó " giúp mình với, gận 3 ngày nay dậm chân tại chỗ đoạn này rồi.
                    code chạy bình thường .(chỉ thiếu r kéo lên tại port_0)
                    Attached Files
                    |

                    Comment

                    • havian
                      Thành viên chính thức
                      • Jun 2011
                      • 66

                      #11
                      Hic.Không có trở thanh 10k thì làm sao mà hiển thị được( tất nhiên là em có rồi).
                      Click image for larger version

Name:	Untitled.jpg
Views:	1
Size:	103.1 KB
ID:	1375055
                      Mà cả cái mạch thật của em cũng y như vầy.Liệu có lưu ý gì thêm không bác.

                      Comment

                      • havian
                        Thành viên chính thức
                        • Jun 2011
                        • 66

                        #12
                        Thank các bác, em hiện thị được rồi.Em vứt cái project cũ đi, lập cái project mới toanh, copy lại code thì nạp vao chip lại chạy ngon ơ( đúng là bó tay).

                        Comment

                        • thinking
                          Thành viên chính thức
                          • Mar 2010
                          • 91

                          #13
                          hài nhỉ ,phần mềm lậu nên thế

                          Comment

                          Về tác giả

                          Collapse

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

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

                          Collapse

                          Đang tải...