Thông báo

Collapse
No announcement yet.

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

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

  • 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 ALEP2^0;
    sbit start P3^0;
    sbit EOC =P3^1;
    sbit OEP3^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_adcunsigned char so)    // cho ADC 0809
    {  
    switch(
    so)
    { case 
    0: { P2_3=0P2_2=0;P2_1=0;break;}
           case 
    1: { P2_3=0P2_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.

  • #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


    • #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


      • #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


        • #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


          • #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


            • #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


              • #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


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

                  Comment


                  • #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 ALEP2^0;
                    sbit start P3^0;
                    sbit EOC =P3^1;
                    sbit OEP3^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_adcunsigned char so)    // cho ADC 0809
                    {  
                    switch(
                    so)
                    { case 
                    0: { P2_3=0P2_2=0;P2_1=0;break;}
                           case 
                    1: { P2_3=0P2_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


                    • #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


                      • #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


                        • #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...
                          X