Thông báo

Collapse
No announcement yet.

Hỏi về cách chuyển đổi số hex sang số thập phân để hiển thị lên lcd.

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

  • Hỏi về cách chuyển đổi số hex sang số thập phân để hiển thị lên lcd.

    Bác nào biết về vấn đề này giúp em với. Em đang cần gấp.
    Giả sử sau khi chuyển đổi em có số hex là 7F4. Giờ em muốn nó hiển thị lên lcd dưới dạng thập phân.
    Ah nếu có thể cho em chỉ dẫn với code C nhé
    Mỗi ngày là một món quà mà cuộc sống đã ban tặng cho chúng ta

  • #2
    chia cho 10, theo kiểu tách lấy cơ số.

    Comment


    • #3
      #include <REGX51.H>
      #include <string.h>
      #define LCDdata P2
      sbit rs=P1^0;
      sbit rw=P1^1;
      sbit en=P1^2;
      sbit BF=0xA7;
      void delay(long time)
      {long n;
      for(n=0;n<time;n++)
      {
      ;
      }
      }
      void lcd_wait()
      {long n=0;
      en=1;
      rs=0; //ghi lenh
      rw=1; // doc dl
      LCDdata=0xff;
      while(BF) // bit ban
      {n++;if(n>100)break;
      }
      en=0;
      rw=0;
      }
      void lcd_control(unsigned char x)
      {en=1;
      rs=0;
      rw=0;
      LCDdata=x;
      en=0;
      lcd_wait();
      }
      void lcd_init()
      {
      lcd_control(0x30);
      lcd_control(0x30);
      lcd_control(0x30);
      lcd_control(0x38);
      lcd_control(0x0c);
      lcd_control(0x06);
      lcd_control(0x01);
      }
      void lcd_writedata(unsigned char c)
      {
      rs=1;
      rw=0;
      LCDdata=c;
      en=1;
      en=0;
      delay(1000);
      }
      void lcd_write()
      {unsigned char i;
      en=1;
      rs=1;
      rw=0;
      LCDdata=i;
      en=0;
      lcd_wait();
      }
      void lcd_puts(unsigned char *s)
      {
      while (*s)
      {
      lcd_writedata(*s);
      s++;
      }
      }
      void main()
      {char x;
      lcd_init();
      lcd_puts("Nguyen Huy Bien");
      delay(3000);
      lcd_control(0xC0+3);
      lcd_puts("Lop K12D");
      delay(3000);
      while(1);
      }





      mình có cái này bạn tham khảo
      Nguyễn Huy Biên - 01649 802 694
      gmail :

      Comment


      • #4
        chia 1000, 100, 10 ( hoặc lớn hơn), tóm lại là chia, tách lấy các số, sau đó cộng thêm 30H, rồi tống lên LCD

        Comment


        • #5
          void lcd_hienthi(unsigned int value)
          {
          unsigned char ng,tr,ch,dv;

          ng = value/1000;
          tr = (value%1000)/100;
          ch = (value%100)/10;
          dv = value%10;

          lcd_ctr(0x88);
          lcd_data(ng+0x30);
          lcd_data(tr+0x30);
          lcd_data(ch+0x30);
          lcd_data(dv+0x30);
          }


          Bạn tham khảo nhé.

          Comment


          • #6
            Các bác xem gium em đoạn code sau nhe. Em làm vậy mà vẫn chưa hiển thị đúng được. Trong bài nay em chuyển đổi ADC 12 bít rồi hiển thị LCD. Rất mong nhận được sự tư vấn của mọi người. Thanks!
            Last edited by fanazon; 28-05-2012, 21:39. Lý do: #include <reg51.h> #include <INTRINS.H> #include <STDIO.H> #include<string.h> // define P2.0 to check STATUS. sbit RS=P2^0;
            Mỗi ngày là một món quà mà cuộc sống đã ban tặng cho chúng ta

            Comment


            • #7
              Các bác xem gium em đoạn code sau nhe. Em làm vậy mà vẫn chưa hiển thị đúng được. Trong bài nay em chuyển đổi ADC 12 bít rồi hiển thị LCD. Rất mong nhận được sự tư vấn của mọi người. Thanks!
              #include <reg51.h>
              #include <INTRINS.H>
              #include <STDIO.H>
              #include<string.h>
              // define P2.0 to check STATUS.
              sbit RS=P2^0;
              sbit RW=P2^1;
              sbit EN= P2^2;
              //RS=0 => code
              //RS=1 => data
              #define LCD_PORT P1
              sbit STATUS = P2^4;
              sbit BF = 0x97;

              unsigned char xdata CTRL _at_ 0x2FFF;
              unsigned char xdata ADSEL _at_ 0x4FFF;
              unsigned char hByte;
              unsigned char lByte;
              unsigned char digit1,digit2,digit3,digit4;
              void wait(void) // Hàm kim tra LCD có bn hay không:
              {
              long n = 0;
              EN=1;// Dua chan cho fep len cao
              RS=0;// Chon thanh ghi lenh
              RW=1;// Doc tu LCD
              LCD_PORT=0xFF;// Gia tri 0xFF
              while(BF){n++; if(n>100) break;}// Kiem tra co ban
              // Neu ban dem n den 100 roi thoat khoi while
              EN=0;// Dua xung cao xuong thap de chot
              RW=0;// Doc tu LCD
              }


              //////================================================== ============

              void LCDcontrol(unsigned char x) //Hàm iu khin LCD thc hin 1 lnh:
              {
              wait();// Doi LCD san sang
              LCD_PORT=x;// Gia tri x
              RS=0;// Chon thanh ghi lenh
              RW=0;// Ghi len LCD
              EN=1;// Dua chan cho fep len cao
              EN=0;// Xung cao xuong thap

              }
              //================================================== ====================
              void delay_ms()
              {
              int i=1;
              while(1)
              {


              i=i+1;
              EA=0;// ko cho phep ngat toan cuc
              ET0=1;//cho phep ngat timer 0
              TMOD=0x01;//chon che do 16 bit
              TL0=0xAF; //nap gia tri 8=10101111 bit thap trong 16 bit cao = 111100.10101111=15535=2^16-50000mF s
              TH0=0x3C;//nap gia tri 8=111100 bit cao trong 16 bit cao = 111100.10101111=15535=2^16-50000mF s
              EA=1;// cho pheo ngat toan cuc
              TR0=1;//chay timer 1
              while(1)
              {
              if(TF0==1)
              {
              TF0=0;
              TR0=0;
              break;
              }

              }
              if(i==20)//lap 2 s=40.50000mF s
              {
              break;}

              }
              }
              //---------------------------------------------
              //--------------------------------------------

              void delay(long time) //Hàm tre;
              {
              long n;
              for(n=0;n<time;n++) ;
              }
              //--------------------------------------------
              void LCDinit(void) //Hàm kh)i t o LCD:
              {
              LCDcontrol(0x38);// 2 dong va ma tran 5x7
              delay_ms();
              delay_ms();
              LCDcontrol(0x0E);// Bat con tro
              delay_ms();
              delay_ms();
              LCDcontrol(0x01);// Xoa man hinh
              delay_ms();
              delay_ms();
              LCDcontrol(0x06);// Tang con tro xang fai
              delay_ms();
              delay_ms();
              }
              //================================================== ====================


              void LCDwrite(unsigned char c) //Hàm lnh cho LCD hin th 1 kí t :
              {
              wait();// Cho
              EN=1;// Cho fep muc cao
              RS=1;// Ghi du lieu
              RW=0;// Ghi len LCD
              LCD_PORT=c;// Gia tri C
              EN=0;// Xung cao xuong thap

              }

              //================================================== ====================


              void LCDputs(unsigned char *s,unsigned char row) //Hàm lnh cho LCD hin th 1 xâu kí t ( dòng ch&):
              {
              unsigned char len;
              if(row==1) LCDcontrol(0x80);// Ep con tro ve dau dong 1
              else LCDcontrol(0xC0);// Ep con tro ve dau dong 2
              len=strlen(s);// Lay do dai bien duoc tro boi con tro
              while(len!=0)// Khi do dai van con
              {
              LCDwrite(*s);// Ghi ra LCD gia tri duoc tro boi con tro
              s++;// Tang con tro
              len--;// Tru do dai
              }
              }

              //================================================== =====================


              void LCDwritei(unsigned int t) //Hàm hin th 1 s integer:
              {
              unsigned char v;


              if(t<10)
              { LCDwrite(t+48);
              }else if(t<100){
              LCDwrite(t/10+48);
              LCDwrite(t%10+48);
              }else{
              v=t/10;
              LCDwrite(v/10+48);
              LCDwrite(v%10+48);
              LCDwrite(t%10+48);
              }
              }


              void adc_Convert (void)
              { // Start a conversion with A0 and A/$C$ low.
              // The convesion takes place on rising CE edge.
              CTRL = 0x00;
              ADSEL = 0x00;
              // Wait until we have completed a conversion .
              while(STATUS==1);
              // Set R/$C$ with A0 low and read the low byte.
              CTRL = 0x02;
              hByte = ADSEL;
              // Set R/$C$ with A0 high and read the high.
              CTRL = 0x03;
              lByte = ADSEL;
              }


              void main(void)
              { unsigned int delay1, MSB , LSB, adc_Res,temp;
              LCDinit();
              // Initialize serial interface

              while(1)
              { adc_Convert();
              MSB=(unsigned int)(hByte << 4);
              LSB=(unsigned int)(lByte >> 4);
              // adc_Res now has the converted data with 12-bit resolution.
              adc_Res = MSB + LSB;
              LCDcontrol(0x01);
              LCDcontrol(0x80);
              LCDputs("GIATRIHEX ",1);
              LCDwritei(MSB);
              LCDwritei(LSB);
              //delay_ms()
              //LCDcontrol(0x0C);
              // temp = temp/52;
              // tinh ra dien ap tu gia tri ADC dua ve
              // tach phan nguyen va phan thap phan
              digit1 = (unsigned char) (adc_Res/1000);
              adc_Res = (unsigned char)(adc_Res%1000);
              digit2 = (unsigned char) (adc_Res/100);
              adc_Res = (unsigned char)(adc_Res%100);
              digit3 = (unsigned char) (adc_Res/10);
              digit4 = (unsigned char)(adc_Res%10);
              // chuyen sang ma ASCII
              // digit1 = digit1 + 0x30;
              // digit2 = digit2 + 0x30;
              // digit3 = digit3 + 0x30;
              // digit4 = digit4 + 0x30;
              LCDputs("Nhietdo2:",2);
              LCDwritei(digit1);
              LCDwritei(digit2);
              LCDwritei(digit3);
              LCDwritei(digit4);
              delay_ms();
              // Send adc results to the serial interface

              // simple delay - it is mcu clock dependent !
              for (delay1=0; delay1<10000; delay1++)
              ;
              }
              }
              Mỗi ngày là một món quà mà cuộc sống đã ban tặng cho chúng ta

              Comment


              • #8
                trong chương trình hiển thị LCD của bác, sao lại cộng thêm 48 nhỉ, còn so sánh có lớn hơn 10 hay không,
                trong khi đó trong chương trình chính đã tách số, rồi chuyển sang ASCII để hiện thị rồi,
                với lại trong chương trình chính của bác sao lại chơi trò ép chuyển kiểu nhỉ,
                giả sử cái adc_Res%1000 nó lớn hơn 256, mà bác ép về (unsigned char), thì nó sẽ lấy sai giá trị rồi,
                tóm lại là bác nên kiểm tra từng phần của chương trình, kiểm tra xem LCD hiển thị thế nào, đúng chưa, cho giá trị const vào hàm hiển thị xem hiển thị đúng không,
                rồi kiểm tra xem chuyển đổi ADC đúng chưa,
                sau đó thực hiện chia để lấy cơ số và hiển thị xem thế nào,
                bác cứ từng bước mà chiến, (chia nhỏ mà trị), rồi ra thôi, chứ bác làm một phát dài đến mỏi tay, rồi không chạy, không đứt giây thần kinh mới lạ.

                chúc bác làm lại ngon lành,

                Comment


                • #9
                  à quên, cái hàm delay của bác dùng timer mà bác bật cả bit EA và ET0, như thế là dùng ngắt timer rồi, nên bác không phải cố đợi TF0 đâu,

                  Comment


                  • #10
                    bạn xem lại bảng mã ACSI thì biết vì sao lại cộng thêm 48 nhé
                    Nguyễn Huy Biên - 01649 802 694
                    gmail :

                    Comment


                    • #11
                      quên mất 30h là 48d,
                      nhưng dù sao thì với chương trình trền, đã cộng 48 vào rồi, lại chêm thêm 30h thì thành...

                      Comment


                      • #12
                        Bạn sửa đoạn này
                        Nguyên văn bởi fanazon Xem bài viết
                        digit1 = (unsigned char) (adc_Res/1000);
                        adc_Res = (unsigned char)(adc_Res%1000);
                        digit2 = (unsigned char) (adc_Res/100);
                        adc_Res = (unsigned char)(adc_Res%100);
                        digit3 = (unsigned char) (adc_Res/10);
                        digit4 = (unsigned char)(adc_Res%10);
                        // chuyen sang ma ASCII
                        // digit1 = digit1 + 0x30;
                        // digit2 = digit2 + 0x30;
                        // digit3 = digit3 + 0x30;
                        // digit4 = digit4 + 0x30;
                        LCDputs("Nhietdo2:",2);
                        LCDwritei(digit1);
                        LCDwritei(digit2);
                        LCDwritei(digit3);
                        LCDwritei(digit4);
                        }
                        thành như sau thử xem :
                        Nguyên văn bởi fanazon Xem bài viết
                        LCDputs("Nhietdo2:",2);
                        LCDwrite((adc_Res/1000)+48);
                        LCDwrite(((adc_Res%1000)/100)+48);
                        LCDwrite((((adc_Res%1000)%100)/10)+48);
                        LCDwrite((((adc_Res%1000)%100)%10)+48);
                        }

                        Comment


                        • #13
                          Nguyên văn bởi trimen Xem bài viết
                          Bạn sửa đoạn này

                          thành như sau thử xem :
                          Cảm ơn sự đóng góp của các bạn rất nhiều. Mình đang tìm hiểu về vi điều khiển nên còn nhiều điều chưa biết nên rất mong các bạn chỉ giáo thêm.
                          Cảm ơn bạn trimen rất nhiều. Mình đã sửa lại như hướng dẫn của bạn và mạch đã chạy rùi. Thanks bạn nhé!
                          Còn về chương tình delay_ms của mình thì mình nên sửa thế nào đây?
                          Các bạn xem giùm mình vì sao mà chương trình mô phỏng trên proteus của mình dữ liệu bị nhấp nháy mà không đứng yên và cách sửa như thế nào nhé.

                          Giờ mình xin nói rõ về đề tài của mình và rất mong các bạn đóng góp ý kiến để mình hoàn thiện đề tài:
                          Mình mô phỏng bằng proteus và chương trình dịch bằng keil C.
                          Nội dung đề tài là thiết kế mạch điều khiển nhiệt độ lò ủ thép có nhiệt độ ổn định là 1250 độ C. Mình ổn định nhiệt độ bằng cách điều chỉnh góc mở của van gió cấp nhiên liệu cho lò thông qua động cơ bước. như vậy mình định lấy một số mốc nhiệt độ gần 1250 độ C rồi điều chỉnh góc mở theo các thông số khác nhau. Các bạn có hứng thú với vấn đề này thì cùng tham gia trao đổi nhé.
                          Ah một vấn đề là cặp nhiệt mình định sử dụng không tuyến tính cho lắm nên sẽ có sai số.
                          Sau đây là nhưng gì mình đã làm và chưa hoàn thành. Nếu có thể mình rất mong nhận được đống góp của các bạn về điều khiển góc mở động cơ bước theo từng giá trị của nhiệt độ.
                          Trong mạch mình sử dung AD 1674. Liệu có thể mua được con này ở Việt Nam không và nếu thay thế bằng con khác thì thuật toán có gì thay đổi?
                          LAM MACH DO AN.rar
                          Last edited by fanazon; 30-05-2012, 00:09.
                          Mỗi ngày là một món quà mà cuộc sống đã ban tặng cho chúng ta

                          Comment


                          • #14
                            Thời gian làm đồ án của mình không còn nhiều nên mình rất mong nhận được sự đóng góp của tất cả các bạn.
                            Mình muốn điều khiển động cơ bước thông qua IC dịch 74194 như trong sơ đồ của mình. Vì vậy chỉ cần cấp xung co IC là ok. Nhưng vấn đề ở đây là mình cần cấp một số lượng xung nhất định ở một giá trị nhiệt độ. Ví dụ: dưới 1000 độ C mình cần góc mở tối đa là 360 độ và ở 1200 độ C mình giảm còn 180 độ, ở 1240 độ C thì còn 120 độ. Nếu nhiệt lên tới 1260 độ thì góc mở giảm còn 90 độ, 1280 độ thì còn 30 độ. vvv. Không biết là mình có cần thêm cảm biến để đo góc mở của động cơ không? Ah nếu có thể thì các bạn có thể cho minh xin ý tưởng về điều khiển góc mở van gió. Thanks.
                            Mỗi ngày là một món quà mà cuộc sống đã ban tặng cho chúng ta

                            Comment


                            • #15
                              trong hàm delay bạn dùng while để kiểm tra TF0 vậy bạn không cần set cờ ngắt lên, vì nếu bạn set cờ ngắt lên khi cờ TF0=1 nó sẽ nhảy tới địa chỉ chuơng trình ngắt chứ không làm việc tiếp theo trong chương trình của bạn có thể vì vậy nên dẫn tới dữ liệu nhấp nháy, vì dữ liệu nhấp nháy là do delay quá nhanh.
                              Nguyên văn bởi fanazon Xem bài viết
                              EA=0;
                              ET0=1;

                              TMOD=0x01;//chon che do 16 bit
                              TL0=0xAF; //nap gia tri 8=10101111 bit thap trong 16 bit cao = 111100.10101111=15535=2^16-50000mF s
                              TH0=0x3C;//nap gia tri 8=111100 bit cao trong 16 bit cao = 111100.10101111=15535=2^16-50000mF s
                              EA=1;
                              TR0=1;//chay timer 1
                              while(1)
                              {
                              if(TF0==1)
                              {
                              TF0=0;
                              TR0=0;
                              break;
                              }

                              }
                              if(i==20)//lap 2 s=40.50000mF s
                              {
                              break;}

                              }
                              }
                              bạn sửa thành như sau xem thế nào :
                              Nguyên văn bởi fanazon Xem bài viết
                              TMOD=0x01;//chon che do 16 bit
                              TL0=0xAF; //nap gia tri 8=10101111 bit thap trong 16 bit cao = 111100.10101111=15535=2^16-50000mF s
                              TH0=0x3C;//nap gia tri 8=111100 bit cao trong 16 bit cao = 111100.10101111=15535=2^16-50000mF s
                              TR0=1;//chay timer 1
                              while(TF0==0);
                              TF0=0;
                              TR0=0;
                              if(i==20)//lap 2 s=40.50000mF s
                              {
                              break;}

                              }
                              }
                              còn vấn đề điều khiển động cơ mình chịu do chưa làm bao giờ .

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X