Thông báo

Collapse
No announcement yet.

Giúp ngắt ngoài trong 89 dùng ngôn ngữ ASM

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

  • #16
    Nguyên văn bởi minhthanh29 Xem bài viết
    Thanks, bạn giải thích mình đoạn này, mình vẫn chưa hiểu lắm


    EX0_ISR: MOV DPTR,#MA_LED7SEG ;CHI CON TRO DPTR VAO BANG MA_LED7SEG
    MOV A,DEM
    MOVC A,@A+DPTR
    MOV LED,A
    LCALL DELAY
    INC DEM
    LAP: CJNE DEM,#9,EXIT ;SO SANH R1 VOI 10 NEU CHUA = 10 THI NHAY TOI EXIT CON NEU = 100 THI XOA NO VOI 0
    SJMP LAP
    EXIT: RET
    Trong chương trình ngắt của bạn thực hiện lệnh hỏi vòng: Lap: CJNE DEM,#9,EXIT ; thực ra biến DEM chỉ tăng thêm 1 khi có tác động bên ngoài, nên con trỏ chỉ chạy lên chạy xuống ở 2 hàng màu đỏ của bạn. Đúng không? Ví dụ: biến DEM của bạn = 3 ( nếu không có xung tác động bên ngoài vào) thì con trỏ chỉ chạy như vậy! Khi có xung bên ngoài tác động thì biến DEM tăng thêm 1. Nếu bằng 9 thì thoát ra RETI chứ không phải RET.
    Bi giờ bạn hãy cải tiến chương trình của bạn bằng cách bỏ 2 dòng lệnh màu đỏ xem chương trình có chạy không?
    INC DEM
    RETI
    Khi đó trong chương trình chính của bạn có chỉnh sửa 1 tí xíu!
    Chia sẻ kinh nghiệm: Trong chương trình ngắt bạn nên làm công việc đơn giản thôi! Còn chương trình chính bạn hãy xử lí hết rồi đợi có tín hiệu ngắt thì con trỏ nhảy vào chương trình ngắt thực thi nhiệm vụ!

    Comment


    • #17
      Nhìn lại chương trình bạn viết thì không thể biết chương trình có chạy không:
      1- Lệnh SJMP $, làm cho con trỏ nhảy tại chổ thì sau đó lệnh mov phía sau không có tác dụng.
      2-Yêu cầu của chương trình sao sao đó! Hiển thị từ số 0 ..9 nhưng đến 9 thì dừng lại. Vậy là khi DEM = 9 thì phải end chương trình đợi reset bằng nút nhấn!
      Đợi mình xíu, mình thử viết xem có "chạy" không?

      Comment


      • #18
        Của bạn đây:
        org 00h
        ljmp main
        org 03h
        ljmp ngat0
        org 0030h
        main: mov tmod,#01h
        setb EA
        setb EX0
        setb IT0
        mov DPTR,#ma7seg
        lap: mov a,R1
        movc,@a+dptr
        mov p1,a
        lcall delay
        mov a,#00h
        cjne r1,#09,lap
        sjmp $
        ngat0: inc r1
        reti
        delay: . . . ( giống của bạn)
        ma7seg: .....( giống của bạn)
        end.
        Trong chương trình ngắt trên của mình chỉ làm nhiệm vụ tăng R1 khi có xung bên ngoài tác động vào P3.2. Khi r1=9 thì kết thúc chương trình. SJMP $ không làm gì nữa!
        Viết vội quá chưa kiểm tra kỹ! Tối nay check lại xem có ok không?

        Comment


        • #19
          Theo yêu cầu thì mới mở nguồn led sáng số đ trước, khi tác động thì nó mới nhảy số 1. Chương trình bạn viết đơn giản và dễ hiểu, thanks


          org 00h
          ljmp main
          org 03h
          ljmp ngat0
          org 0030h
          main: mov tmod,#01h
          setb EA
          setb EX0
          setb IT0
          mov DPTR,#ma7seg
          lap: mov a,R1
          movc,@a+dptr ; cho nay phai movc a,@a+dptr
          mov p1,a
          lcall delay
          mov a,#00h
          cjne r1,#09,lap
          sjmp $
          ngat0: inc r1
          reti
          delay: . . . ( giống của bạn)
          ma7seg: .....( giống của bạn)
          end.
          Nhận vẽ mạch in ^_^
          TEL: 0167 4500 365
          Mail:

          Comment


          • #20
            :P vì viết vội mà! Movc A,@A+DPTR

            Comment


            • #21
              Nguyên văn bởi Pamkin Xem bài viết
              :P vì viết vội mà! Movc A,@A+DPTR
              Thanks các bạn,mình làm xong rồi
              Nhận vẽ mạch in ^_^
              TEL: 0167 4500 365
              Mail:

              Comment

              Về tác giả

              Collapse

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

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

              Collapse

              Đang tải...
              X