Thông báo

Collapse
No announcement yet.

Hỏi về một số câu lệnh trong lập trình C

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

  • Hỏi về một số câu lệnh trong lập trình C

    Chào cả nhà, mình thấy có một số bài lập trình mà mình sưu tầm được trên mạng, viết code cho 8051 bằng ngôn ngữ C có những dòng lệnh mà mình rất khó hiểu, mong các bạn giải thích giùm:
    VD:
    x*=2
    // đây là lệnh gì vậy và có thể được thay thế bằng câu lệnh nào khác dễ hiểu hơn ko?
    alien
    ?
    _task_
    _priority_
    và còn dòng này nữa mình nghĩ mãi ko ra:

    temp=x;//gan bien
    temp=temp&0x80;//lay ra bit dau tien (bit 7)
    if(temp==0x80)//so sanh bit
    DATA=1; //bang 1 thi xuat vao chip =1
    nếu gán biến temp=x, rồi lại cho biến temp bằng temp và 1 giá trị xác định 0x80, vậy khi x thay đổi thì biến temp=giá trị x hay vẫn giữ giá trị 0x80? nếu giá trị temp khác 0x80 thì câu lệnh if xảy ra khi nào?

  • #2
    Reply

    X*=2 là lệnh rút gọn của x=x*2

    Comment


    • #3
      Nguyên văn bởi maingochoc Xem bài viết
      X*=2 là lệnh rút gọn của x=x*2
      cám ơn bạn, nhưng mình đọc được chú thích của dòng lệnh này là :
      dịch bit để lấy bit có trọng số thấp
      mình thử thay bằng lệnh x=x>>1; nhưng không được , nếu như bạn nói thì x=x*2 như vậy x ở đây là 1 số đúng không bạn? còn theo như giải thích thì x là 1 địa chỉ bit?

      Comment


      • #4
        Nguyên văn bởi lee_nguyen Xem bài viết
        cám ơn bạn, nhưng mình đọc được chú thích của dòng lệnh này là : mình thử thay bằng lệnh x=x>>1; nhưng không được , nếu như bạn nói thì x=x*2 như vậy x ở đây là 1 số đúng không bạn? còn theo như giải thích thì x là 1 địa chỉ bit?
        Bạn phải thay thành x=x<<1 mới đúng chứ,x ở đây là 1 số.
        temp=x;//gan bien
        temp=temp&0x80;//lay ra bit dau tien (bit 7)
        if(temp==0x80)//so sanh bit
        DATA=1; //bang 1 thi xuat vao chip =1
        Đoạn code này: kiểm tra bit đầu (bit 7) xem bằng 1 hay 0,rồi xuất bit ấy cho DATA,phép temp=temp&0x80 tức là xóa hết 7 bit (0,...6) của temp về 0,chỉ giữ lại bit7 như cũ rồi kiểm tra temp,nếu temp=0x80 (0b10000000) chứng tỏ bit 7 bằng 1 => cho DATA=1,còn ko thì DATA=0.
        vanduc0211@gmail.com

        Comment


        • #5
          Reply

          Code này là điều khiền 595 thì phải.
          Dùng phép And để kiểm tra xem bit thứ 7 là 1 hay 0 để dịch vào 595.

          Comment


          • #6
            Nguyên văn bởi lee_nguyen Xem bài viết
            cám ơn bạn, nhưng mình đọc được chú thích của dòng lệnh này là : mình thử thay bằng lệnh x=x>>1; nhưng không được , nếu như bạn nói thì x=x*2 như vậy x ở đây là 1 số đúng không bạn? còn theo như giải thích thì x là 1 địa chỉ bit?
            dịch cái này là người ta sắp xếp theo chiều của cách viết số nhị phân, ví dụ 1byte 1010 0010 thì bit bên trái ngoài cùng là lớn nhất vì vậy
            x*=2 <=> x=x*2 <=> x=x<<1;
            còn các từ kia nó giống như 1 Marco như kiểu interrupt. các từ đó chỉ sử dụng trong đa nhiệm thì phải, lập trình thông thường ko sử dụng
            Website chính thức đổi địa chỉ website thành
            Mời các bạn ghé thăm !!!

            Comment


            • #7
              x *= 2 tương đương với x = x * 2 tương đương với x << 1: giải thích đấy là phép nhân cũng đúng, giải thích đấy là phép dịch bit cũng vẫn đúng nhé.
              VD;
              11001001 * 10 = 110010010
              11001001 << 1 = 110010010
              các dòng dưới có thể là 1 macro được #define ở đâu đó
              đoạn code dưới cùng khá dễ, đọc chút là hiểu mà

              Comment


              • #8
                Nguyên văn bởi maingochoc Xem bài viết
                Code này là điều khiền 595 thì phải.
                Dùng phép And để kiểm tra xem bit thứ 7 là 1 hay 0 để dịch vào 595.
                thanhks bạn, đúng là đây là code giao tiếp 595 giờ thì mình đã hiểu, cám ơn mọi người!

                Comment


                • #9
                  Nguyên văn bởi lee_nguyen Xem bài viết
                  temp=x;//gan bien
                  temp=temp&0x80;//lay ra bit dau tien (bit 7)
                  if(temp==0x80)//so sanh bit
                  DATA=1; //bang 1 thi xuat vao chip =1
                  cái đoạn này có thể thay thế bằng một cách đơn giản như sau :
                  temp=x;
                  temp=temp<<1; // lệnh dịch trái 1 bit. khi đó bít temp.7 được đẩy ra ngoài và nhớ vào cờ CY.
                  DATA=CY; // xuất luôn giá trị của CY.
                  chỉ có tâm hồn là nơi duy nhất: có thể biến thiên đường thành địa ngục và ngược lại có thể biến địa ngục hóa thiên đường
                  Everything should be made as simple as possible, but not simpler

                  Comment


                  • #10
                    Ghi dịch

                    Nguyên văn bởi hoasua_2005 Xem bài viết
                    x *= 2 tương đương với x = x * 2 tương đương với x << 1: giải thích đấy là phép nhân cũng đúng, giải thích đấy là phép dịch bit cũng vẫn đúng nhé.
                    VD;
                    11001001 * 10 = 110010010
                    11001001 << 1 = 110010010
                    các dòng dưới có thể là 1 macro được #define ở đâu đó
                    đoạn code dưới cùng khá dễ, đọc chút là hiểu mà
                    Mình nghĩ Phải là :
                    11001001 * 10 = 10010010
                    11001001 << 1 = 10010010

                    Comment


                    • #11
                      Nguyên văn bởi vkdyenthanh Xem bài viết
                      Mình nghĩ Phải là :
                      11001001 * 10 = 10010010
                      11001001 << 1 = 10010010
                      bạn đang ép kết quả vào kiểu 8bits nhé.

                      Comment


                      • #12
                        Bạn có thể cho mình hỏi nếu như mình muốn xuất 8bit ra 1 chân vi điều khiển thì chân đó sẽ là 1 hay 0
                        Ví dụ như :mình cho P1^1= 0x5;
                        Mình mô phỏng thì cũng đã biết nhưng ko hiểu dựa trên nguyên lý nào mà nó ra như vậy !

                        Comment


                        • #13
                          Nguyên văn bởi vkdyenthanh Xem bài viết
                          Bạn có thể cho mình hỏi nếu như mình muốn xuất 8bit ra 1 chân vi điều khiển thì chân đó sẽ là 1 hay 0
                          Ví dụ như :mình cho P1^1= 0x5;
                          Mình mô phỏng thì cũng đã biết nhưng ko hiểu dựa trên nguyên lý nào mà nó ra như vậy !
                          bạn muốn hiểu rõ vấn đề này thì bạn phải học thêm assembly và xem kỹ lại cấu trúc vdk 8051. bản chất của lệnh P1^1 = 0x05 kia là một số lệnh assembly nhằm đặt giá trị 0x05 vào thanh ghi của I/O. Mình ko học assembly nên mình ko giải thích chi tiết đc.

                          Comment


                          • #14
                            x*=2 là x=x*2.
                            còn mấy lệnh có gạch dưới có thể là define, có thể là một hàm private,
                            còn cuối cùng là cách lệnh so sánh, 0x80 là mã hexa có nghĩa là 0000000010000000//lấy bit thứ 8 rồi so sánh
                            |

                            Comment


                            • #15
                              Nguyên văn bởi vkdyenthanh Xem bài viết
                              Bạn có thể cho mình hỏi nếu như mình muốn xuất 8bit ra 1 chân vi điều khiển thì chân đó sẽ là 1 hay 0
                              Ví dụ như :mình cho P1^1= 0x5;
                              Mình mô phỏng thì cũng đã biết nhưng ko hiểu dựa trên nguyên lý nào mà nó ra như vậy !
                              Đây là lệnh đẩy giá trị ra 1 chân IO, nó sẽ lấy bit cuối cùng của cái số bạn muốn đẩy, ví dụ trường hợp này tất cả các số lẻ sẽ đưa ra cùng 1 giá trị và cổng đó sẽ là 1, với tất cả các số chẵn thì giá trị cổng sẽ là 0.

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X