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

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

    Các bác xem hộ em cái này ạ. Em viết cho 89C51 mà sao nó ko chạy. Trước đây em học PIC, bị mấy ông thầy trong trường đè đầu cởi cổ bắt học con này. Giờ đang vật vã với nó đây ạ. Viết cái chương trình mà nó biên dịch bị lỗi, em gởi code lên, nhờ các cao thủ giúp hộ em ạ.

    Code:
        ORG 0000h
        LJMP MAIN
        ORG 0030H
    MAIN:
        JNB    P1.0, DPL1
        JNB    P1.1, DPL2
        JNB    P1.2, DPL3
    DPL1:
        MOV     A, #0
        CALL    DPL
    DPL2:
        MOV    A, #4
        CALL    DPL
    DPL3:
        MOV     A, #8
        CALL     DPL
    DPL:
        MOV    DPTR, #BANG1
        MOV    P2, @DPTR + A
        CLR    P3.2
        CALL    DELAY
        SET    P3.2
        INC    A
        MOV    P2, @DPTR + A
        CLR    P3.3
        CALL    DELAY
        SET    P3.3
        INC    A
        MOV    DPTR, #BANG1
        MOV    P2, @DPTR + A
        CLR    P3.4
        CALL    DELAY
        SET    P3.4
        INC    A
        MOV    P2, @DPTR + A
        CLR    P3.5
        CALL    DELAY
        SET    P3.5
        CALL     MAIN
    
    BANG1:    DB    0CH, 03H, 0E6H, 09H, 02H, 0A6H, 0A6H, 18H
    
    DELAY:
        PUSH    06
        PUSH    07
        MOV    R6, #255
    X1:    MOV    R7, #255
        DJNZ    R7, $
        DJNZ    R6, X1
        POP    07
        POP    06
        RET
    END
    sơ đồ mạch đây ạ.
    Click image for larger version

Name:	Untitled.jpg
Views:	1
Size:	300.4 KB
ID:	1407874

  • #2
    Nguyên văn bởi vaa_dtvn Xem bài viết
    Các bác xem hộ em cái này ạ. Em viết cho 89C51 mà sao nó ko chạy. Trước đây em học PIC, bị mấy ông thầy trong trường đè đầu cởi cổ bắt học con này. Giờ đang vật vã với nó đây ạ. Viết cái chương trình mà nó biên dịch bị lỗi, em gởi code lên, nhờ các cao thủ giúp hộ em ạ.

    Code:
        ORG 0000h
        LJMP MAIN
        ORG 0030H
    MAIN:
        JNB    P1.0, DPL1
        JNB    P1.1, DPL2
        JNB    P1.2, DPL3
    DPL1:
        MOV     A, #0
        CALL    DPL
    DPL2:
        MOV    A, #4
        CALL    DPL
    DPL3:
        MOV     A, #8
        CALL     DPL
    DPL:
        MOV    DPTR, #BANG1
        MOV    P2, @DPTR + A
        CLR    P3.2
        CALL    DELAY
        SET    P3.2
        INC    A
        MOV    P2, @DPTR + A
        CLR    P3.3
        CALL    DELAY
        SET    P3.3
        INC    A
        MOV    DPTR, #BANG1
        MOV    P2, @DPTR + A
        CLR    P3.4
        CALL    DELAY
        SET    P3.4
        INC    A
        MOV    P2, @DPTR + A
        CLR    P3.5
        CALL    DELAY
        SET    P3.5
        CALL     MAIN
    
    BANG1:    DB    0CH, 03H, 0E6H, 09H, 02H, 0A6H, 0A6H, 18H
    
    DELAY:
        PUSH    06
        PUSH    07
        MOV    R6, #255
    X1:    MOV    R7, #255
        DJNZ    R7, $
        DJNZ    R6, X1
        POP    07
        POP    06
        RET
    END
    sơ đồ mạch đây ạ.
    [ATTACH=CONFIG]25359[/ATTACH]
    code này là full chưa vậy?
    Chứ như thế này nếu viết bằng chương trình Read51 sau đó compile ra file *hex thì chương trình không chạy được đâu.
    Thiếu phần cơ bản nhất: khai báo tập lệnh cho con c51: include<sfr51.inc>. Mà sao mô phỏng bạn dùng nhiều con led7 đoạn vay? kiểm soát một con thôi. hic. Từ khóa là 7SEG thì phải.
    Thêm điều nữa là sau khi học lập trình assem cho con 51 thì bạn thấy bạn sẽ hiểu rõ về con VDK hơn là lập trình C.
    Mong bạn có thái độ đúng với môn học. hehe. Nếu là bị ép thì bạn bị ép đến trường từ lúc đi nhà trẻ cơ .....
    - Đầu tư cho giáo dục là đầu tư có lãi nhất - :))

    Comment


    • #3
      À, code mình viết full đấy chứ. Viết theo cấu trúc trong tài liệu ông thầy đưa cho. Kì vậy nhỉ?
      Ủa mà cái dòng include<sfr51.inc> đó nhét vô đâu. Mình viết ASM mà cũng có lệnh include à, lạ nhỉ!?
      Bài tập ổng giao cho là nguyên cái mạch vậy đó bạn, sao cắt bớt led đc.
      P.S: nói cho vui vậy thôi chứ đâu có ghét gì môn vi điều khiển này đâu, chỉ là đang học PIC tự dưng bị bắt học lại 89 nên hơi bị sốc.
      Last edited by vaa_dtvn; 18-10-2010, 18:57.

      Comment


      • #4
        Phù, cuối cùng cũng tìm ra được lỗi. Ôi, bài đầu tiên làm gian nan thật.
        @ trungdtd711: không cần thêm dòng include đó nó vẫn chạy. Chắc bác nhầm lẫn chỗ nào rồi. Hèn chi thấy lạ quá, nào h chưa từng thấy lệnh đó trong ASM.
        Chương trình viết lại đây:
        Code:
            ORG 0000h
            LJMP MAIN
            ORG 0030H
        MAIN:
            JNB    P1.0, DPL1
            JNB    P1.1, DPL2
            JNB    P1.2, DPL3
            CALL    SUB1
            SJMP    MAIN
            
        DPL1:
            MOV     A, #0
            RET
        DPL2:
            MOV    A, #4
            RET
        DPL3:
            MOV     A, #8
            RET
        SUB1:
            MOV    DPTR, #BANG1
            MOVC    A, @A + DPTR
            MOV    P2, A
            CLR    P3.2
            CALL    DELAY
            SETB    P3.2
            INC    DPTR
            MOVC    A, @A + DPTR
            MOV    P2, A
            CLR    P3.3
            CALL    DELAY
            SETB    P3.3
            INC    DPTR
            MOVC    A, @A+ DPTR
            MOV    P2, A
            CLR    P3.4
            CALL    DELAY
            SETB    P3.4
            INC    DPTR
            MOVC    A, @A + DPTR
            MOV    P2, A
            CLR    P3.5
            CALL    DELAY
            SETB    P3.5
            RET
        
        DELAY:
            PUSH    06
            PUSH    07
            MOV    R6, #255
        X1:    MOV    R7, #255
            DJNZ    R7, $
            DJNZ    R6, X1
            POP    07
            POP    06
            RET
        
        BANG1:    DB    0CH, 03H, 0E6H, 09H, 02H, 0A6H, 0A6H, 18H
        
        END
        Lỗi của chương trình đầu tiên là sai chỗ
        1. MOV và MOVC
        2. MOVC a, @a+dptr mới đúng thay vì lệnh ở trên
        3. thiếu RET

        P.S: vẫn còn thắc mắc chỗ
        MOVC a, @A+DPTR => như vậy thì giá trị tại A+DPTR sẽ được đưa vào A? Như vậy khi tăng A lên để lấy phần tử tiếp theo trong mảng theo ý đồ của mình bị phá sản rồi à?!!!
        Có ai giúp đc mình chỗ này?

        Comment


        • #5
          Nguyên văn bởi trungdtd711 Xem bài viết
          code này là full chưa vậy?
          Chứ như thế này nếu viết bằng chương trình Read51 sau đó compile ra file *hex thì chương trình không chạy được đâu.
          Thiếu phần cơ bản nhất: khai báo tập lệnh cho con c51: include<sfr51.inc>. Mà sao mô phỏng bạn dùng nhiều con led7 đoạn vay? kiểm soát một con thôi. hic. Từ khóa là 7SEG thì phải.
          Thêm điều nữa là sau khi học lập trình assem cho con 51 thì bạn thấy bạn sẽ hiểu rõ về con VDK hơn là lập trình C.
          Mong bạn có thái độ đúng với môn học. hehe. Nếu là bị ép thì bạn bị ép đến trường từ lúc đi nhà trẻ cơ .....
          mỗi trình biên dịch mỗi khác mà bác! nếu trình read51 thì cần khái báo cái sfr51.inc đó và trong read51 k cho phép call mà phải là lcall mới dc.cài trình biên dịch read51 này k hỗ trợ nhiều còn đâu!chẳng hạn như con P89C51RD2 đấy một số chức năng ở port 3 k sử dụng dc khi sử dụng trình biên dịch read51. ngày trước em cũng dùng read51 nhưng sau đó em thấy keil C hay hơn nên em chuyển sang dùng có áp dụng cho cả C và ASM lun!

          Comment


          • #6
            Phù, cuối cùng cũng tìm ra được lỗi. Ôi, bài đầu tiên làm gian nan thật.
            @ trungdtd711: không cần thêm dòng include đó nó vẫn chạy. Chắc bác nhầm lẫn chỗ nào rồi. Hèn chi thấy lạ quá, nào h chưa từng thấy lệnh đó trong ASM.
            Chương trình viết lại đây:
            Code:
                ORG 0000h
                LJMP MAIN
                ORG 0030H
            MAIN:
                JNB    P1.0, DPL1
                JNB    P1.1, DPL2
                JNB    P1.2, DPL3
                CALL    SUB1
                SJMP    MAIN
                
            DPL1:
                MOV     A, #0
                RET
            DPL2:
                MOV    A, #4
                RET
            DPL3:
                MOV     A, #8
                RET
            SUB1:
                MOV    DPTR, #BANG1
                MOVC    A, @A + DPTR
                MOV    P2, A
                CLR    P3.2
                CALL    DELAY
                SETB    P3.2
                INC    DPTR
                MOVC    A, @A + DPTR
                MOV    P2, A
                CLR    P3.3
                CALL    DELAY
                SETB    P3.3
                INC    DPTR
                MOVC    A, @A+ DPTR
                MOV    P2, A
                CLR    P3.4
                CALL    DELAY
                SETB    P3.4
                INC    DPTR
                MOVC    A, @A + DPTR
                MOV    P2, A
                CLR    P3.5
                CALL    DELAY
                SETB    P3.5
                RET
            
            DELAY:
                PUSH    06
                PUSH    07
                MOV    R6, #255
            X1:    MOV    R7, #255
                DJNZ    R7, $
                DJNZ    R6, X1
                POP    07
                POP    06
                RET
            
            BANG1:    DB    0CH, 03H, 0E6H, 09H, 02H, 0A6H, 0A6H, 18H
            
            END
            Lỗi của chương trình đầu tiên là sai chỗ
            1. MOV và MOVC
            2. MOVC a, @a+dptr mới đúng thay vì lệnh ở trên
            3. thiếu RET

            P.S: vẫn còn thắc mắc chỗ
            MOVC a, @A+DPTR => như vậy thì giá trị tại A+DPTR sẽ được đưa vào A? Như vậy khi tăng A lên để lấy phần tử tiếp theo trong mảng theo ý đồ của mình bị phá sản rồi à?!!!
            Có ai giúp đc mình chỗ này?

            Comment


            • #7
              bạn dùng thêm 1 thanh nghi R0 nào đó chẳng hạn làm biến tăng
              MOV A,R0
              MOVC A,@A+DPTR
              INC R0

              Comment


              • #8
                Nguyên văn bởi mr.ngoc Xem bài viết
                bạn dùng thêm 1 thanh nghi R0 nào đó chẳng hạn làm biến tăng
                MOV A,R0
                MOVC A,@A+DPTR
                INC R0
                thanks bạn. Mình sẽ thử

                Comment


                • #9
                  Làm xong rồi, chạy tốt nhưng bị một lỗi rất khó hiểu, bạn nào vô phân tích hộ mình cái:
                  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
                      RET
                  DPL2:
                      MOV    A, #5
                      RET
                  DPL3:
                      MOV     A, #9
                      RET
                  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
                      RET
                  
                  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
                  Yêu cầu là bấm sw1 thì hiển thị HELP, bấm sw2 thì hiển thị GOOD, bấm sw3 thì ko hiển thị gì hết.
                  Mình hiển thị ra chữ HELP và GOOD đc rồi, nhưng sau khi lặp vài lần thì nó chuyển thành 8888 hết! Bó tay, ko biết lỗi ở đâu!

                  Comment


                  • #10
                    ý của bạn là nhấn SW1 thì led hiển thị chữ HELP và cứ hiển thị chữ đó suốt sau khi nhấn SW1 chứ j, và đến khi nhấn SW2 hay SW3 thì nội dung của led mới thay đổi và cứ dữ nội dung của phím đó chứ j?
                    hay là nhấn 1 phím và hiển thị 1 thời gian rồi tắt led!?

                    Comment


                    • #11
                      mình viết như thế này ko biết đúng ý bạn ko?
                      ; DINH NGHIA CAC SWITCH
                      SW1 BIT P1.0
                      SW2 BIT P1.1
                      SW3 BIT P1.2
                      ;CAC BIT QUET LED
                      L1 BIT P3.2
                      L2 BIT P3.3
                      L3 BIT P3.4
                      L4 BIT P3.5
                      ;CONG XUAT DATA RA LED
                      DATA_LED EQU P2
                      BIT1 BIT 30H

                      ORG 0000H
                      MOV P1,#0FFH
                      MOV R0,#0
                      MAIN:
                      JNB SW1,HIENTHI1
                      JNB SW2,HIENTHI2
                      JNB SW3,HIENTHI3
                      JNB BIT1,MAIN

                      LOOP1:
                      MOV A,R0
                      MOVC A,@A+DPTR
                      MOV DATA_LED,A
                      SETB L1
                      LCALL DELAY
                      CLR L1
                      INC R0

                      MOV A,R0
                      MOVC A,@A+DPTR
                      MOV DATA_LED,A
                      SETB L2
                      LCALL DELAY
                      CLR L2
                      INC R0

                      MOV A,R0
                      MOVC A,@A+DPTR
                      MOV DATA_LED,A
                      SETB L3
                      LCALL DELAY
                      CLR L3
                      INC R0

                      MOV A,R0
                      MOVC A,@A+DPTR
                      MOV DATA_LED,A
                      SETB L4
                      LCALL DELAY
                      CLR L4

                      MOV R0,#0
                      JMP MAIN
                      HIENTHI1:
                      SETB BIT1
                      MOV DPTR,#MA1
                      RET
                      HIENTHI2:
                      SETB BIT1
                      MOV DPTR,#MA2
                      RET
                      HIENTHI3:
                      SETB BIT1
                      MOV DPTR,#MA3
                      RET
                      DELAY:
                      PUSH 06
                      PUSH 07
                      MOV R6, #50
                      X1: MOV R7, #50
                      DJNZ R7, $
                      DJNZ R6, X1
                      POP 07
                      POP 06
                      RET
                      MA1: ;CHU 'HELP'
                      DB 89H,86H,0C7H,8CH
                      MA2: ; CHU 'GOOD'
                      DB 82H,0C0H,0C0H,0A1H
                      MA3:
                      DB 0FFH,0FFH,0FFH,0FFH
                      END
                      ko up file lên diễn đàn được! khó up quá! mà hình như cái mã chư HELP và GOOD của cậu bị sai roài

                      Comment


                      • #12
                        Nguyên văn bởi vaa_dtvn Xem bài viết
                        Làm xong rồi, chạy tốt nhưng bị một lỗi rất khó hiểu, bạn nào vô phân tích hộ mình cái:
                        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
                            RET
                        DPL2:
                            MOV    A, #5
                            RET
                        DPL3:
                            MOV     A, #9
                            RET
                        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
                            RET
                        
                        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
                        Yêu cầu là bấm sw1 thì hiển thị HELP, bấm sw2 thì hiển thị GOOD, bấm sw3 thì ko hiển thị gì hết.
                        Mình hiển thị ra chữ HELP và GOOD đc rồi, nhưng sau khi lặp vài lần thì nó chuyển thành 8888 hết! Bó tay, ko biết lỗi ở đâu!
                        Vấn đề của bạn là ở chổ bạn sử dụng lệnh không hợp lý:
                        - Lệnh jnb khi nhảy đến nhãn không có kết thúc bằng lệnh RET như bạn đã viết.
                        - Bạn có thể đọc thêm hoạt động của VĐK khi nó gặp lệnh RET thì bạn sẽ hiểu ra tại sao khi nhấn nút vài lần thì bị lỗi.
                        Chúc vui.

                        Comment


                        • #13
                          bác doannhatphong nói cũng đúng! em đã test lại ctr của bạn va_dtt rồi thay lệnh RET bằng JMP MAIN thì cũng ok!
                          nhưng ctr của em viết ở trên em test cũng ok mà! tuy ko có mạch thật test nhưng ctr ngắn ngắn như thế này mô phỏng cũng chuẩn luôn! hy`

                          Comment


                          • #14
                            Nguyên văn bởi mr.ngoc Xem bài viết
                            bác doannhatphong nói cũng đúng! em đã test lại ctr của bạn va_dtt rồi thay lệnh RET bằng JMP MAIN thì cũng ok!
                            nhưng ctr của em viết ở trên em test cũng ok mà! tuy ko có mạch thật test nhưng ctr ngắn ngắn như thế này mô phỏng cũng chuẩn luôn! hy`
                            Hì, vậy vấn đề của bạn là gi???

                            Comment


                            • #15
                              đâ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à!

                              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

                              Đang tải...
                              X