Thông báo

Collapse
No announcement yet.

hien thi LCD

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

  • hien thi LCD

    các bạn ơi,mình đang lập trình hiển thị cho LCD.nhưng mà có 1 điều thắc mắc là khi mình chạy mô phỏng = proteus thì mặc dù code mình không dùng vòng lặp nào nhưng LCD cứ chạy đi chạy lại hoài mà ko chịu dừng lại.ai biết cách làm cho LCD chỉ hiển thị 1 lần rồi stop thi chỉ cho mình với
    code của mình đây

    #include <reg52.h>
    #include <stdio.h>
    #include <string.h>

    sbit rs=P1^0;//Xet RS=0 de gui lenh;Neu RS=1->gui du lieu can hien thi len LCD
    sbit rw=P1^1;//Xet RW=0 de ghi hoac gui lenh len LCD;RW=1->doc tu LCD xuong
    sbit en=P1^2;
    sbit db7=P0^7;
    const int n=1000;
    void tre(unsigned long int v)
    {
    unsigned long int i;
    for(i=0;i<v;i++);
    }
    int chophep(void)
    {
    int ra;
    en=1; tre(n); en=0;
    return ra=1;
    }
    void kt_lcd(void)
    {

    while(db7==1&&chophep()&&rw==1&&rs==0);
    }
    void lenh(unsigned char malenh)
    {
    kt_lcd(); chophep();
    rs=0; rw=0; P2=malenh;
    }
    void in(char *s)
    {
    int i;
    for(i=0;i<strlen(s);i++)
    {
    kt_lcd(); chophep();
    rs=1; rw=0;
    P2=s[i]; tre(n);
    }
    }
    void khoi_tao(void)
    {
    lenh(0x01);//xoa man hinh hien thi
    lenh(0x02);//tro ve dau dong
    lenh(0x38);//hai dong va ma tran 5x7
    lenh(0x06);//tang con tro( dich con tro sang phai)
    lenh(0x0e);//bat hien thi, nhap nhay con tro
    }
    void main(void)
    {
    khoi_tao();
    lenh(0x80); //cho chay o dong 1
    in("SELECT PROGRAM");
    lenh(0xC4); // cho chay o dong 2
    in("WASH-FULL");
    lenh(0x94); // cho chay o dong 3
    in("RINSE");
    lenh(0xD4); // cho chay o dong 4
    in("SPIN");
    }

  • #2
    void main(void)
    {
    khoi_tao();
    lenh(0x80); //cho chay o dong 1
    in("SELECT PROGRAM");
    lenh(0xC4); // cho chay o dong 2
    in("WASH-FULL");
    lenh(0x94); // cho chay o dong 3
    in("RINSE");
    lenh(0xD4); // cho chay o dong 4
    in("SPIN");
    while(1);
    }

    Thử xem??

    Comment


    • #3
      Giả sử nếu đoạn mã trên là 1 chương trình con mà dùng lệnh while(1) thì lệnh ngắt gọi sau nó liệu có chạy được ko?em chạy thử khi coi đoạn mã trên là 1 chương trình con và thêm lệnh ngắt vào nhưng lệnh ngắt ko gọi được.nếu ko thêm while(1) thì chữ nó cũng chạy lặp đi lặp lại vô cùng và cũng ko dùng được lệnh ngắt.Anh nào có cách chữ chỉ hiện thị 1 lần rồi dừng mà ko dùng lên while(1) thì chỉ dùm em.Thank trước nha!!!!!!!!

      Comment


      • #4
        Nguyên văn bởi pmt26188 Xem bài viết
        Giả sử nếu đoạn mã trên là 1 chương trình con mà dùng lệnh [COLOR="Blue"]while(1) thì lệnh ngắt gọi sau nó liệu có chạy được ko?
        Không biết bạn hiểu NGẮT là gì nữa? NGẮT là 1 sự kiện và có chương trình phục vụ NGẮT chứ làm gì có lệnh ngắt.

        Khi chương trình của bạn đang thực thi các tác vụ bên ngoài ngắt mà xảy ra sự kiện NGẮT thì vùng nhớ của tác vụ đó sẽ đc lưu vào STACK và chương trình sẽ nhảy đến chương trình phục vụ cho NGẮT đó.

        Làm gì có chuyện "lệnh ngắt ko gọi được"....(Nếu đã cho phép NGẮT đó)

        void main(void)
        {
        khoi_tao();
        lenh(0x80); //cho chay o dong 1
        in("SELECT PROGRAM");
        lenh(0xC4); // cho chay o dong 2
        in("WASH-FULL");
        lenh(0x94); // cho chay o dong 3
        in("RINSE");
        lenh(0xD4); // cho chay o dong 4
        in("SPIN");
        }
        Trong đoạn code này, mặc dù bạn nói không có vòng lặp, nhưng lại không có điểm dừng cho toàn bộ chuỗi hoạt động của chương trình chính.

        Khi chương trình chạy hết hàm in("SPIN") và thoát khỏi hàm main(), sẽ quay trở lại đầu chương trình và chạy lại, kết quả là "LCD cứ chạy đi chạy lại hoài mà ko chịu dừng lại".

        Do vậy ở cuối hàm main() ko_phoenix đặt hàm while(1); để làm cho chương trình không thoát khỏi hàm main() bên việc xuất LCD chỉ đc thực hiện 1 lần duy nhất là đáp ứng đc yêu cầu của thamtutaihoa.

        void main(void)
        {
        khoi_tao();
        lenh(0x80); //cho chay o dong 1
        in("SELECT PROGRAM");
        lenh(0xC4); // cho chay o dong 2
        in("WASH-FULL");
        lenh(0x94); // cho chay o dong 3
        in("RINSE");
        lenh(0xD4); // cho chay o dong 4
        in("SPIN");
        while(1);
        }
        Theo mô tả của bạn,

        Nguyên văn bởi pmt26188 Xem bài viết
        ... dùng lệnh while(1) thì lệnh ngắt .... ko gọi được,nếu ko thêm while(1) thì chữ nó cũng chạy lặp đi lặp lại vô cùng và cũng ko dùng được lệnh ngắt.
        Như vậy "thì lệnh ngắt .... ko gọi được" ở đây không liên quan gì đến lệnh while(1) cả, vì theo bạn có hay không có while(1) thì cũng không gọi dc lệnh ngắt mà.

        Cái lỗi này có lẽ do chương trình của bạn, hay bạn hiểu sai về NGẮT... Có khi nào bạn quét phím không đc và hiểu là NGẮT không???

        Last edited by taplamdientu; 22-04-2009, 10:18.

        Comment


        • #5
          thanks các bạn

          Comment


          • #6
            cảm ơn các bạn . minh dang học lập trình lcd qua các bài của các bạn!
            cho mình hỏi trong doạn code:
            in("SELECT PROGRAM");
            lenh(0xC4); // cho chay o dong 2
            in("WASH-FULL");
            lenh(0x94); // cho chay o dong 3
            in("RINSE");
            lenh(0xD4); // cho chay o dong 4
            in("SPIN");
            thi trong đó thì các lệnh:in("SELECT PROGRAM");
            in("WASH-FULL");
            in("RINSE");
            in("SPIN");

            là các lênh gì thế ,ý nghĩ của các lênh đó là gì vậy?
            cảm ơn nhé! thanks

            Comment


            • #7
              đó là các dòng chữ để hiển thị thôi pác ơi!
              SỰ HỌC LÀ MÃI MÃI......!!!!

              Comment


              • #8
                To dung h !

                Các dòng in("SELECT PROGRAM");... là các lệnh gọi chương trình con in("..."); Chương trình con này có chức năng gửi ra hiển thị trên LCD các chuỗi ký tự kiểu string vd như "SELECT PROGRAM"...
                để có thể sử dụng lệnh gọi này, chương trình con in(...) phải được định nghĩa và khai báo từ trước:
                void in(char *s)
                {
                int i;
                for(i=0;i<strlen(s);i++)
                {
                kt_lcd(); chophep();
                rs=1; rw=0;
                P2=s[i]; tre(n);
                }
                }
                For a better world

                Comment


                • #9
                  Tôi nghĩ bạn thamtutaihoa khi viết chương trình nên đặt tên hàm con theo chức năng của nó để tiện theo dõi hơn. Tôi xin post một chương trình mẫu về điều khiển LCD để chúng ta cùng nghiên cứu:
                  #include <at89x52.h>

                  #define N1 200
                  #define N2 100
                  #define LCD P0
                  #define LCD_RS P2_0
                  #define LCD_RW P2_1
                  #define LCD_EN P2_2

                  void InitSystem();
                  void Delay(unsigned int n);
                  void LCD_Init();
                  void LCD_Clrscr();
                  void LCD_WriteCommand(unsigned char byte);
                  void LCD_WriteCharacter(unsigned char byte);
                  void LCD_PutString(const unsigned char *p);
                  void LCD_Goto(unsigned char row,unsigned char column);
                  void main()
                  {
                  InitSystem();
                  LCD_Goto(1,1);
                  LCD_WriteCharacter(0xFF);
                  LCD_Goto(2,1);
                  LCD_PutString("ETECH");
                  while(1);
                  }
                  void InitSystem()
                  {
                  Delay(1000);
                  LCD_Init();
                  }
                  void Delay(unsigned int n)
                  {
                  unsigned int i,j;
                  for(i=0;i<n;i++)
                  for(j=0;j<100;j++);
                  }
                  void LCD_Init()
                  {
                  LCD_WriteCommand(0x30);
                  LCD_WriteCommand(0x30);
                  LCD_WriteCommand(0x30);
                  LCD_WriteCommand(0x38); //8 bit, 2lines, font 5x7
                  LCD_WriteCommand(0x0C); //Display on, hide cursor
                  LCD_WriteCommand(0x01);// clear screen
                  }
                  void LCD_Clrscr()
                  {
                  LCD_WriteCommand(0x01);
                  }
                  void LCD_WriteCommand(unsigned char byte)
                  {
                  LCD = byte;
                  LCD_RS = 0;
                  LCD_RW = 0;
                  LCD_EN = 1;
                  LCD_EN = 0;
                  Delay(N2);
                  }
                  void LCD_WriteCharacter(unsigned char byte)
                  {
                  LCD = byte;
                  LCD_RS = 1;
                  LCD_RW = 0;
                  LCD_EN = 1;
                  LCD_EN = 0;
                  Delay(N2);
                  }
                  void LCD_Goto(unsigned char row,unsigned char column)
                  {
                  unsigned char address;
                  switch(row)
                  {
                  case 1:
                  address = (char)(0x80 + column - 1);
                  break;
                  case 2:
                  address = (char)(0xC0 + column - 1);
                  break;
                  default:
                  break;
                  }
                  LCD_WriteCommand(address);
                  }
                  void LCD_PutString(const unsigned char *p)
                  {
                  unsigned char i;
                  i = 0;
                  while(p[i]!=0)
                  {
                  LCD_WriteCharacter(p[i]);
                  i++;
                  }
                  }
                  Trong chương trình, định nghĩa 3 hàm con là các hàm:

                  void LCD_Goto(unsigned char row,unsigned char column)
                  Cho phép di chuyển con trỏ đến một tọa độ bất kì trên màn hình LCD
                  void LCD_WriteCharacter(unsigned char byte)
                  Cho phép hiển thị một byte dữ liệu lên LCD
                  void LCD_PutString(const unsigned char *p)
                  Cho phép hiển thị một chuỗi ký tự lên màn hình LCD.

                  Sau khi xây dựng xong 3 hàm này thì việc điều khiển LCD đã trở nên đơn giản là chọn vị trí và gửi dữ liệu ra là xong.


                  Thân mến,
                  For a better world

                  Comment


                  • #10
                    Các bác ơi. Cho em hỏi một tí với. Thế nếu mình muốn dùng ma trận bàn phím để điều khiển con LCD đó hiển thị theo ý mình thì làm thế nào? em tối kiến nên các bác cho em xin một đoạn code minh họa luôn nhé.
                    VD: có 3 nút
                    - ấn nút 1 LCD hiển thị "Xin chào"
                    - ấn nút 2 LCD hiển thị "Các bạn"
                    - ấn nút 3 LCD hiển thị "Hết"
                    và các nút này có thể nhấn nhiều lần.
                    Cực kỳ mong các đại ca chỉ giùm em với (Em viết C cho 8051)
                    |

                    Comment


                    • #11
                      Nguyên văn bởi bknguyen Xem bài viết
                      Các bác ơi. Cho em hỏi một tí với. Thế nếu mình muốn dùng ma trận bàn phím để điều khiển con LCD đó hiển thị theo ý mình thì làm thế nào? em tối kiến nên các bác cho em xin một đoạn code minh họa luôn nhé.
                      VD: có 3 nút
                      - ấn nút 1 LCD hiển thị "Xin chào"
                      - ấn nút 2 LCD hiển thị "Các bạn"
                      - ấn nút 3 LCD hiển thị "Hết"
                      và các nút này có thể nhấn nhiều lần.
                      Cực kỳ mong các đại ca chỉ giùm em với (Em viết C cho 8051)
                      Trước hết bạn phải viết hàm quét phím để xem phím nào được nhấn , sau đó trong chương trình chính bạn dùng vòng lặp gọi liên tục hàm quét phím và hiển thị LCD là ok.

                      Gửu bạn một đoạn code quét phím để bạn tham khảo:

                      //Khai bao mang 4 phan tu: quetphim[4]= {P1 = 0xFE,0xFD,0xFB,0xF7}/////
                      unsigned char quetphim[4]= {0xFE,0xFD,0xFB,0xF7};
                      unsigned char quetbanphim(void)
                      {
                      unsigned char giatribanphim;
                      unsigned char x,y;
                      //quet 4 hang phim//
                      for(x=0;x<4;x++)
                      {
                      P2 = quetphim[x];
                      for (y = 0;y<solanquetphim;y++)
                      {
                      if (P2^4 == 0) giatribanphim = 0+4*x ;
                      if (P2^5 == 0) giatribanphim = 1+4*x ;
                      if (P2^6 == 0) giatribanphim = 2+4*x ;
                      if (P2^7 == 0) giatribanphim = 3+4*x ;
                      }
                      }
                      return(giatribanphim);
                      }

                      Comment


                      • #12
                        To bknguyen !
                        - Nếu bạn chỉ muốn làm thử một chương trình ví dụ đơn giản sử dụng 3 phím thì phần cứng bạn không cần thiết phải bố trí ma trận phím, cứ nối trực tiếp mỗi phím vào một chân của VDK và quét là OK.
                        - Trong trường hợp bạn muốn sử dụng nhiều phím hơn, 9, 16, 64, ... thì bạn hãy nối chúng thành ma trận bàn phím.
                        - Mục đích cuối cùng của chương trình quét phím trong cả hai trường hợp này là làm sao xác định chính xác phím nào được bấm, đối với ma trận bàn phím thì hơi rắc rối hơn một tí, bạn có thể thực hiện sư sau:
                        + Đầu tiên bạn đặt tất cả các hàng làm đầu vào, các cột làm đầu ra mức thấp
                        + Thứ 2 bạn kiểm tra trạng thái của các hàng, xem phím được bấm nằm ở hàng nào
                        + Thứ 3 : khi biết phím được bấm đó ở hàng nào rồi, bạn đặt hàng đó làm đầu ra mức thấp, đặt các cột làm đầu vào.
                        + Thứ 4: Đọc trạng thái của các cột, xem phím được bấm nằm ở cột nào.
                        Sau bước này bạn đã xác định được tọa độ phím bấm rồi (ở hàng nào, cột nào).
                        -Việc hiển thị LCD thì mỗi lần bạn xác định 1 phím bấm nào đó, bạn gọi hàm điều khiển LCD hiển thị nội dung tương ứng mà bạn muốn hiển thị ra.
                        For a better world

                        Comment


                        • #13
                          Tiểu đệ xin đa tạ các huynh. Tối nay đệ sẽ làm luôn. , có gì, đệ lại hỏi các huynh tiếp
                          |

                          Comment

                          Về tác giả

                          Collapse

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

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

                          Collapse

                          Đang tải...
                          X