RP Store Tìm linh kiện theo mã, gửi BOM nhận báo giá Gửi BOM

giúp mình về LCD va PIC 16f877

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • lambaotrung
    Đệ tử 5 túi
    • Jan 2010
    • 96

    #1

    giúp mình về LCD va PIC 16f877

    hiện giờ mình đang làm bài tập kết nói và hiển thi từ PIc lên LCD.
    +bài tập 1: là kết noi PIC & LCD gữi nhưng chửa nghĩa bình thường lên như " TEST, HELLO"...
    +bài tập 2: là đưa giá trị của một thanh ghi lên màn hình LCD tại vị trí con trỏ.
    +bài tập 3: là kết nói PIC lên LCD thông qua ADC để thấy đổi giá trị.....

    mình cố thể dùng màn hình loại 16x4 dc ko...

    và kết nói 4birt hay 8bit.....

    chân thành cảm ơn các bạn.
  • caovanhuong
    Đệ tử 2 túi
    • Jul 2009
    • 40

    #2
    Nguyên văn bởi lambaotrung View Post
    hiện giờ mình đang làm bài tập kết nói và hiển thi từ PIc lên LCD.
    +bài tập 1: là kết noi PIC & LCD gữi nhưng chửa nghĩa bình thường lên như " TEST, HELLO"...
    +bài tập 2: là đưa giá trị của một thanh ghi lên màn hình LCD tại vị trí con trỏ.
    +bài tập 3: là kết nói PIC lên LCD thông qua ADC để thấy đổi giá trị.....

    mình cố thể dùng màn hình loại 16x4 dc ko...

    và kết nói 4birt hay 8bit.....

    chân thành cảm ơn các bạn.
    có thể sử dụng LCD 16x4, giao tiếp 8bit hoạc 4bit
    đây là cái thư viện mình viết giao tiếp 8 bit
    BT1: xuất "PIC VIET NAM" ra màn hình LCD
    Code:
    #include <16F877A.h>
    #include <def_877A.h>
    #fuses NOWDT,NOLVP,NOPROTECT,HS,PUT
    #use delay(clock=20000000)
    #include <lcd_lib.c>
    void main()
    {
    trisb=0x00;
    trisd=0x00;
    lcd_init();
    while(1)
    {
    lcd_putcmd(0x01);
    lcd_putcmd(0x0c);
    lcd_putchar("PIC VIET NAM");
    delay_ms(500);
    }
    }
    BT2: đọc giá trị thanh ghi porta

    Code:
    #include <16F877A.h>
    #include <def_877A.h>
    #fuses NOWDT,NOLVP,NOPROTECT,HS,PUT
    #use delay(clock=20000000)
    #include <lcd_lib.c>
    int8 a;
    void main()
    {
    trisb=0x00;
    trisd=0x00;
    trisa=0x00;
    lcd_init();
    while(1)
    {
    //porta=10;
    lcd_putcmd(0x01);
    lcd_putcmd(0x0c);
    a=portd;// gan gia tri thanh ghi portd vào a
    printf(lcd_putchar,"%d",a);// doc gia tri thanh ghi portd lên man hinh LCD
    delay_ms(500);
    }
    }
    BT3: đọc giá trị ADC của AN0 lên LCD
    Code:
    #include <16F877A.h>
    #include <def_877A.h>
    #fuses NOWDT,NOLVP,NOPROTECT,HS,PUT
    #device *=16 adc=8
    #use delay(clock=20000000)
    #include <lcd_lib.c>
    int8 data;
    void main()
    {
    trisb=0x00;
    trisd=0x00;
    trisa=0x00;
    lcd_init();
    setup_ADC_ports(AN0_AN1_AN3);
    setup_ADC(adc_clock_internal);
    set_ADC_channel(0);
    delay_us(10);
    while(1)
    {
    data=read_adc();
    lcd_putcmd(0x01);
    lcd_putcmd(0x0c);
    printf(lcd_putchar,"%u",data);
    delay_ms(500);
    }
    }
    Attached Files
    Cao Văn Hưởng
    SĐT: 01672754113
    Email: caovanhuong@webdien.com
    Nhận thiết kế mạch điện tử, PCB (Orcad)

    Comment

    • lambaotrung
      Đệ tử 5 túi
      • Jan 2010
      • 96

      #3
      Thuyet voi cam on anh nhieu....

      Comment

      • lambaotrung
        Đệ tử 5 túi
        • Jan 2010
        • 96

        #4
        Anh oi cho em them 1 điều là mình kết nói các chân của pic và lcd như thế nào.... Ko có hình ảnh và củng ko có thầy chỉ nưa. Anh giúp em cái này....
        Vơi lại em thấy cái doan core kia kết nói.....
        Driver pic & lcd khá là phúc tạp hơn....

        VA 1 CÂU HỎI NỬA LÀ.

        VI KẾT NÓI NHƯ TRÊN THEO KEI TRIS_B, TRIS_D NHƯ CỦA ANH EM KO KIỂM TRA DC GIA CHI CỦA PIN RB0.

        MÀ MACH EM LDE6DEP6E6M1 CÀN DỌC TÍNH HIỆU ( H_TO_L) TỪ 1 CHÂN CỦA 1 PORT NHƯ VẬY MÌNH KHAI BÁO NHƯ THẾ NÀO

        VD:
        //RE0 LÀ CHÂN KHÔNG CỦA PORT E.
        IF(RE0 = 0)
        {
        a++
        }

        NHƯ VẬY LÀ TƯƠNG ĐƯƠNG GÁN 1 CHÂN CỦA PORT THÀNH 1 CÁI TÊN MÀ MÌNH ĐỊNH TRƯỚC NHƯ " RE0, CHAN01,...."

        VÀ TƯƠNG TƯ NHƯ THẾ... KHÁC BAO CHO CÁC PORT KHÁC NHƯ THỂ NÀO..


        Như thế chất là năng cao hơn àh... Giúp em cai nua nhe...
        HI CAM ƠN. ANH
        Last edited by lambaotrung; 24-03-2011, 04:50 PM.

        Comment

        • stupid11
          Đệ tử 6 túi
          • Dec 2009
          • 133

          #5
          Hiển thị chữ "HELLO WORLD"

          #include <16f877a.h>
          #fuses nowdt,noprotect,nolvp,put,hs
          #use delaY(clock=4000000)

          #byte portb=0x6
          #byte porte=0x9

          #bit e=0x9.0
          #bit rs=0x9.1
          #bit rw=0x9.2

          int i;
          char mang[]="HELLO WORLD";

          void lenh()
          {
          rs=0;rw=0;e=1;e=0;
          delay_ms(5);
          }
          void xuat()
          {
          e=1;rs=0;rw=0;e=0;
          delay_ms(5);
          }

          void khoitao()
          {
          portb=0x1;lenh(); //xoa LCD
          portb=0x38;lenh(); //hien thi 2 dong
          portb=0x0e;lenh(); //bat hien thi
          portb=0x02;lenh(); //dua con tro ve dau dong//
          }

          void main()
          {
          set_tris_b(0);
          set_tris_e(0);
          khoitao();
          for(i=0;i<15;i++)
          {
          portb=mang[i];
          xuat();
          delay_ms(5);
          }
          while(1)
          {}
          }
          Last edited by stupid11; 27-03-2011, 10:59 PM.

          Comment

          • stupid11
            Đệ tử 6 túi
            • Dec 2009
            • 133

            #6
            //Đo nhiệt đô hiển thị lên LCD và cảnh báo ở ngưỡng 50 oC//
            //Phần cứng như sau:
            porte:chân điều khiển
            portb:xuất data
            RA0:ngõ vào analog(từ LM35)
            RA1:xuất cảnh báo

            #include <16f877a.h>
            #fuses nowdt,noprotect,nolvp,put,hs
            #use delay(clock=4000000)

            #byte portb=0x6
            #byte porte=0x9

            #bit e=0x9.0
            #bit rs=0x9.1
            #bit rw=0x9.2

            int i,x;
            char mang[]="nhiet do :";

            void lenh()
            {
            rs=0;rw=0;e=1;e=0;
            delay_ms(5);
            }
            void xuat()
            {
            e=1;rs=0;rw=0;e=0;
            delay_ms(5);
            }

            void khoitao()
            {
            portb=0x1;lenh(); //xoa LCD
            portb=0x38;lenh(); //hien thi 2 dong
            portb=0x0e;lenh(); //bat hien thi
            portb=0x02;lenh(); //dua con tro ve dau dong//
            }

            void doc_ADC()
            {
            setup_ADC(ADC_clock_internal);
            stup_ports(AN0);
            set_channel(0);
            delay_ms(1);
            }

            void main()
            {
            set_tris_a(0b01);
            set_tris_b(0);
            set_tris_e(0);
            khoitao();
            for(i=0;i<12;i++)
            {
            portb=mang[i];
            xuat();
            delay_ms(5);
            }
            while(1)
            {
            doc_ADC();
            X=read_ADC();
            X=X*2.049 //ADC 10bit & LM35//
            portb=0x89;lenh();//dua con tro LCD toi vi trí sau chu nhiet do:
            //ban nen xem lai lenh nay..ko biet co dung vi tri ko nua~.

            portb=x;xuat();
            //canh bao//
            if(x>50)
            {
            RA1=1 //
            }
            else
            {
            RA1=0;//
            }
            }}


            Trong LCD có ký hiệu "oC" bạn chỉ việc

            portb=0b00101110;xuat(); //bạn tham khảo thêm bảng mã LCD//

            Chúc bạn thành công.

            Comment

            • lambaotrung
              Đệ tử 5 túi
              • Jan 2010
              • 96

              #7
              cam on bạn nhưng mà vẫn thấy sao sao...

              kiểm tra giá trị của 1 chân bit trong 1 pỏt vẫn chưa giải quyết dc.

              Comment

              • lambaotrung
                Đệ tử 5 túi
                • Jan 2010
                • 96

                #8
                bạn ởi bạn có tài liệu gì về kết nối. LCD và PIC ko về các hàm các lệnh, su khoi tao.
                viet nhu thề nào...

                nếu bạn có tài liệu gì về lập trình cho PIC.

                mình dang làm bai tập

                kiểm tra pin của 1 port ( vd: porte chân số 0 )

                ví du của chương trình.
                // kiem tra giá trị điện áp tháp ở chuân 0 của porte
                e0= chân 0 của portE
                int a;

                void main()
                {
                set_tris_e(0x01);
                set_tris_d(0x00);
                if( e0 == 0)
                {
                a++;
                output_d(a);
                }
                }

                Comment

                • stupid11
                  Đệ tử 6 túi
                  • Dec 2009
                  • 133

                  #9
                  -Bạn đọc thêm mấy tài liệu này..còn LCD thì bạn vào trang www.hocavr.com/index.php/app/textlcd người ta chỉ cũng khá chi tiết đó...giao tiếp 4 bit.8bit luôn.
                  -còn câu hỏi của bạn mình cũng ko hiểu cho lắm..có phải bạn muốn kiểm tra chân nào đó ở mức '1' hay '0' phải không

                  vd:chân a0=0x5.0

                  if(a0==0)
                  {
                  thực hiện 1...
                  }
                  else
                  {
                  thực hiện 2...
                  }
                  đại khái là thế...hoặc bạn cũng có thể dùng lệnh bit_test(x,i) cũng được..Trong đó x là thanh ghi,còn i là thứ tự bit trong thanh ghi.

                  vd:kiểm tra chân RB3 ở mức cao:

                  if(bit_test(0X5,3))
                  {
                  }
                  .....

                  hay kiểm tra chân RA4 ở mức thấp

                  if( ! bit_test(0x5,4)) //bạn chú ý " ! " tức là mức thấp
                  {
                  }
                  .....
                  -Còn cách khởi tạo LCD thì để hôm nào lục lại mấy cái folder đã,,lâu rồi ko đụng đến..có gì mình gửi mail cho.Chúc bạn may mắn.
                  Attached Files

                  Comment

                  • stupid11
                    Đệ tử 6 túi
                    • Dec 2009
                    • 133

                    #10
                    Đây là file mô phỏng LCD hiện chữ 'HELLO WORLD' bạn lưu ý:khi mô phỏng mà ko có thạch anh ngoài thì khai báo là #fuses xt //thì PIC sẽ chạy thạch anh nội.

                    -còn nếu rảnh thì gắn thạch anh ngoài (mất nhiều thời gian) thì khai báo #fuses hs
                    -Nếu ko chạy ko hiểu lí do vì sao ko chạy đâu.Rất nhỏ nhưng cần phải lưu ý.
                    -bạn tải file mô phỏng trên mạng cần chú ý chỗ này.
                    Attached Files

                    Comment

                    • lambaotrung
                      Đệ tử 5 túi
                      • Jan 2010
                      • 96

                      #11
                      bạn ởi mình thực hiện lệnh tét 1 chân trong 1 port như bạn chỉ ko dc.
                      #include <def_877A.h>
                      #fuses NOWDT,NOLVP,NOPROTECT,HS,PUT
                      #use delay(clock=20000000)
                      #byte portd = 0x06
                      #byte porte= 0x09
                      #use fast_io(a)
                      #use fast_io(b)
                      #use fast_io(d)

                      void main()
                      {
                      set_tris_a(0xff);
                      set_tris_b(0x00);
                      set_tris_d(0x00);
                      while(1)
                      {
                      if(! bit_test(0x5.1))
                      {output_d(0x01);
                      }
                      }
                      }

                      chương trình ccs pic c dịch thành công nhưng khi chạy mô phỏng thì nó out ra trị ra port D luôn ko kiểm tra dc..
                      giup mình chổ này nhe.

                      có gì gữi qua mail: lambaotrungdt@gmail.com
                      fone: 01284279279
                      Last edited by lambaotrung; 29-03-2011, 10:08 AM. Lý do: bổ xung nội dung.

                      Comment

                      • stupid11
                        Đệ tử 6 túi
                        • Dec 2009
                        • 133

                        #12
                        Xin lỗi mấy bạn nha.Hình như mình up nhầm file mô phỏng.để tối về rồi up lại.sorry sorry

                        Comment

                        • lambaotrung
                          Đệ tử 5 túi
                          • Jan 2010
                          • 96

                          #13
                          plc

                          thay la la

                          Comment

                          • lambaotrung
                            Đệ tử 5 túi
                            • Jan 2010
                            • 96

                            #14
                            bạn stupid11 bạn có thể giải thich kỹ hơn 1 tý về các:
                            void lenh()
                            void xuat()

                            và bạn co thể chi ra mình muốn di chuyễn con trỏ và xuất giá trị theo vị trí con trỏ như thế nào ko.

                            vả lại bạn ởi mình muốn kết nối lcd theo kiểu 8bit.

                            vài gửi giá trị của 1 thanh ghi đó lên lcd ( chú ý: là ko dùng thu viện)
                            như thế mình mới đầu mình khai báo làm sao... hé. mong bạn giúp cho.
                            Last edited by lambaotrung; 29-03-2011, 04:15 PM.

                            Comment

                            • lambaotrung
                              Đệ tử 5 túi
                              • Jan 2010
                              • 96

                              #15
                              các bác giúp mình giải quyết mạch đếm sản phẩm này giúp mình
                              // ấn vào chân RAO ( 0x05,0)
                              {
                              a++; // thanh ghi a = a + 1;
                              }
                              hiên thi lên LCD

                              nhưng lúc này lcd hiện thi phi phải là phép cộng 1. hiết chả hiểu.

                              #include <16F877A.h>
                              #include <def_877A.h>
                              #fuses NOWDT,NOLVP,NOPROTECT,HS,PUT
                              #use delay(clock=20000000)
                              #include <lcd_lib.c>
                              #byte porta = 0x05
                              int a=0;
                              void main()
                              {
                              trisb=0x00;
                              trisd=0x00;
                              lcd_init();


                              while(2)
                              {
                              lcd_putcmd(0x01);
                              lcd_putcmd(0x0c);
                              delay_ms(500);
                              portd=a;
                              while(1)
                              {
                              if(!bit_test(porta,0))
                              {
                              a++;
                              a=portd;
                              printf(lcd_putchar,"%d",a);
                              delay_ms(100);
                              }
                              }
                              }
                              }



                              nhưng mà củ thể là em muốn đếm đấy
                              ấn 1 cái thanh ghi a ( #byte a = 0x20)
                              a++;
                              hiện thị a lên lcd;
                              delay_ms(100);
                              quay về kiểm tra
                              rổi lại hiển thị.
                              Attached Files
                              Last edited by lambaotrung; 29-03-2011, 05:00 PM.

                              Comment

                              Working...