Thông báo

Collapse
No announcement yet.

Hỏi về lập trình C cho 8051( làm thế nào để biết các lệnh C dùng những thanh ghi gì)

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

  • Hỏi về lập trình C cho 8051( làm thế nào để biết các lệnh C dùng những thanh ghi gì)

    hello các bác.
    Mình đang học lập trình cho 8051, ở trường thì các thầy dạy dùng ASM . Được cái asem nó sát với VĐK nhất, làm việc cùng asem thì mình có thể hiểu các câu lệnh nó đang sử dụng những thanh ghi nào, truy suất dữ liệu từ các ô nhớ thế nào.

    Nhưng mà dùng asem thì hơi bị lăng nhằng, dài dòng và cũng khó nữa. Bây giờ mình thấy phần lớn lập trình cho 8051 đều dùng phần mềm Keil-C . Nó thì dùng ngôn ngữ C ( mình mới làm quen, nhưng cũng thấy là nó đỡ phức tạp hơn assembly). Nhưng có điều mình thắc mắc có cách nào để mình có thể biết các câu lệnh trong C thì nó dùng những ô nhớ, thanh ghi nào không
    ví dụ như là: Lệnh quay vòng FOR ở bên dưới ý

    #include <REGX51.H>
    #define tat 0
    #define bat 1
    /*==========================================*/
    sbit led1 = P1^0;
    void delay ( long time)
    { long n;
    for( n=0; n++; n<time )
    { // ko lam gi ca
    }
    }

    void main( void)
    {
    while(1)
    {
    led1 = bat;
    delay( 2000);
    led1 = tat;
    delay( 2000);
    }
    }

    Phải nói là các thầy cũng bảo nên nắm vững lập trình bằng asem trước vì nó là cơ bản và là nền móng. Còn sau đó mới phát triển lên C cho 8051 thì sẽ tôt hơn vì khi đó mình đã hiểu được bản chất các câu lệnh , các thanh ghi. Nhưng khi viết bằng C thì mình không biết xác định những thanh ghi .
    Mình mới tập tành vào vi điều khiển , có gì mọi ngừoi giúp với nhé

  • #2
    Hi,
    Để hiểu thêm về KeilC bác có thể xem file list đuôi LST sau khi biên dịch một chương trình đơn giản nào đó. Những câu lệnh C sẽ được chuyển qua ASM trong file list này để bác tiện so sánh và hiểu thêm.
    Thân ái.
    Đường đến những ngày vinh quang không còn xa
    Con đường chúng ta... chúng ta đã chọn.

    Comment


    • #3
      Bạn ơi
      mình mở file đuôi LST mà sao nó giống hệt như file soạn thảo bằng C thế
      đây này
      dieu khien led .LST.doc
      (mình thêm đuôi .doc)

      Comment


      • #4
        Để biết về thanh ghi sao bạn không dùng ngay ASM ấy ?

        Comment


        • #5
          hình như mình thấy file .map có report thì fai,bạn kiểm tra thử xem
          các vấn đề về sdcard, usb, tcp/ip, upgrate firmware,...
          trên các dòng chip: stm32, lpc of nxp
          please cell phone: 01649895559

          Comment


          • #6
            Nguyên văn bởi duong_act Xem bài viết
            Để biết về thanh ghi sao bạn không dùng ngay ASM ấy ?
            tức là dùng C thì muốn biết những điều đó là không thể hả bạn, thế tức là mình chả cần quan tâm đến các thanh ghi khi lập trình à. chả là mình lập trình C mấy bài mà gặp những lỗi mà mình không hiểu, hỏi thầy thì ông bảo " đấy là do anh đi tắt đón đầu mà không hiểu bản chất của nó", rồi bảo tự về học lại ( thế mới đau)

            Comment


            • #7
              126: ?C_STARTUP: LJMP STARTUP1
              127:
              128: RSEG ?C_C51STARTUP
              129:
              130: STARTUP1:
              131:
              132: IF IDATALEN <> 0
              C:0x0000 020048 LJMP STARTUP1(C:0048)
              C:0x0003 7F02 MOV R7,#0x02
              C:0x0005 7E00 MOV R6,#0x00
              C:0x0007 7D00 MOV R5,#0x00
              C:0x0009 7C00 MOV R4,#0x00
              7: void delay ( long time)
              C:0x000B 8F0B MOV 0x0B,R7
              C:0x000D 8E0A MOV 0x0A,R6
              C:0x000F 8D09 MOV 0x09,R5
              C:0x0011 8C08 MOV 0x08,R4
              8: { long n;
              9: for( n=0; n++; n<time )
              C:0x0013 E4 CLR A
              C:0x0014 F50F MOV 0x0F,A
              C:0x0016 F50E MOV 0x0E,A
              C:0x0018 F50D MOV 0x0D,A
              C:0x001A F50C MOV 0x0C,A
              C:0x001C 780C MOV R0,#0x0C
              C:0x001E 120028 LCALL C?LLDIIDATA1(C:0028)
              C:0x0021 EC MOV A,R4
              C:0x0022 4D ORL A,R5
              C:0x0023 4E ORL A,R6
              C:0x0024 4F ORL A,R7
              C:0x0025 70F5 JNZ C:001C
              10: { // ko lam gi ca
              11: }
              12: }
              13:
              C:0x0027 22 RET
              C?LLDIIDATA1:
              C:0x0028 7401 MOV A,#0x01
              C?LLDIIDATA8:
              C:0x002A FF MOV R7,A
              C:0x002B 33 RLC A
              C:0x002C 95E0 SUBB A,ACC(0xE0)
              C:0x002E FE MOV R6,A
              C:0x002F FD MOV R5,A
              C:0x0030 FC MOV R4,A
              C?LLDIIDATA:
              C:0x0031 08 INC R0
              C:0x0032 08 INC R0
              C:0x0033 08 INC R0
              C:0x0034 E6 MOV A,@R0
              C:0x0035 CF XCH A,R7
              C:0x0036 2F ADD A,R7
              C:0x0037 F6 MOV @R0,A
              C:0x0038 18 DEC R0
              C:0x0039 E6 MOV A,@R0
              C:0x003A CE XCH A,R6
              C:0x003B 3E ADDC A,R6
              C:0x003C F6 MOV @R0,A
              C:0x003D 18 DEC R0
              C:0x003E E6 MOV A,@R0
              C:0x003F CD XCH A,R5
              C:0x0040 3D ADDC A,R5
              C:0x0041 F6 MOV @R0,A
              C:0x0042 18 DEC R0
              C:0x0043 E6 MOV A,@R0
              C:0x0044 CC XCH A,R4
              C:0x0045 3C ADDC A,R4
              C:0x0046 F6 MOV @R0,A
              C:0x0047 22 RET
              133: MOV R0,#IDATALEN - 1
              C:0x0048 787F MOV R0,#0x7F
              134: CLR A
              C:0x004A E4 CLR A
              135: IDATALOOP: MOV @R0,A
              C:0x004B F6 MOV @R0,A
              136: DJNZ R0,IDATALOOP
              C:0x004C D8FD DJNZ R0,IDATALOOP(C:004B)
              185: MOV SP,#?STACK-1
              186:
              187: ; This code is required if you use L51_BANK.A51 with Banking Mode 4
              188: ;<h> Code Banking
              189: ; <q> Select Bank 0 for L51_BANK.A51 Mode 4
              190: #if 0
              191: ; <i> Initialize bank mechanism to code bank 0 when using L51_BANK.A51 with Banking Mode 4.
              192: EXTRN CODE (?B_SWITCH0)
              193: CALL ?B_SWITCH0 ; init bank mechanism to code bank 0
              194: #endif
              195: ;</h>
              C:0x004E 75810F MOV SP(0x81),#0x0F
              196: LJMP ?C_START
              C:0x0051 020054 LJMP main(C:0054)
              14: void main( void)
              15: {
              16: while(1)
              17: {
              18: led1 = bat;
              C:0x0054 D290 SETB led1(0x90.0)
              19: delay( 2);
              C:0x0056 120003 LCALL C:0003
              20: led1 = tat;
              C:0x0059 C290 CLR led1(0x90.0)
              21: delay( 2);
              C:0x005B 120003 LCALL C:0003
              22: }
              C:0x005E 80F4 SJMP main(C:0054)
              Mình cuối cùng cũng tìm ra cái disassembly trong keilC rồi
              nhưng nó lằng nhằng quá, khó hiểu ghê, bác nào giải thích mình với . hì hì

              Comment


              • #8
                Nguyên văn bởi havian Xem bài viết
                tức là dùng C thì muốn biết những điều đó là không thể hả bạn, thế tức là mình chả cần quan tâm đến các thanh ghi khi lập trình à. chả là mình lập trình C mấy bài mà gặp những lỗi mà mình không hiểu, hỏi thầy thì ông bảo " đấy là do anh đi tắt đón đầu mà không hiểu bản chất của nó", rồi bảo tự về học lại ( thế mới đau)
                Dĩ nhiên là khi lập trình C cần phải biết 1 số hiểu biết nhất định về phần cứng chứ không thể mù tịt được.
                Mà C gặp lỗi về thanh ghi là thế nào nhỉ ? Chư gặp bao giờ

                Comment


                • #9
                  Vậy tức là Lập trình bằng C không cần quan tâm thanh ghi nhỉ!!

                  Vậy tốt rồi, Cám ơn anh em trong diễn đàn đã giải đáp giúp mình. Thực ra mình mới học lập trình cho VĐK nên thấy ông thì bảo phải nắm chắc Asem rồi mới nên học C, có ông thì bảo dùng Asem thì không giúp gì nhiều cho C , khỏi phải biết rõ quá.

                  Giờ thì mình đã tìm ra con đường , học qua Asem để biết nguyên lý cơ bản của VĐK rồi chuyển ngay qua C cho nó lành. Khỏi phải đi xâu vào Asem làm gì cho nó mệt đầu, hiệu quả thấp

                  Thank các bác(

                  Comment


                  • #10
                    có ai biết đoạn code này bị làm sao mà cảng P0 không sáng chỉ giáo hộ tôi "
                    #include<reg51.h>
                    void delay(unsigned int ms)
                    {
                    unsigned int a;
                    unsigned char b;
                    for(a=0;a<ms;a++)
                    {
                    for(b=0;b<125;b++)
                    {
                    }
                    }
                    }
                    main()
                    {
                    while (1)
                    {
                    P0=P1=P2=P3=0xff;
                    delay(300);
                    P0=P1=P2=P3=0x00;
                    delay(300);
                    }
                    }
                    xin gữi " quangmanhvkhk@gmail.com "
                    1+1=0 nhớ 1

                    Comment


                    • #11
                      Nguyên văn bởi quangmanhvk Xem bài viết
                      ...
                      Chắc là do phần cứng thôi. Bạn mắc thêm trở treo lên Port 0 nhé.

                      Comment


                      • #12
                        Nguyên văn bởi quangmanhvk Xem bài viết
                        có ai biết đoạn code này bị làm sao mà cảng P0 không sáng chỉ giáo hộ tôi "
                        #include<reg51.h>
                        void delay(unsigned int ms)
                        {
                        unsigned int a;
                        unsigned char b;
                        for(a=0;a<ms;a++)
                        {
                        for(b=0;b<125;b++)
                        {
                        }
                        }
                        }
                        main()
                        {
                        while (1)
                        {
                        P0=P1=P2=P3=0xff;
                        delay(300);
                        P0=P1=P2=P3=0x00;
                        delay(300);
                        }
                        }
                        xin gữi " quangmanhvkhk@gmail.com "
                        thiếu trở băng treo chứ còn sao

                        Comment


                        • #13
                          Lắp led theo chiều VCC -> led -> vdk , đảm bảo sáng ngay k cần trở treo !

                          Comment


                          • #14
                            ai có code về led cube không cho tui với loai 5x5x5 or 8x8x8 tìm hiểu về nó khó quá " quangmanhvkhk@gmail.com"
                            1+1=0 nhớ 1

                            Comment


                            • #15
                              giup em chuong trinh c nay voi!

                              Mọi người giúp mình với. Mình đã lập trình được khi bấm công tắc thì mở LCD, còn giờ muốn bấm công tắc để LCD tắt thì làm sao ạ,chức năng giống như nút ON/OFF. Mọi người ai giỏi lập trình giúp mình với. thank! Đây là code mình viết:
                              #include<reg52.h>
                              #include<stdio.h>
                              #include<intrins.h>
                              #include<math.h>
                              #include<stdlib.h>
                              #define bat 1
                              #define tat 0
                              sbit ctac = P3^0;
                              unsigned char dem=1;
                              sbit RS = P1^0;
                              sbit RW = P1^1;
                              sbit EN = P1^2;
                              sbit f = P3^3;
                              sbit b = P3^1;
                              sbit c1=P0^4;
                              sbit c2=P0^5;
                              sbit c3=P0^6;
                              sbit c4=P0^7;
                              unsigned char x;
                              unsigned char message[32];
                              unsigned char i,k;

                              void delay(unsigned long int t)
                              {
                              unsigned long int i;
                              for(i = 0; i<=t; ++i);
                              }
                              /*void phimnhan(void)
                              { if(ctac==0)
                              {delay(100);
                              while(ctac==0);
                              delay(100);
                              dem++;
                              }
                              } */
                              void busy_flag (void)
                              {
                              P2 = 0xff;
                              RS = 0;
                              RW = 1;
                              do
                              {
                              EN = 1;;
                              delay (10);
                              EN = 0;
                              x = P2;
                              x = x&0x80;
                              }
                              while(x!= 0x80);
                              }
                              void write_command (unsigned char lcd_command)
                              {
                              busy_flag();
                              P2 = lcd_command;
                              RS = 0;
                              RW = 0;
                              EN = 1;
                              delay(10);
                              EN = 0;
                              delay(10);
                              }
                              void write_data(unsigned char LCD_data) // thanh ghi du lieu
                              {
                              busy_flag();
                              if(LCD_data!='\n')
                              {
                              P2=LCD_data;
                              }
                              else
                              {
                              write_command(0xC0);
                              return;
                              }
                              RS=1;
                              RW=0;
                              EN=1;
                              delay(80);
                              EN=0;
                              delay(80);
                              }
                              void write_string(char *s)
                              {
                              while(*s)
                              {
                              write_data(*s);
                              s++;
                              }
                              }
                              void init (void)
                              {
                              write_command(0x03); //
                              write_command(0x38);
                              write_command(0x06);
                              write_command(0x0e);
                              }

                              void hienthi()
                              {
                              /*if(P0==0xee){write_command(0x01);
                              write_command(0x80);
                              write_string(" phim so 1 ");
                              P3=0xf1;} */

                              /*if(P0==0xde){write_command(0x01);
                              write_command(0x80);
                              write_string(" \n phim so 2 ");P3=0xf2;} */

                              if(P0==0xbe){write_command(0x01);
                              write_command(0x80);
                              write_string(" ON ");
                              write_command(0x0c);}

                              if(P0==0x7e){write_command(0x01);
                              write_command(0x80);
                              write_string(" OFF ");
                              write_string(" 3 "); delay(500); write_command(0x01);
                              write_string(" 2 "); delay(500);write_command(0x01);
                              write_string(" 1 "); delay(500); write_command(0x01);
                              write_command(0x08);
                              return; }

                              /*if(P0==0xed){write_command(0x01);
                              write_command(0x80);
                              write_string(" phim so 5 ");}

                              if(P0==0xdd){write_command(0x01);
                              write_command(0x80);
                              write_string(" phim so 6 ");} */

                              if(P0==0xbd){write_command(0x01);
                              write_command(0x80);
                              write_string(" VOLUME+ ");}

                              if(P0==0x7d){write_command(0x01);
                              write_command(0x80);
                              write_string(" VOLUME- ");}

                              /*if(P0==0xeb){write_command(0x01);
                              write_command(0x80);
                              write_string(" phim so 9 ");}

                              if(P0==0xdb){write_command(0x01);
                              write_command(0x80);
                              write_string(" phim so 10 ");} */

                              if(P0==0xbb){write_command(0x01);
                              write_command(0x80);
                              write_string(" UP ");}

                              if(P0==0x7b){write_command(0x01);
                              write_command(0x80);
                              write_string(" DOWN ");}

                              /*if(P0==0xe7){write_command(0x01);
                              write_command(0x80);
                              write_string(" phim so 13 ");}

                              if(P0==0xd7){write_command(0x01);
                              write_command(0x80);
                              write_string(" phim so 14 ");} */

                              if(P0==0xb7){write_command(0x01);
                              write_command(0x80);
                              write_string(" ENTER ");}

                              if(P0==0x77)
                              {
                              write_command(0x01);
                              write_command(0x80);
                              sprintf(&message[0],"ESC");
                              write_string(&message[0]);P3=0x00;
                              }
                              }
                              void dieukhien(void)
                              {
                              int n[5] = {0xfe,0xfd,0xfb,0xf7};
                              for (i=0; i<=3;++i)
                              {
                              P0 = n[i];
                              hienthi();

                              }
                              }
                              /* Lenh cuon tang tuyen tinh

                              k = 0xfe;
                              for(i=0;i<=3;++i)
                              {
                              P0 = k;
                              k = _crol_(k,1);
                              }*/


                              void main (void)
                              {

                              while(1)

                              if(ctac==0)
                              {


                              delay(100);
                              init();
                              write_command(0x01);
                              write_command(0x80);
                              sprintf(&message[0]," CAM BIEN\nHONG NGOAI_LCD");
                              write_command(0x0c);
                              write_string(&message[0]);
                              /*while(ctac==1)
                              {
                              //delay(100);
                              write_command(0x08);
                              } */
                              while(1)

                              {
                              dieukhien();
                              delay(10);

                              }

                              }
                              }Click image for larger version

Name:	vdk.jpg
Views:	2
Size:	147.5 KB
ID:	1370066

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X