Thông báo

Collapse
No announcement yet.

Xin giúp đỡ e lập trình hiển thị lcd

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

  • Xin giúp đỡ e lập trình hiển thị lcd

    - MỚI TẬP TÀNH NÊN CHƯA RÀNH LẮM, MONG ĐƯỢC CÁC A GIÚP ĐỠ NHIỆT TÌNH VỚI

    CHẢ LÀ E LẬP TRÌNH GIAO TIẾP DÙNG NGẮT RB0, DÙNG 4 NÚT BẤM: TĂNG, GIẢM, QUAY THUẬN, QUAY NGỊCH

    -KHI BẤM THUẬN THÌ LCD HIỆN: QUAY THUẬN GIÁ TRỊ: X (BIẾN) => ĐÃ LÀM ĐƯỢC

    -KHI BẤM NGỊCH LCD HIỆN: QUAY NGHỊCH GIÁ TRỊ: X (BIẾN) => ĐÃ LÀM ĐƯỢC

    - VẤN ĐỀ LÀ KHI E BẤM TĂNG HOẶC GIẢM THÌ BIẾN X PHẢI THAY ĐỔI NHƯ LÀ: QUAY THUẬN GIÁ TRỊ: 1 HAY 2 , 3, 4, 5. E ĐANG BÓ TAY PHẦN NÀY.

    E ĐÃ CÓ TÌM HIỂU QUA LÀ MUỐN HIỆN THỊ LCD THÌ PHẢI ĐƯA MÃ ASCII VÀO LCD. NHƯNG KO BIẾT CHUYỂN GIÁ TRỊ LƯU TRONG BIẾN X THÀNH MÃ ASCII RỒI CÂU LỆNH VIẾT NHƯ THẾ NÀO CẢ.

    MONG CÁC A VIẾT HỘ E ĐOẠN CODE CHỖ TĂNG GIẢM HIỆN LCD VỚI, E XIN CẢM ƠN RẤT NHÌU.

    E GỬI CODE VÀ MÔ PHỎNG PROTUES ĐỂ CÁC A XEM HỘ.

    PHẦN RB6 RB7 IN ĐẬM E KO BIẾT VIẾT THẾ NÀO.


    #include <16F877A.h>
    #include <DEFS_16F877A.h>
    #fuses XT,NOWDT,NOPROTECT,NOLVP
    #use delay(clock=4000000)
    #define RS RB3
    #define RW RB2
    #define E RB1
    #define LCD PORTD
    #use fast_io(b)
    #byte portb=0x06
    #byte intcon=0x000B
    int x=0;
    /*Ham yeu cau goi lenh dieu khien LCD*/
    void comnwrt(void)
    {
    RS = 0;
    RW = 0;
    E = 1;
    E = 0;
    delay_ms(1);
    }
    /*Ham yeu cau goi du lieu hien thi len LCD*/
    void datawrt(void)
    {
    RS = 1;
    RW = 0;
    E = 1;
    E = 0;
    delay_ms(1);
    }
    // Chuong trinh ngat
    #int_RB
    void ngat_RB()
    {

    if((RBIF)&&(RBIE))
    {
    //Kiem tra sw1

    { if(RB4==0)
    {
    LCD = 0x01; // Xoa man hinh hien thi
    comnwrt();
    delay_ms(10);
    LCD = 0x83; // Vi tri hang 1,cot 3
    comnwrt();
    delay_ms(1);
    LCD = 'Q'; // Xuat dong chu "QUAY THUAN" ra LCD
    datawrt();
    LCD = 'U';
    datawrt();
    LCD = 'A';
    datawrt();
    LCD = 'Y';
    datawrt();
    LCD = ' ';
    datawrt();
    LCD = 'T';
    datawrt();
    LCD = 'H';
    datawrt();
    LCD = 'U';
    datawrt();
    LCD = 'A';
    datawrt();
    LCD = 'N';
    datawrt();
    LCD = 0xC0; // Vi tri hang 2,cot 0
    comnwrt();
    LCD = 'G'; // Xuat dong chu "GIA TRI:" ra LCD
    datawrt();
    LCD = 'I';
    datawrt();
    LCD = 'A';
    datawrt();
    LCD = ' ';
    datawrt();
    LCD = 'T';
    datawrt();
    LCD = 'R';
    datawrt();
    LCD = 'I';
    datawrt();
    LCD = ':';
    datawrt();
    }
    }
    //Kiem tra sw2
    {
    if(RB5==0)
    {
    LCD = 0x01; // Xoa man hinh hien thi
    comnwrt();
    delay_ms(10);
    LCD = 0x83; // Vi tri hang 1,cot 3
    comnwrt();
    delay_ms(1);
    LCD = 'Q'; // Xuat dong chu "QUAY NGICH" ra LCD
    datawrt();
    LCD = 'U';
    datawrt();
    LCD = 'A';
    datawrt();
    LCD = 'Y';
    datawrt();
    LCD = ' ';
    datawrt();
    LCD = 'N';
    datawrt();
    LCD = 'G';
    datawrt();
    LCD = 'I';
    datawrt();
    LCD = 'C';
    datawrt();
    LCD = 'H';
    datawrt();
    LCD = 0xC0; // Vi tri hang 2,cot 0
    comnwrt();
    LCD = 'G'; // Xuat dong chu "GIA TRI:" ra LCD
    datawrt();
    LCD = 'I';
    datawrt();
    LCD = 'A';
    datawrt();
    LCD = ' ';
    datawrt();
    LCD = 'T';
    datawrt();
    LCD = 'R';
    datawrt();
    LCD = 'I';
    datawrt();
    LCD = ':';
    datawrt();
    }
    }
    //Kiem tra sw3
    {
    if(RB6==0)
    {
    ++x;
    LCD = 0x01; // Xoa man hinh hien thi
    comnwrt();
    LCD = 0xC8; // Vi tri hang 2,cot 8
    comnwrt();
    delay_ms(100);
    LCD='x';
    datawrt();
    delay_ms(100);
    }
    }
    //Kiem tra sw4
    {
    if(RB7==0)
    {

    }

    }
    RBIF=0; //Xoa co ngat RB
    }
    }

    /*Ham main*/
    void main(void)
    {
    set_tris_B(0b11110000);
    set_tris_D(0);
    enable_interrupts(global); // Cho phep ngat toan cuc
    enable_interrupts(int_RB); // Cho phep ngat RB
    ext_int_edge(H_to_L); // Ngat khi co xung cao xuong thap
    delay_ms(100); // Tao tre 100ms cho LCD khoi dong

    LCD = 0x38; // Hai hang, ma tran dot 5*7, 8 bit interface
    comnwrt();
    LCD = 0x0C; // Bat hien thi, tat con tro
    comnwrt();

    LCD = 0x82; // Vi tri hang 1,cot 3
    comnwrt();
    LCD = 'C'; // Xuat dong chu "CHUONG TRINH" ra LCD
    datawrt();
    LCD = 'H';
    datawrt();
    LCD = 'U';
    datawrt();
    LCD = 'O';
    datawrt();
    LCD = 'N';
    datawrt();
    LCD = 'G';
    datawrt();
    LCD = ' ';
    datawrt();
    LCD = 'T';
    datawrt();
    LCD = 'R';
    datawrt();
    LCD = 'I';
    datawrt();
    LCD = 'N';
    datawrt();
    LCD = 'H';
    datawrt();
    LCD = 0xC4; // Vi tri hang 2,cot 5
    comnwrt();
    LCD = 'S'; // Xuat dong chu "SAN SANG" ra LCD
    datawrt();
    LCD = 'A';
    datawrt();
    LCD = 'N';
    datawrt();
    LCD = ' ';
    datawrt();
    LCD = 'S';
    datawrt();
    LCD = 'A';
    datawrt();
    LCD = 'N';
    datawrt();
    LCD = 'G';
    datawrt();
    While(true)
    {
    }
    }
    Attached Files
    Last edited by nct; 18-03-2010, 11:00.

  • #2
    mọi người giúp e với !

    mọi người giúp e với, e sắp phải nộp đồ án rồi, hu hu hu

    Comment


    • #3
      Bạn thử code này xem sao.
      - file: lcd_lib_4bit.c copy rồi paste vào đây C:\program files\PICC\Drivers
      - file: def_877a.h thì cho vào chỗ này: C:\program files\PICC\Devices
      Mạch vẽ lại nên phải có proteus 7.6.
      Code:
      #include<16f877a.h>
      #include<def_877a.h>
      #fuses hs,nowdt,nolvp
      #use delay(clock=20M)
      #include<lcd_lib_4bit.c>
      
         int tocdo;
         int1 chay,dao;
      #int_rb
      void rb()
      {
         if(!rb4) chay=!chay;
         if(!rb5) dao=!dao;
         if(!rb6)
         {
            if(tocdo==5) return;
            tocdo++;      
         }
         if(!rb7)
         {
            if(tocdo==1) return;
            tocdo--;      
         }   
      }
      
      void main()
      {
         trisb=0xf0;
         
         enable_interrupts(int_rb);
         enable_interrupts(global);
         
         lcd_init();
         lcd_putchar("Hello PVN.com!!");
         chay=1;
         tocdo=1;
         dao=1;
         while(true)
         {
            if(chay==0)
            {
               lcd_toado(1,0); lcd_putchar("Dung dong co      ");
               lcd_toado(2,0); lcd_putchar("                  ");
            }
            else 
            {
               if(dao)
               {
                  lcd_toado(1,0); lcd_putchar("Dang chay thuan");
               }
               else 
               {
                  lcd_toado(1,0); lcd_putchar("Dang chay nguoc");
               }
               
               lcd_toado(2,0); lcd_putchar("Toc do:");
               lcd_putchar(tocdo+0x30);   
            }
         }
      }
      Attached Files
      Last edited by nhamdtk4; 18-03-2010, 15:23.
      Nhớ quá khứ buồn rơi nước mắt.
      Nhìn tương lai lạnh buốt sống lưng.
      Y!M: nhamdtk4.

      Comment


      • #4
        Nguyên văn bởi nhamdtk4 Xem bài viết
        Bạn thử code này xem sao.
        - file: lcd_lib_4bit.c copy rồi paste vào đây C:\program files\PICC\Drivers
        - file: def_877a.h thì cho vào chỗ này: C:\program files\PICC\Devices
        Mạch vẽ lại nên phải có proteus 7.6.
        Code:
        #include<16f877a.h>
        #include<def_877a.h>
        #fuses hs,nowdt,nolvp
        #use delay(clock=20M)
        #include<lcd_lib_4bit.c>
        
           int tocdo;
           int1 chay,dao;
        #int_rb
        void rb()
        {
           if(!rb4) chay=!chay;
           if(!rb5) dao=!dao;
           if(!rb6)
           {
              if(tocdo==5) return;
              tocdo++;      
           }
           if(!rb7)
           {
              if(tocdo==1) return;
              tocdo--;      
           }   
        }
        
        void main()
        {
           trisb=0xf0;
           
           enable_interrupts(int_rb);
           enable_interrupts(global);
           
           lcd_init();
           lcd_putchar("Hello PVN.com!!");
           chay=1;
           tocdo=1;
           dao=1;
           while(true)
           {
              if(chay==0)
              {
                 lcd_toado(1,0); lcd_putchar("Dung dong co      ");
                 lcd_toado(2,0); lcd_putchar("                  ");
              }
              else 
              {
                 if(dao)
                 {
                    lcd_toado(1,0); lcd_putchar("Dang chay thuan");
                 }
                 else 
                 {
                    lcd_toado(1,0); lcd_putchar("Dang chay nguoc");
                 }
                 
                 lcd_toado(2,0); lcd_putchar("Toc do:");
                 lcd_putchar(tocdo+0x30);   
              }
           }
        }


        Thanks bạn rất nhìu ! mình sẽ thử !

        Comment


        • #5
          Xin mọi người giúp với

          -e cảm ơn bác nhamdtk4 rất nhìu. sẫn đây bác xem tiếp đoạn code này dùm e nó bị lỗi gì e ko biết sửa nữa. Phần này là e xem code của bác rồi sửa lại cho đúng đề tài của e!


          - chỗ e in đậm nếu e viết là vitri=0; thì khi bấm tăng giảm ko được, nếu viết là vitri=1; thì tăng giảm giá trị được. vì ban đầu chưa đặt giá trị vị trí thì nó phải là 0,ko hiểu nó bị lỗi gì, bác và mọi người giúp e với.


          - chả là đề tài của e là điều khiển vị trí trục vít me và đọc encoder về để biết vị trí, như điều khiển nó chạy sang phải 50mm, sang trái 20mm, hiển thị LCD, phần này e mới tập viết phần giao tiếp LCD thôi nhưng vẫn chưa được nữa, e còn phần điều khiển động cơ và đọc encoder chính xác nữa, e rất mong nhận được sự chỉ bảo của các a !


          - các a xem dùm e chỗ vitri=1 phải sửa như thế nào nhé
          - e gửi file mô phỏng protues để các a xem dùm e với.





          #include<16f877a.h>
          #include<def_877a.h>
          #fuses hs,nowdt,nolvp
          #use delay(clock=20M)
          #include<lcd_lib_4bit.c>

          int16 vitri;
          int1 chay,dao;
          int8 donvi,chuc,tram;
          void convert_bcd(int16 tocdo) // chuong trinh chuyen doi so sang ma ASCII hien thi LCD
          {
          donvi=vitri%10; // chia lay phan du, so hang don vi
          donvi=donvi+0x30;
          chuc=vitri%100; // chia lay hang chuc
          chuc=chuc/10;
          chuc=chuc+0x30;
          tram=vitri/100; //chia lay hang tram
          tram=tram+0x30;
          }
          #int_rb // ngat RB
          void rb()
          {
          if(!rb4) // START / STOP
          {
          chay=!chay;
          if(chay==0)
          {
          lcd_toado(1,0); lcd_putchar("DUNG DONG CO ");
          lcd_toado(2,0); lcd_putchar(" ");
          vitri=0;
          }
          else
          {
          if(chay==1)
          lcd_toado(1,0); lcd_putchar("DANG");

          }}
          if(!rb5) // THUAN / NGHICH
          {
          dao=!dao;

          if(dao)
          {
          lcd_toado(1,0); lcd_putchar(" QUAY THUAN");
          }
          else
          {
          lcd_toado(1,0); lcd_putchar(" QUAY NGUOC");
          }

          lcd_toado(2,0); lcd_putchar("VI TRI:");
          convert_bcd((int8) vitri);
          lcd_putchar(tram);lcd_putchar(chuc);lcd_putchar(do nvi);lcd_putchar(" mm");
          }
          if(!rb6) // TANG
          {
          if(vitri==50000) return;
          {vitri=vitri+10;
          convert_bcd((int8) vitri);
          lcd_toado(2,7);
          lcd_putchar(tram);lcd_putchar(chuc);lcd_putchar(do nvi);lcd_putchar(" mm");}
          }
          if(!rb7) // GIAM
          {
          if(vitri==1) return;
          {vitri=vitri-10;
          convert_bcd((int8) vitri);
          lcd_toado(2,7);
          lcd_putchar(tram);lcd_putchar(chuc);lcd_putchar(do nvi);lcd_putchar(" mm");}
          }
          }

          void main()
          {
          trisb=0xf0;

          enable_interrupts(int_rb);
          enable_interrupts(global);

          lcd_init();
          lcd_putchar("CHUONG TRINH");
          lcd_toado(2,0);
          lcd_putchar("SAN SANG");
          delay_ms(100);
          lcd_toado(1,0);
          lcd_putchar(" HAY CHON ");
          lcd_toado(2,0);
          lcd_putchar(" CHE DO ");
          chay=0;
          vitri=1;
          dao=1;
          while(true)
          {
          }
          Attached Files

          Comment


          • #6
            vitri=0; nó vẫn chạy bình thường mà. Nhưng CT của bạn có nhiều chỗ ko ổn, bạn sửa theo hướng sau nếu ko chưa đc thì bàn tiếp:
            - vitri nên lưu vào Eeprom.
            - Động cơ dừng mà khi bấm tăng, giảm vitri vẫn tăng giảm bình thường, và trong các CTC xử lý phím bấm nên để trễ một khoảng thời gian để chống rung.
            - Trinh bày: Biến vitri nhận giá trị đến 50000 (ko rõ sao lại là 50000 trong khi bạn tăng vitri lên 10 đơn vị mỗi khi bấm phím, tăng mm hay cm vậy) mà chỉ biểu diễn nó đến số hàng trăm là thôi. Các hàm LCD display cũng vậy đằng sau mỗi chuỗi hiển thị phải để khoảng trắng (đủ 16 ký tự là đc) để xóa hết những ký tự trên dòng đó lúc trước vừa hiển thị.
            Nguyên văn bởi nct Xem bài viết
            if(!rb6) // TANG
            {
            if(vitri==50000) return;
            {vitri=vitri+10;
            convert_bcd((int8) vitri);
            lcd_toado(2,7);
            lcd_putchar(tram);lcd_putchar(chuc);lcd_putchar(do nvi);lcd_putchar(" mm");}
            }
            Nhớ quá khứ buồn rơi nước mắt.
            Nhìn tương lai lạnh buốt sống lưng.
            Y!M: nhamdtk4.

            Comment


            • #7
              mong các bạn giúp đỡ , mình mới học chưa hiểu lắm
              code của mình lại bị báo lỗi ở dòng :#divice *=16 ADC=8 , có phải là do thư viện không ? mình còn thấy các bạn có thư viện <16f877a.h> các bạn có thể cho mình xin không ?



              #include "def_877a.h"
              #use delay(clock=20000000)
              #divice *=16 ADC=8
              int8 ADC_delay;
              void chinh()
              {
              ADC_delay=read_adc(0);
              output_B(0);
              delay_ms(ADC_delay);
              output_B(255);
              delay_ms(ADC_delay);
              }
              void main()
              {

              setup_adc_ports(AN0);
              setup_adc(ADC_CLOCK_DIV_2);

              // TODO: USER CODE!!

              setup_adc_ports(RA0_RA1_RA3);
              setup_adc(adc_clock_internal);
              set_adc_channel(0);
              while (1)
              {
              chinh();
              if (RC0)
              {output_B(0);
              break;
              }
              }
              }

              Comment

              Về tác giả

              Collapse

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

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

              Collapse

              Đang tải...
              X