Thông báo

Collapse
No announcement yet.

89C51 + ASM : quyét led 7 đoạn

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

  • #16
    Nguyên văn bởi mr.ngoc Xem bài viết
    đâu có j đâu! ctr của e ở trên e viết JNB SW1,HIENTHI1
    trong hàm HIENTHI1 e dùng câu lệnh RET vẫn đc đó mà!
    Bạn thử chèn vào giữa câu lệnh JNB SW1,HIENTHI1 và nhãn HIENTHI1 một đoạn chương trình dài thử xem có chuyện gì không?
    Ý mình là RET là kết thúc cho một đoạn chương trình con, nếu như vậy các đoạn chương trình trên bạn viết mà kết thúc bằng RET là chương trình con, lệnh JNB SW1, "nhãn" là lệnh rẻ nhánh, VĐK xét thoả điều kiện thì nhảy đến "nhãn" chứ không phải là lệnh gọi chương trình con, do vậy bạn dùng lệnh JNB ... để gọi một chương trình con là không hợp lý. Khi bạn viết những chương trình dài bạn sẽ thấy dùng lệnh JNB để gọi ct con là teo ngay. Mình nói bạn dùng lệnh không hợp lý chứ không nói là sai, OK.
    Chúc vui.

    Comment


    • #17
      À, theo như doanhatphong phân tích thì mình đẽ đem "râu ông này cắm cằm bà kia" nhỉ? Vậy không dùng RET thì dùng lệng gì nhỉ. Mình thay RET bằng SJMP SUB1 thì ổn ko nhỉ? Vẫn nhảy thôi nhỉ chứ không phải là gọi chương trình con. À mà kết thúc SUB1 thì cũng ko cần lệnh RET đúng ko. Vậy lúc đó mình muốn ct cứ chạy liên tụcc thì lại gọi SJMP MAIN?

      Comment


      • #18
        Xong rồi, code hoàn chỉnh đây, cảm ơn mọi người đã giúp
        Code:
            ORG 0000h
            LJMP MAIN
            ORG 0030H
        MAIN:
            JNB    P1.0, DPL1
            JNB    P1.1, DPL2
            JNB    P1.2, DPL3
            JNZ    SUB1
            SJMP    MAIN
            
        DPL1:
            MOV     A, #1
            SJMP    SUB1
        DPL2:
            MOV    A, #5
            SJMP    SUB1
        DPL3:
            MOV     A, #9
            SJMP    SUB1
        SUB1:
            MOV    DPTR, #BANG1
            mov    r0, a
            mov    r1, a
        
            MOVC    A, @A + DPTR
            MOV    P2, A
            setb    P3.2
            CALL    DELAY
            clr    P3.2
            INC    r0
        
            mov     a, r0
            MOVC    A, @A + DPTR
            MOV    P2, A
            setb    P3.3
            CALL    DELAY
            clr    P3.3
            INC    r0
        
            mov     a, r0
            MOVC    A, @A+ DPTR
            MOV    P2, A
            setb    P3.4
            CALL    DELAY
            clr    P3.4
            INC    r0
        
            mov    a, r0
            MOVC    A, @A + DPTR
            MOV    P2, A
            setb    P3.5
            CALL    DELAY
            clr    P3.5
            mov    a, r1
            SJMP    MAIN
        
        DELAY:
            PUSH    06
            PUSH    07
            MOV    R6, #50
        X1:    MOV    R7, #50
            DJNZ    R7, $
            DJNZ    R6, X1
            POP    07
            POP    06
            RET
        
        BANG1:    DB    00h, 8cH, 83H, 0C7H, 89H, 82H, 0A6H, 0A6H, 98H, 0ffh, 0ffh, 0ffh, 0ffh
        
        
        END
        @doanhatphong: anh phân tích lỗi chỗ lệnh RET dùm em xem? Sao bị lỗi kì thể nhỉ? Lệnh RET nó chạy ra sao?

        Comment


        • #19
          Nguyên văn bởi vaa_dtvn Xem bài viết
          Xong rồi, code hoàn chỉnh đây, cảm ơn mọi người đã giúp
          Code:
              ORG 0000h
              LJMP MAIN
              ORG 0030H
          MAIN:
              JNB    P1.0, DPL1
              JNB    P1.1, DPL2
              JNB    P1.2, DPL3
              JNZ    SUB1
              SJMP    MAIN
              
          DPL1:
              MOV     A, #1
              SJMP    SUB1
          DPL2:
              MOV    A, #5
              SJMP    SUB1
          DPL3:
              MOV     A, #9
              SJMP    SUB1
          SUB1:
              MOV    DPTR, #BANG1
              mov    r0, a
              mov    r1, a
          
              MOVC    A, @A + DPTR
              MOV    P2, A
              setb    P3.2
              CALL    DELAY
              clr    P3.2
              INC    r0
          
              mov     a, r0
              MOVC    A, @A + DPTR
              MOV    P2, A
              setb    P3.3
              CALL    DELAY
              clr    P3.3
              INC    r0
          
              mov     a, r0
              MOVC    A, @A+ DPTR
              MOV    P2, A
              setb    P3.4
              CALL    DELAY
              clr    P3.4
              INC    r0
          
              mov    a, r0
              MOVC    A, @A + DPTR
              MOV    P2, A
              setb    P3.5
              CALL    DELAY
              clr    P3.5
              mov    a, r1
              SJMP    MAIN
          
          DELAY:
              PUSH    06
              PUSH    07
              MOV    R6, #50
          X1:    MOV    R7, #50
              DJNZ    R7, $
              DJNZ    R6, X1
              POP    07
              POP    06
              RET
          
          BANG1:    DB    00h, 8cH, 83H, 0C7H, 89H, 82H, 0A6H, 0A6H, 98H, 0ffh, 0ffh, 0ffh, 0ffh
          
          
          END
          @doanhatphong: anh phân tích lỗi chỗ lệnh RET dùm em xem? Sao bị lỗi kì thể nhỉ? Lệnh RET nó chạy ra sao?
          Trong sách có nói về cách thức hoạt động của lệnh rẻ nhánh (jnb; djnz; jc...), các lệnh nhảy sjmp; ljmp... các lệnh gọi ct con CALL và khi kết thúc ct con _ lệnh RET hoặc RETI, khi đọc nguyên tắc hoạt động của các lệnh này bạn lưu ý nó tác động như thế nào đối với thanh ghi PC (program counter), SP (stack pointer) bạn sẽ hiểu được lỗi khó hiểu trên.
          Chúc vui.

          Comment


          • #20
            thứ nhất chưa từng thấy lệnh jnz =>sai chữa thành call
            thứ 2 không biết trong bang1 bạn để giá trị 00h làm gì thừa, nên xóa và thay vì mov a,#1 thì thay bằng clr a
            có thể lổi đó là do đáp ứng của mô phỏng không được tốt, chứ code như vậy mà chạy được mấy vòng đầu là được rồi.
            mình cũng đã mô phỏng mạch quét lần 4 led 7 thanh nhưng do mô phỏng không đáp ứng được thời gian nên chạy một lúc là đơ luôn. còn nạp vào mach thật thì chạy ok

            Comment


            • #21
              Nguyên văn bởi trinhtuan89 Xem bài viết
              thứ nhất chưa từng thấy lệnh jnz =>sai chữa thành call
              _ Nếu bạn dùng lệnh call thì trong ct chính khi VDK gặp lệnh này nó sẽ làm vài việc trong đó có việc quang trọng nhất là tăng thanh ghi PC lên 2 hoặc 3 byte sau đó nó lưu lại và nhảy ngay đến ch][ng trình con thực hiện xong ct con nó gặp lệnh RET thì nó phải biết đường quay lại ct chính nơi mà nó ra đi bằng cách lấy lại giá trị thanh ghi PC hồi nãy nó lưu.
              _ Nếu bạn goi ct con bằng lệnh JNB trước khi VDK nhảy nó có lưu lại giá trị của thanh ghi PC hay không? Và khi nó nhảy đến nhãn và thực hiện xong đoạn ct bạn viết rồi gặp lệnh RET thì nó quay về chương trình chính bằng cách nào? Địa chỉ mà nó quay lại ct chính là bao nhiêu? có chính xác không?
              _ Khi bạn làm những bài điều khiển đơn giản như hiển thị, mấy cái nút bấm,... bạn không nghĩ đến điều mình nói ở trên nhưng nếu bạn cần một chương trình điều khiển thật chính xác và liên quan đến các vấn đề an toàn thì dùng lệnh JNB để gọi ct con là có vấn đề đấy.
              Chúc vui

              Comment


              • #22
                Nguyên văn bởi trinhtuan89 Xem bài viết
                thứ nhất chưa từng thấy lệnh jnz =>sai chữa thành call
                thứ 2 không biết trong bang1 bạn để giá trị 00h làm gì thừa, nên xóa và thay vì mov a,#1 thì thay bằng clr a
                có thể lổi đó là do đáp ứng của mô phỏng không được tốt, chứ code như vậy mà chạy được mấy vòng đầu là được rồi.
                mình cũng đã mô phỏng mạch quét lần 4 led 7 thanh nhưng do mô phỏng không đáp ứng được thời gian nên chạy một lúc là đơ luôn. còn nạp vào mach thật thì chạy ok
                1.Mình ko hiểu ý bạn lắm. Mình đâu có sửa lệnh JNZ thành CALL đâu, toàn bộ ct của mình chỉ có một chương trình con duy nhất là DELAY thôi, và chỉ có gọi DELAY mình mới dùng lệnh CALL thôi
                2.Mình cố tình chèn thêm giá trị 00h vao báng vì minh dung gia tri tại vị trí đầu tiên của bảng đó làm giá trị so sánh. Đầu tiên mình làm theo hướng khi bấm nút nào thì ghi giá trị tương ứng 0, 4, 8 vào thanh ghi A để xác định vị trí dữ liệu sẽ quét từ A đến A + 3 (quét 4 led 7 đoạn). Nhưng lại gặp vấn đề chỗ lệnh JNB và RET như anh phong đã phân tích nên mình thay đổi một chút. Mình lấy luôn A làm điều kiện. Có nghĩa là khi bấm nút thì giá trị được ghi vào A sẽ là 1, 5, 9 thay vì 0, 4, 8 như trước. Như vậy khi không bấm gì hết thì mình cho A = 0, khi bấm thì A khác 0 và thực hiện tiếp tục nhảy đến đoạn hiển thị các giá trị đó ra màn hình tức là A khác 0 thì nhảy đến SUB1. Do đó mình buộc phải đấy dữ liệu lùi lại 1 vị trí, vị trí đầu tiên mình chèn 00h vào.
                P.S: mình học PIC và chủ yếu chỉ mới làm mạch với PIC nên đồ nghề (mạch nạp, soft,....) cho 89C51 mình chưa có nên không có điều kiện nạp mạch chạy thử. Nhất định khi nào vọc xong PIC sẽ nhảy sang 89 dù mình học Điện tử viễn thông nhưng cũng mê mấy con VĐK này lắm. Chắc đã chọn lộn ngành
                Nguyên văn bởi doanhatphong Xem bài viết
                _ Nếu bạn dùng lệnh call thì trong ct chính khi VDK gặp lệnh này nó sẽ làm vài việc trong đó có việc quang trọng nhất là tăng thanh ghi PC lên 2 hoặc 3 byte sau đó nó lưu lại và nhảy ngay đến ch][ng trình con thực hiện xong ct con nó gặp lệnh RET thì nó phải biết đường quay lại ct chính nơi mà nó ra đi bằng cách lấy lại giá trị thanh ghi PC hồi nãy nó lưu.
                _ Nếu bạn goi ct con bằng lệnh JNB trước khi VDK nhảy nó có lưu lại giá trị của thanh ghi PC hay không? Và khi nó nhảy đến nhãn và thực hiện xong đoạn ct bạn viết rồi gặp lệnh RET thì nó quay về chương trình chính bằng cách nào? Địa chỉ mà nó quay lại ct chính là bao nhiêu? có chính xác không?
                _ Khi bạn làm những bài điều khiển đơn giản như hiển thị, mấy cái nút bấm,... bạn không nghĩ đến điều mình nói ở trên nhưng nếu bạn cần một chương trình điều khiển thật chính xác và liên quan đến các vấn đề an toàn thì dùng lệnh JNB để gọi ct con là có vấn đề đấy.
                Chúc vui
                Cảm ơn anh, em đã hiểu sơ sơ về vấn đề rồi. Em nghĩ muốn hiểu kĩ hơn thì phải tìm hiểu xem con uC sẽ làm gì khi gặp lệnh đó. À mà sao con 89 này datasheet của nó sơ sài quá, em down trên alldatasheet về chỉ có 18-20 trang thôi, trong khi datasheet của pic thì có tầm 200trang và phân tích kĩ hơn về các chức năng, hoạt động của PIC trong từng chức năng. Điều này khiến cho em gặp một số khó khăn khi muốn tìm hiểu thêm một vấn đề nào đó. Thực ra em cũng có một số sách tiếng Việt và tài liệu do thầy cung cấp, nhưng em thấy rằng tài liệu tiếng Anh thường viết rất chi tiết và dễ hiểu hơn. Hơn nữa datasheet từ chính nhà cung cấp chắc chắn sẽ cho ta nhiều thông tin chính xác hơn là các tài liệu khác!

                Comment


                • #23
                  rồi giờ mới hiểu ý định của bạn. nhưng theo mình bạn nên viết chương trình của bạn thành các chương trình con. còn giải thuật kiểu đó thì sau này khó viết các chương trình lớn lắm. còn sách về lập trình cho họ 8051 thì có hai cuốn bằng tiếng việt bạn có thể xem nó cũng gần như nói đầy đủ về chức năng và cách giao tiếp của 8051. đó là cuốn của thầy hồ trung mỹ và cuốn của thầy tống văn on. nếu bạn học điện tữ viễn thông mà đi theo chuyên ngành điện tử thì cũng cần đến nó đấy

                  Comment


                  • #24
                    Nguyên văn bởi vaa_dtvn Xem bài viết

                    Em nghĩ muốn hiểu kĩ hơn thì phải tìm hiểu xem con uC sẽ làm gì khi gặp lệnh đó. À mà sao con 89 này datasheet của nó sơ sài quá, em down trên alldatasheet về chỉ có 18-20 trang thôi, trong khi datasheet của pic thì có tầm 200trang và phân tích kĩ hơn về các chức năng, hoạt động của PIC trong từng chức năng. Điều này khiến cho em gặp một số khó khăn khi muốn tìm hiểu thêm một vấn đề nào đó. Thực ra em cũng có một số sách tiếng Việt và tài liệu do thầy cung cấp, nhưng em thấy rằng tài liệu tiếng Anh thường viết rất chi tiết và dễ hiểu hơn. Hơn nữa datasheet từ chính nhà cung cấp chắc chắn sẽ cho ta nhiều thông tin chính xác hơn là các tài liệu khác!
                    Hoan hô bạn, mình chắc chắn bạn sẽ thành công với những suy nghĩ như vậy.

                    Comment


                    • #25
                      Hai cuốn sách tiếng Việt mà bạn trinhtuan89 mình đã có và đã xem sơ qua, nhưng mình thấy viết rất "đánh đố" , với lại mình vẫn thích ngâm sách tiếng Anh hơn, nhất là datasheet. Không phải mình có ý chê sách nội mà nguyên nhân là do sách mình được biên dịch lại, cùng một cuốn sách nhưng mỗi người một ý, một cách hiều. Thế là có nhiều sách khác nhau ra đời, mà bằng chứng là mình thấy nhiều sách có cấu trúc, nội dung rất giống nhau dù khác tác giả! Và mình muốn tìm cái chính xác nhất để có thể hiểu rõ và đúng về vấn đề thôi chứ thực ra mình rất thích đọc sách và cũng không có thành kiến hay chê sách nội. Nếu một cuốn sách nội viết thật sự chất lượng thì mình sẵn sàng bỏ tiền ra mua về đọc!

                      P.S: các bạn có cuốn e-book nào về 89C51 ko, giời thiệu hay share cho mình với!

                      Comment


                      • #26
                        mình thì chỉ có cuốn của thầy on thôi. nhưng bạn nói bạn chỉ thích ngâm cứu sách ngoại thì thôi. bạn nào có thì upload lên giúp bạn đó cái.

                        Comment

                        Về tác giả

                        Collapse

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

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

                        Collapse

                        • tuyennhan
                          Trả lời cho Tiếng Anh cho người Việt
                          bởi tuyennhan
                          Cái thư sai ngay câu chào Dear sir mới đúng Hi chỉ dùng cho người quen , các vấn đề về kỹ thuật nó không trả lời hoặc nói loanh quanh tránh ảnh hưởng đến công ty .
                          Giup1 người cần không giúp người không cần với lại văn mình vợ người nha đừng quên .
                          hôm nay, 07:44
                        • vi van pham
                          Trả lời cho Tiếng Anh cho người Việt
                          bởi vi van pham
                          Cám ơn những lời chúc tốt đẹp của em.

                          Việc em làm giống như chê sếp dốt, chẳng những không có miếng xôi nào để ăn mà còn chịu nhiều trù dập lên bờ , xuống ruộng.

                          Hãy tránh vết xe đổ của tui đi. Dành thời gian lo cho gia đình....
                          hôm nay, 02:00
                        • nhathung1101
                          Trả lời cho Tiếng Anh cho người Việt
                          bởi nhathung1101
                          Ngoại ngữ là không thể thiếu, nhất là làm việc với công nghệ.

                          Nhưng học để tán gái hay để đọc datasheet, manual là chuyện cần quan tâm.

                          Và đọc ở nguồn nào đáng tin cậy, chứ cứ lên tictok hay facebook học lỏm thì...
                          Hôm qua, 22:18
                        • dinhthuong80
                          Trả lời cho Tiếng Anh cho người Việt
                          bởi dinhthuong80
                          Bác nói rất khách quan và chính xác. Ngoại ngữ là chìa khóa thăng tiến dù làm gì. Chả thế mà nay nước mình dạy tiếng Anh từ tiểu học.

                          Nhớ hồi năm 2006 em ra Hải Phòng, Hải Dương tìm việc, thời đó ở Bình Dương lương công...
                          Hôm qua, 14:51
                        • dinhthuong80
                          Trả lời cho Tiếng Anh cho người Việt
                          bởi dinhthuong80
                          Cảm ơn bạn, ĐT cũng có ý nghĩ như vậy.

                          Thực ra, lỗi của hãng đó ( gọi là hãng vì không chỉ một model sản phẩm) là về phần cứng, ĐT tuy không biết về lập trình phần mềm nhưng cũng thấy rằng sẽ chẳng khó khăn gì đáng...
                          Hôm qua, 14:39
                        • dinhthuong80
                          Trả lời cho Tiếng Anh cho người Việt
                          bởi dinhthuong80
                          Dạ, bác bảy mấy tuổi đời rồi cũng không kém bố cháu bao nhiêu. Tuổi nghề thì bác cũng đáng tuổi cha chú.

                          Nhưng 2 điều trên thì chưa hẳn đã đáng quí và đáng tôn trọng bằng việc bác rất nhiệt tình chia sẻ kinh nghiệm chuyên...
                          Hôm qua, 14:28
                        • bqviet
                          Trả lời cho Tiếng Anh cho người Việt
                          bởi bqviet
                          Đúng, nếu chú tâm thì chỉ cần mỗi tiếng Việt là đã khá đủ để làm đa số công việc thông thường, ở thời đại ngày nay khi tài liệu sách vở phương tiện thông tin liên lạc đã nhiều. Nhưng cũng chính ở thời nay giao lưu các nước nhiều...
                          21-02-2025, 20:26
                        • mèomướp
                          Trả lời cho Tiếng Anh cho người Việt
                          bởi mèomướp
                          Dạ cháu nghĩ chú dinh... cứ mạnh dạn gửi thư đi ạ, chú có thể gửi bằng văn bản in chuyển phát nhanh sẽ có giá trị hơn. Vấn đề chưa hẳn là cần hãng làm gì đó, mà chỉ đơn giản là mình cảm thấy nhẹ lòng vì đã làm những việc bản...
                          21-02-2025, 12:32
                        • vi van pham
                          Trả lời cho Tiếng Anh cho người Việt
                          bởi vi van pham
                          Những lần hắt hơi sổ mũi làm tôi mệt lã, phải dùng rượu uống để ngũ. Tôi cũng đang uống rượu 1 mình, viết vài dòng này cho em ( có lẽ dt chỉ bằng tuổi em tôi).

                          Dinh thuong dang đi vào vết xe đổ của tôi. Càng chứng minh, có...
                          20-02-2025, 21:31
                        • bqviet
                          Trả lời cho Hỏi về cách hàn linh kiện ( giúp tớ với )
                          bởi bqviet
                          Thiết nghĩ thi thoảng bác lên đây chia xẻ ít kinh nghiệm cũng vui rồi. Còn chuyện con người sinh lão bệnh tử là thường, sống cùng với quy luật đó thôi. Bqv nhớ trước đây bác từng kể về chuyện rang chì ô-xít bằng chảo để phục hồi bình điện, đấy cũng là thành quả đáng nể phục ở thời kỳ thiếu thốn đó.
                          20-02-2025, 17:22
                        Đang tải...
                        X