Thông báo

Collapse
No announcement yet.

Check giùm em cái code hiển thị dùng LCD

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

  • Check giùm em cái code hiển thị dùng LCD

    Hôm qua mới bắt đầu bốc đề tài làm bài tập lớn, với lại bây giờ mới đầu kỳ lên chưa học được gì, em đang làm cái đề tài làm máy tính casio thực hiện các phép + - * : các số <=16 bit. hiện tại ngay từ phần hiển thị em đã mắc 1 số lỗi mà ko biết sửa ở đâu, >_< (em đính kèm file cho các bác xem)
    chả là màn hình LCD bị nháy liên tục mà ko biết lỗi, với lại cái hàm kiểm tra LCD bận hay ko
    void busy_flag()
    { char x;
    P2=0xff;
    RS=0;
    RW=1;
    do
    {
    EN=1;
    delay(10);
    EN=0;
    x=P2;
    x=x&0x80;
    }
    while(x==0x80);
    }

    theo lý thuyết thì BF=1 thì là bận thì nhẽ ra phải là x!=0x80 nhưng em làm thế nó ko chạy mà để == thì nó chạy, copy trên mạng thì cũng có 1 bài người ta để ==, còn giáo trình thì lại để !=, mặc dù 2 chương trình về cách khai báo giống y nhau, ko biết lỗi tại đâu.
    Tiện thể cho em hỏi luôn về nguyên lý cách quét bàn phím 16 phím dùng Port0 và hiển thị LCD dùng hàm fprintf(); khác gì so với viết hàm hiển thị
    link down http://www.mediafire.com/?wcxscos97sq7k4b
    //hjc, phiền các bác down bằng link media tí
    // ko hiểu sao ko thể upload file rar lên diễn đàn được
    Website chính thức đổi địa chỉ website thành
    Mời các bạn ghé thăm !!!

  • #2
    58 lượt view nhưng ko một lượt reply
    Website chính thức đổi địa chỉ website thành
    Mời các bạn ghé thăm !!!

    Comment


    • #3
      Nguyên văn bởi mast090 Xem bài viết
      58 lượt view nhưng ko một lượt reply
      while(1)
      {
      write_command(0x01);
      write_command(0x80);
      write_string("DH CN HN");
      write_command(0xc0);
      write_string("khoa dien tu");

      }
      bạn liên tục hiển thị ra lcd lên nó nháy là phải rồi.
      sửa lại:

      write_command(0x01);
      write_command(0x80);
      write_string("DH CN HN");
      write_command(0xc0);
      write_string("khoa dien tu");
      while(1)
      {
      }
      |

      Comment


      • #4
        Bạn nên gọi lệnh giấu con trỏ nháy đi để màn hình trông cho đẹp.

        Comment


        • #5
          ^^!, mình đang tập mà, tưởng nó giống quét led quét liên tục, ai ngờ
          vậy còn cái hàm busy_flag thì sao hả bạn, làm đúng như lý thuyết mà nó ko hiển thị, làm ngược lại thì chạy. hjc
          Website chính thức đổi địa chỉ website thành
          Mời các bạn ghé thăm !!!

          Comment


          • #6
            Nguyên văn bởi mast090 Xem bài viết
            ^^!, mình đang tập mà, tưởng nó giống quét led quét liên tục, ai ngờ
            vậy còn cái hàm busy_flag thì sao hả bạn, làm đúng như lý thuyết mà nó ko hiển thị, làm ngược lại thì chạy. hjc
            hàm viết như vậy là đúng rồi.
            Code:
             void busy_flag()
            {   char x;
            	P2=0xff;
            	RS=0;
            	RW=1;
            	do
            		{
            		EN=1;
            		delay(10);
            		EN=0;
            		x=P2;
            		x=x&0x80;
            		}
            	while(x==0x80);//nếu BF =1 [còn bận ] nhảy về [do] đọc tiếp.BF=0 thoát khỏi hàm.
            }

            nếu dùng:while(x!=0x80)//BF =1 thoát khỏi hàm ;BF =0 nhảy về [do]
            |

            Comment


            • #7
              , uh nhỉ, đọc lộn, thank cả nhà
              nhưng em còn 1 thắc mắc nữa, đó là như theo em được biết ta có thể dùng hàm printf cho LCD thay thế cho hàm hiển thị, nhưng mà còn thấy có 1 số tiền bối dùng hàm sprintf(); ko hiểu ý nghĩa của hàm này thế nào nữa, em xin copy mẫu 1 đoạn bác nào biết giải thích hộ em nhé
              unsigned char message[32];
              write_command(0x01);
              write_command(0x80);
              sprintf(&message[0],"sinh vien 1. \nsinh vien 2");
              write_string(&message[0]);
              delay(19900);

              và cái biến message có ý nghĩa gì ở đây, đã hỏi và search tài liệu nhưng ko thấy tài liệu về sprintf mà chỉ có printf thì ai cũng biết rùi
              Last edited by mast090; 26-03-2011, 13:41.
              Website chính thức đổi địa chỉ website thành
              Mời các bạn ghé thăm !!!

              Comment


              • #8
                mạch mô phỏng của em đậy mạch thật đã chạy ngon
                http://www.mediafire.com/?pk67j0sblc1eh1k
                :
                mail:
                dd: 0973423905 - ĐH CÔNG NGHIỆP HÀ NỘI

                Comment


                • #9
                  bác cho file mô phỏng nhưng ko có code thì em biết đâu mà tham khảo, @@
                  với lại cái mạch mô phỏng này có 1 số vấn đề, khi giữ phím lâu quá thì có lúc thành nhấn 2 lần, còn ấn nhanh quá thì ko quét được phím được nhấn, ko biết mạch thực tế có vấn đề gì ko(hi vọng là không vì thực tế và mô phỏng nhiều cái khác nhau)
                  bác có thể nói cho em về thuật toán quét keypad 4x4 được ko, đã đọc tài liệu của trường nhưng mà ko hiểu(với lại tài liệu của trường viết linh tinh sơ sài, chả có bài nào chạy, toàn phải tự viết hoặc sửa lại)
                  Website chính thức đổi địa chỉ website thành
                  Mời các bạn ghé thăm !!!

                  Comment


                  • #10
                    mạch này anh làm thực tế chạy rồi anh làm cho k10 của trường công nghiệp mấy cái chạy ngon, thầy tùng thầy chiến có vặn vẹo dc câu nào đâu, thực tế chỉ cần nhấn nút là dc số ngay
                    :
                    mail:
                    dd: 0973423905 - ĐH CÔNG NGHIỆP HÀ NỘI

                    Comment


                    • #11
                      /*
                      Các mã l?nh cho LCD
                      #define LCDWrite_Byte (0x01); //xóa màn hình
                      #define LCDWrite_Byte (0x02); //tr? v? ??u dòng
                      #define LCDWrite_Byte (0x04); //d?ch con tr? sang trái
                      #define LCDWrite_Byte (0x06); // d?ch con tr? sang ph?i
                      #define LCDWrite_Byte (0x05); // d?ch v? trí hi?n th? sang ph?i
                      #define LCDWrite_Byte (0x07); // d?ch v? trí hi?n th? sang trái
                      #define LCDWrite_Byte (0x08); //t?t hi?n th?,t?t con tr?
                      #define LCDWrite_Byte (0x0A); //t?t hi?n th?,b?t con tr?
                      #define LCDWrite_Byte (0x0C); //b?t hi?n th?,t?t con tr?
                      #define LCDWrite_Byte (0x0E); //b?t hi?n th?,con tr? nh?p nháy
                      #define LCDWrite_Byte (0x10); //d?ch v? trí con tr? sang trái
                      #define LCDWrite_Byte (0x14); //d?ch v? trí con tr? sang ph?i
                      #define LCDWrite_Byte (0x18); //d?ch toàn b? hi?n th? sang trái
                      #define LCDWrite_Byte (0x1C) //d?ch toàn b? hi?n th? sang ph?i
                      #define LCDWrite_Byte (0x38); //hai dòng,ma tr?n 5*7
                      #define LCDWrite_Byte (0x80); //tr? v? ??u dòng th? nh?t
                      #define LCDWrite_Byte (0xC0); //tr? v? ??u dòng th? hai

                      */

                      /* Các chân ch?c n?ng c?a LCD */

                      #include <at89x52.h>
                      #define BTN_PORT P0 //define key pad 4x4
                      #define LCD_PORT P2 //define data port for lcd
                      #define LCD_RS P1_0
                      #define LCD_RW P1_1
                      #define LCD_EN P1_2
                      #define lcdPutc LCDPut_Char
                      #define lcdPuts LCDPut_Str
                      #define lcdPutb LCDWrite_Byte
                      #define lcdLine1() lcdPutb(0, 0x80) // Tro ve dau dong thu nhat;
                      #define lcdLine2() lcdPutb(0, 0xc0) // Tro ve dau dong thu hai;

                      unsigned char btn = 0, lKey = 0, row = 0, col = 0, Signed = 0;
                      unsigned int cKey;

                      unsigned char M[4][4] = {{'3', '2', '1', '0'}, // Gan ki tu xuat hien cac phim vao mang M;
                      {'7', '6', '5', '4'},
                      {'-', '+', '9', '8'},
                      {'*', '/', '=', 'C'} } ;
                      unsigned long so1;
                      unsigned int so;

                      void delay(unsigned int i) // Ham tao tre delay;
                      {
                      while(i--);
                      }
                      void LCDWrite_Byte(unsigned char mode, unsigned char d) // Ghi lenh ra LCD;
                      {
                      LCD_PORT = d; // Chan LCD ;
                      LCD_RW = 0; // Ghi du lieu vao LCD;
                      if(mode == 1) LCD_RS = 1; // Chon thanh ghi du lieu;
                      else LCD_RS = 0; // Chon thanh ghi lenh ;
                      LCD_EN = 1; // Tin hieu Cho phep LCD;
                      delay(4); // Tao tre;
                      LCD_EN = 0; // Tin hieu khong cho phep LCD;
                      delay(40); // Tao tre;
                      }
                      void LCDPut_Char(unsigned char byte) // Ghi du lieu can hien thi ra LCD;
                      {
                      LCDWrite_Byte(1, byte);
                      }
                      void LCDPut_Str(char const *str) // Ghi chuoi ki tu ra LCD;
                      {
                      char const *sPtr;
                      sPtr = str;
                      while(*sPtr != '\0')
                      {
                      LCDWrite_Byte(1, *sPtr);
                      sPtr++;
                      }
                      }
                      void lcd_ClrL(unsigned char l)
                      {
                      if(l == 1)
                      {
                      lcdLine1();
                      lcdPuts(" ");
                      lcdLine1();
                      }
                      else{
                      lcdLine2();
                      lcdPuts(" ");
                      lcdLine2();
                      }
                      }
                      void OnInitLCD() // Khoi tao LCD;
                      {
                      LCDWrite_Byte(0, 0x38); //LCD 2 dong, font 5*7;
                      LCDWrite_Byte(0, 0x0C); //Bat hien thi, tat con tro, con tro khong nhap nhay;
                      LCDWrite_Byte(0, 0x01); // Xoa man hinh;
                      delay(1700);
                      }

                      void Quetphim(void)
                      {
                      unsigned char i, gKey;
                      i = 1;
                      i = i<< row;
                      BTN_PORT = ~i;
                      delay(2);
                      gKey = BTN_PORT;
                      if((gKey&0xf0) != 0xf0) // Dat gia tri 1 cho tung cot, kiem tra tung hang ;
                      {
                      if(gKey == lKey){
                      cKey++;
                      if(cKey == 3000)
                      {
                      if((lKey&0xe0) == 0xe0) col = 0; // Gan cho cot 1 gia tri bang 0;
                      else if((lKey&0xd0) == 0xd0) col = 1; // Gan cho cot 2 gia tri bang 1;
                      else if((lKey&0xb0) == 0xb0) col = 2; // Gan cho cot 3 gia tri bang 2;
                      else if((lKey&0x70) == 0x70) col = 3; // Gan cho cot 4 gia tri bang 3;
                      cKey = 0; btn = 1;

                      }
                      }
                      else{
                      cKey = 0;
                      lKey = gKey;
                      }
                      }
                      else{
                      row++;
                      btn = 0;
                      }
                      if(row > 3)
                      row = 0;
                      }
                      void Hienthi(void)
                      {
                      unsigned char ma = M[col][row], sig;
                      if((ma<= '9') && (ma >= '0'))
                      {
                      so = so *10 + ma - '0';
                      lcdPutc(ma);
                      }
                      else if((ma == '+') || (ma == '-') || (ma == '*') || (ma == '/'))
                      {
                      sig = ma;
                      if(Signed == 0){
                      so1 = so; so = 0;
                      lcdPutc(ma);
                      Signed = 1;
                      }
                      else
                      {
                      lcd_ClrL(2); lcdPuts("Error #2");
                      }
                      }
                      else if(ma == '=')
                      {
                      switch(sig)
                      {
                      case '-': so1 = so1 - so;
                      break;
                      case '+': so1 = so1 + so; break;
                      case '*': so1 = so1 * so; break;
                      case '/':
                      if(so == 0) {
                      lcd_ClrL(2); lcdPuts("Error #1");
                      }
                      else
                      so1 = so1 / so;
                      break;
                      }
                      lcdPutb(0, 0x0c); // Bat hien thi, tat con tro;
                      lcdLine2(); lcdPutc('=');
                      ///lcdPuti(so1); cho nay ban viet not chuong trinh cho no hien thi dc so 1 len man hinh nhe
                      Signed = 0; so = 0; so1 = 0;
                      btn = 0; while(btn == 0) Quetphim();
                      lcdPutb(0, 0x01); // Xoa man hinh;
                      delay(5000);
                      lcdPutb(0, 0x0f); // Bat hien thhi, bat con tro, bat nhap nhay;
                      }
                      else{
                      so = so1 = 0;
                      lcdPutb(0, 0x01);
                      delay(5000);
                      lcdPutb(0, 0x0f);
                      }
                      }
                      void main(void)
                      {
                      OnInitLCD();
                      lcdPuts("My Calculator"); // Dong 1 cua LCD;
                      lcdLine2();
                      lcdPuts(" version 1.0"); // Dong 2 cua LCD;
                      btn = 0;
                      while(btn == 0)
                      Quetphim();
                      lcdPutb(0, 0x01);
                      delay(1700);
                      lcdPutb(0, 0x0f);
                      while(1){
                      btn = 0;
                      while(btn == 0)
                      Quetphim();
                      Hienthi();
                      }
                      }


                      code cua em đây
                      :
                      mail:
                      dd: 0973423905 - ĐH CÔNG NGHIỆP HÀ NỘI

                      Comment


                      • #12
                        void Quetphim(void)
                        {
                        unsigned char i, gKey;
                        i = 1;
                        i = i<< row;
                        BTN_PORT = ~i;
                        delay(2);
                        gKey = BTN_PORT;
                        if((gKey&0xf0) != 0xf0) // Dat gia tri 1 cho tung cot, kiem tra tung hang ;
                        {
                        if(gKey == lKey){
                        cKey++;
                        if(cKey == 3000)//tai sao cKey=3000
                        {
                        if((lKey&0xe0) == 0xe0) col = 0; // Gan cho cot 1 gia tri bang 0;//tai sao 4 dòng lien tuc kể từ dòng nay ko &0xff
                        else if((lKey&0xd0) == 0xd0) col = 1; // Gan cho cot 2 gia tri bang 1;
                        else if((lKey&0xb0) == 0xb0) col = 2; // Gan cho cot 3 gia tri bang 2;
                        else if((lKey&0x70) == 0x70) col = 3; // Gan cho cot 4 gia tri bang 3;//vidu dong nay 0xf0&0x70=0x70&0x70
                        cKey = 0; btn = 1;

                        }
                        }
                        else{
                        cKey = 0;
                        lKey = gKey;
                        }
                        }
                        else{
                        row++;
                        btn = 0;
                        }
                        if(row > 3)
                        row = 0;
                        }
                        cám ơn bác đã tận tình giúp đỡ, code này em đã nghiên cứu xong vẫn chưa thể hiểu được cái hàm quét key4x4. bác có thể giải thích cho em thuật toán quét phím này được ko ạ? về thuật toán quét đọc qua các giáo trình chỉ lơ mơ hiểu, tập viết thử thì ko hiển thị ra phím gì
                        còn các phần còn lại gàn như em đã hiểu gần hết, hàm hiển thị kết quả so1 em cũng đã viết và mô phỏng ngon rồi
                        bài này của bác chỉ hiển thị kết quả với giá trị max là 65535, lên em nghĩ bác cũng lên đưa thêm 1 cảnh báo nữa Error3 chẳng hạn, vượt ngoài giá trị này kết quả sai
                        Last edited by mast090; 28-03-2011, 11:45.
                        Website chính thức đổi địa chỉ website thành
                        Mời các bạn ghé thăm !!!

                        Comment


                        • #13
                          Nguyên văn bởi mast090 Xem bài viết
                          void Quetphim(void)
                          {
                          unsigned char i, gKey;
                          i = 1;
                          i = i<< row;
                          BTN_PORT = ~i;
                          delay(2);
                          gKey = BTN_PORT;
                          if((gKey&0xf0) != 0xf0) // Dat gia tri 1 cho tung cot, kiem tra tung hang ;
                          {
                          if(gKey == lKey){
                          cKey++;
                          if(cKey == 3000)//tai sao cKey=3000
                          {
                          if((lKey&0xe0) == 0xe0) col = 0; // Gan cho cot 1 gia tri bang 0;//tai sao 4 dòng lien tuc kể từ dòng nay ko &0xff
                          else if((lKey&0xd0) == 0xd0) col = 1; // Gan cho cot 2 gia tri bang 1;
                          else if((lKey&0xb0) == 0xb0) col = 2; // Gan cho cot 3 gia tri bang 2;
                          else if((lKey&0x70) == 0x70) col = 3; // Gan cho cot 4 gia tri bang 3;//vidu dong nay 0xf0&0x70=0x70&0x70
                          cKey = 0; btn = 1;

                          }
                          }
                          else{
                          cKey = 0;
                          lKey = gKey;
                          }
                          }
                          else{
                          row++;
                          btn = 0;
                          }
                          if(row > 3)
                          row = 0;
                          }
                          cám ơn bác đã tận tình giúp đỡ, code này em đã nghiên cứu xong vẫn chưa thể hiểu được cái hàm quét key4x4. bác có thể giải thích cho em thuật toán quét phím này được ko ạ? về thuật toán quét đọc qua các giáo trình chỉ lơ mơ hiểu, tập viết thử thì ko hiển thị ra phím gì
                          còn các phần còn lại gàn như em đã hiểu gần hết, hàm hiển thị kết quả so1 em cũng đã viết và mô phỏng ngon rồi
                          bài này của bác chỉ hiển thị kết quả với giá trị max là 65535, lên em nghĩ bác cũng lên đưa thêm 1 cảnh báo nữa Error3 chẳng hạn, vượt ngoài giá trị này kết quả sai
                          giải thích code:
                          Code:
                          void Quetphim(void)
                          {
                          unsigned char i, gKey;
                          i = 1;
                          i = i<< row;
                          BTN_PORT = ~i;//row=0 BTN_PORT=0xfe;row=1 BTN_PORT=0xfd;row=2 BTN_PORT=0xfb;row=3 BTN_PORT=0xf7
                          delay(2);
                          gKey = BTN_PORT;
                          if((gKey&0xf0) != 0xf0) // Dat gia tri 1 cho tung cot, kiem tra tung hang ;kiểm tra xem có phím nhấn hay không
                          {
                          if(gKey == lKey){
                          cKey++;
                          if(cKey == 3000)//tai sao cKey=3000//chống dội phím
                          {
                          if((lKey&0xe0) == 0xe0) col = 0; // Gan cho cot 1 gia tri bang 0;//giá trị row=0  gán col = 0 để truy xuất mảng 2 chiều
                          else if((lKey&0xd0) == 0xd0) col = 1; // Gan cho cot 2 gia tri bang 1;giá trị row=1 gán col = 1 để truy xuất mảng 2 chiều
                          else if((lKey&0xb0) == 0xb0) col = 2; // Gan cho cot 3 gia tri bang 2;giá trị row=2 gán col = 2 để truy xuất mảng 2 chiều
                          :/ Gan cho cot 4 gia tri bang 3;//giá trị row=3 gán col = 3 để truy xuất mảng 2 chiều
                          cKey = 0; btn = 1;
                          
                          }
                          }
                          else{
                          cKey = 0;
                          lKey = gKey;
                          }
                          }
                          else{
                          row++;//tăng cột kế tiếp để kiểm tra
                          btn = 0;
                          }
                          if(row > 3)//nếu dịch đủ cột
                          row = 0;//quay lại cột đầu tiên
                          }
                          giá trị của 4bit thấp liên tục thay đổi từ:e,d,b,7
                          đọc giá trị 4bit cao:
                          if((lKey&0xe0) == 0xe0) col = 0;
                          else if((lKey&0xd0) == 0xd0) col = 1;
                          else if((lKey&0xb0) == 0xb0) col = 2; //
                          else if((lKey&0x70) == 0x70) col = 3; //
                          nếu có phím nhấn gán giá trị tương ứng để truy xuất mảng 2 chiều(unsigned char M[4][4])
                          Last edited by tdm; 28-03-2011, 12:45.
                          |

                          Comment


                          • #14
                            hjc, có lẽ do đầu óc nông cạn ko thể hiểu được cái hàm này mặc dù đã đọc rất nhiều lần, quanh đi quẩn lại vẫn chỉ biết khi nó # 0xf0 thì là có 1 phím đã được nhấn nhưng để xác định phím nhấn thì chịu,@@, mà cái biến ckey và lkey cũng chả hiểu nhiệm vụ của nó ở đây như thế nào
                            bác có thể ví dụ cho em 1 phím bất kì được, vị trí hàng 2 cột 3 chẳng hạn
                            về thao tác khi nhấn 1 phím thì gồm ấn phím và nhả phím mới được coi là 1 thao tác ấn phím, vậy cái chống dội phím ckey=3000 nghĩa là sao? có liên quan j ko ạ
                            Website chính thức đổi địa chỉ website thành
                            Mời các bạn ghé thăm !!!

                            Comment


                            • #15
                              thuật toán quét phím như saukiểm tra 4 phím ở hang_0 chưa có phần chống dội phím và chờ nhả phím)
                              gán port_phim=p0
                              xuất dữ liệu 0xfe ra port_phim //lúc này hàng_0 =0
                              port_phim=0xfe;
                              and port với 0xf0//che 4 bit thấp
                              kiem_tra=port_phim &0xf0;
                              //kiểm tra port nếu bằng 0xf0 thì không có phím nhấn
                              if(kiem_tra !=0xf0)//
                              {
                              if(kiem_tra ==0xe0)//kiểm tra cột_0 có nhấn hay không
                              {//nếu có nhấn
                              gán giá trị cho cột
                              cột=0;
                              hàng =0;
                              truy xuất mảng 2 chiều ;
                              }
                              else if(kiem_tra ==0xd0)//kiểm tra cột_1 có nhấn hay không
                              {//nếu có nhấn
                              gán giá trị cho cột
                              cột=1;
                              hàng =0;
                              truy xuất mảng 2 chiều ;
                              }
                              else if(kiem_tra ==0xb0)//kiểm tra cột_2 có nhấn hay không
                              {//nếu có nhấn
                              gán giá trị cho cột
                              cột=2;
                              hàng =0;
                              truy xuất mảng 2 chiều ;
                              }
                              if(kiem_tra ==0x70)//kiểm tra cột_3 có nhấn hay không
                              {//nếu có nhấn
                              gán giá trị cho cột
                              cột=3;
                              hàng =0;
                              truy xuất mảng 2 chiều ;
                              }
                              else
                              {
                              }
                              }//
                              |

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X