Thông báo

Collapse
No announcement yet.

Doi 1 so 16 bit sang BCD

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

  • Doi 1 so 16 bit sang BCD

    Gia su rang 8051 co 1 so 16 bit la FFFFH duoc cất trong TH0 và TL0 (lúc tràn bộ đếm). Bây giờ em muốn đổi số này sang BCD được cất vào địa chỉ là 40H, 41H, 42H, 43H, 44H với địa chỉ 44H là số high. Bác nào biết thì chỉ giúp em với. Nếu viết thì quá tốt. Còn nếu ko có rỗi thì hướng dẫn cũng được. Cảm ơn các pác trước...

  • #2
    Khá phức tạp đấy, nếu ở TPHCM thì liên với tui.
    Phan Phiên Bình
    015 lô E chung cư Lý Thường Kiệt F7, Q11.
    Thù lao là 1 ly ca fe sửa đá.

    Comment


    • #3
      Nguyên văn bởi thanhlam1911 Xem bài viết
      Gia su rang 8051 co 1 so 16 bit la FFFFH duoc cất trong TH0 và TL0 (lúc tràn bộ đếm). Bây giờ em muốn đổi số này sang BCD được cất vào địa chỉ là 40H, 41H, 42H, 43H, 44H với địa chỉ 44H là số high. Bác nào biết thì chỉ giúp em với. Nếu viết thì quá tốt. Còn nếu ko có rỗi thì hướng dẫn cũng được. Cảm ơn các pác trước...
      max của số 16 bit là 65535, nếu muốn hiển thị ra BCD để hiển thị led led 7 đoạn thì chỉ cần chia cho 10 là được thôi, cái này nếu viết trên C thì đơn giản hơn, còn viết ASM thì hơi phức tạp 1 chút.
      viết c:
      unsigned int a;
      a=TL0;
      a=a & TH0; // a or TH0

      40h=a mod 10; // a chia 10 lấy phần dư
      a=a/10;
      41h=a mod 10;
      a=a/10;
      42h= a mod 10;
      a=a/10;
      43h=a mod 10;
      a=a/10;
      44h= a mod 10;
      như vậy là xong.

      viết bằng ASM cũng tương tự nhưng mà ASM việc chia như vậy hơn khó khăn, bạn cần viết 1 chương trình chia 2 số 16 bit trước.
      giã sử như ta có chương trình chia 2 số 16bit là CHIA_16 với số bị chia là R1 và R2, số chia là 10 (0Ah) kết quả của chương trình trừ đó được lưu trong R1,R2 và số dư lưu trong R3.
      ASM:

      MOV R1,TH0
      MOV R2,TL0

      LOOP: ACALL CHIA_16 ; CHIA CHO 10
      MOV 40H,R3

      ACALL CHIA_16;
      MOV 41H,R3

      ACALL CHIA_16;
      MOV 42H,R3

      ACALL CHIA_16;
      MOV 43H,R3

      ACALL CHIA_16;
      MOV 44H,R3

      chương trình chia 2 số 16 bit thật sự là trừ 2 số 16 bit thôi, cái này mình có làm rồi nhưng lâu quá không viết ASM nên quên rồi, chỉ nhớ cách làm thôi.bạn lấy 2 số 16 bít trừ cho nhau và tăng kết quả lên 1, trừ đến khi nào cờ C của 89 bật lên thì lấy kết quả và số dư: chẳng hạn như số FFFFh chia cho 0AH thì viết chương trình trừ FFFFH cho 0Ah
      chia_16:

      loop: acall tru_16
      jnc loop

      số bị chia nằm trong r1,r2, số chia là 0AH. kết quả lưu trở ngược lại r1,r2 số dư nằm trong r3. như vậy sau khi thoát khỏi vòng lặp loop thì kết quả nằm trong r1,r2, số dư nằm trong r3.
      làm như vậy là ok đấy, để hôm nào mình lục lại cái ASM mình viết hồi đó nếu có thì mình sẽ gửi cho bạn. có gì thì liên hệ qua mail cho mình nhé. chipmickey@yahoo.com
      hãy cố gắng dù vướn phải thất bại!!!!!!!!

      Comment


      • #4
        Nguyên văn bởi thanhlam1911 Xem bài viết
        Gia su rang 8051 co 1 so 16 bit la FFFFH duoc cất trong TH0 và TL0 (lúc tràn bộ đếm). Bây giờ em muốn đổi số này sang BCD được cất vào địa chỉ là 40H, 41H, 42H, 43H, 44H với địa chỉ 44H là số high. Bác nào biết thì chỉ giúp em với. Nếu viết thì quá tốt. Còn nếu ko có rỗi thì hướng dẫn cũng được. Cảm ơn các pác trước...
        MOV R1,#3
        MOV R0,#40H
        mov A,TL0
        LAP:
        MOV B,#10
        DIV AB
        MOV @R0,A
        DJNZ R1,LAP

        Bạn làm tương tự với TH0

        Comment


        • #5
          Nguyên văn bởi cong1810 Xem bài viết
          MOV R1,#3
          MOV R0,#40H
          mov A,TL0
          LAP:
          MOV B,#10
          DIV AB
          MOV @R0,A
          DJNZ R1,LAP

          Bạn làm tương tự với TH0
          cách cuả bạn làm thì dúng với 8 bit thôi, mình giả sử nhé nếu áp dụng cách của bạn: TH0=23h, TL0=5Fh khi đó số cần hiển thị là 9055 (235Fh)
          theo chương trình của bạn thì sẽ được là 095 (tương ứng với TL0=5F) và 035 (tương ứng với TH0=23h) nhưng vậy sẽ không đúng. vì TH0 và TL0 hợp thành 16 bit. tức là kết quả sẽ phải hiển thị ra là 9055 mới đúng.
          hãy cố gắng dù vướn phải thất bại!!!!!!!!

          Comment


          • #6
            Sau đây là đoạn code chuyển đổi Hexa _ Decimal, số Decimal được chứa 2 cơ số trên 1 byte. Đoạn code này chuyển đổi được số Hexa có số byte bất kỳ. Code được viết bằng Asembly nên rất phức tạp, bản thân tôi viết mà nhìn lại cũng khó hiểu, đoạn code này đã chạy trên thiết bị đo rất chính xác.
            Cơ bản về giải thuật là:
            Xác định xem có các byte hexa đầu tiên có phải là số không để giảm bớt phép chia
            Lấy số Hexa đã loại bỏ các số 0 đầu tiên chia cho 10, lấy số dư cho vào Nible bên phải của số Decimal, thương số trả lại trên biến Hexa
            Làm như vậy cho đến khi thương số = 0
            Đoạn code số nhiều byte chia 10 có thể dễ hiểu hơn, thuật toán giống như bạn làm phép chia học từ thời cấp 1

            Đoạn code như sau:
            ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

            ; CHUYEN DOI HEXA - DECIMAL
            ; SO BYTE CHUYEN DOI CHUA TREN BIEN SOBYTE
            ; SO HEXA CHUA TREN CAC BYTE TU DIA CHI HEX TRO LEN (gia su HEX EQU 60H)
            ; SO HEXA CO SO BYTE BANG SOBYTE
            ; BYTE THAP O DIA CHI HEX
            ; SO DECIMAL CHUA TREN CAC BYTE TU DIA CHI DECI TRO LEN ( gia su DECI EQU 55H)
            ; BIEN DECI CO SO BYTE CO THE LON HON SOBYTE
            ; BYTE THAP O DIA CHI DECI
            ; THUONG SO CHUA TREN CAC BYTE THUONG TRO LEN (gia su THUONG EQU 50H)
            ; BYTE THAP O DIA CHI THUONG
            ; DUNG R0 DE LAM CON TRO
            ;
            ; THUAT TOAN KEM THEO CHUONG TRINH CON CHIA10
            ; DAU TIEN KIEM TRA CAC BYTE DAU CUA SO HEXA CO PHAI LA SO 0 HAY KHONG DE LOAI TRU
            ; KHI BAT DAU TIM GAP SO KHAC 0 THI BAT DAU CHIA

            HEXDEC: MOV A,SOBYTE
            CJNE A,#00,TIEPHEX
            SJMP THOATHEX
            TIEPHEX: MOV R1,#9
            MOV R0,#DECI
            XOADEC: MOV @R0,#00H
            INC R0
            DJNZ R1,XOADEC
            MOV DECIMARK,#DECI
            MOV SOBYTED,SOBYTE
            CLR NIB
            MOV R0,RR0
            MOV R1,RR1
            DEC R0
            DEC R1
            MOV A,R0
            ADD A,SOBYTED
            MOV R0,A
            MOV A,R1
            ADD A,SOBYTED
            MOV R1,A
            KIEMTRA: CJNE @R0,#00H,CHIA ; KIEM TRA SO 0 O DAU SO HEXA DE GIAM SO PHEP CHIA
            DEC R0
            DEC R1
            DJNZ SOBYTED,KIEMTRA
            SJMP THOATHEX
            ; CHIA 10 DE LAY SO DU
            CHIA: MOV R2,SOBYTED
            CALL CHIA10
            MOV R0,DECIMARK
            JB NIB,CHIA1
            MOV @R0,SODU
            CPL NIB
            SJMP THG_HEX
            CHIA1: MOV A,SODU
            SWAP A
            ORL A,@R0
            MOV @R0,A
            CPL NIB
            INC DECIMARK
            ; CHUYEN DU LIEU TU THUONG SANG HEX
            THG_HEX: MOV R0,RR0
            MOV R1,RR1
            MOV R2,SOBYTED
            THG_HEX1: MOV A,@R1
            MOV @R0,A
            DJNZ R2,THG_HEX2
            SJMP KIEMTRA
            THG_HEX2: INC R0
            INC R1
            SJMP THG_HEX1
            THOATHEX: RET
            ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;
            ; R2 MANG SO BYTE CAN CHIA

            CHIA10: MOV A,@R0
            MOV B,#10
            DIV AB
            MOV @R1,A
            TIEP: DJNZ R2,LAPCHIA ; R2 MANG SO BYTE CAN CHIA
            SJMP THOATCHIA
            LAPCHIA: MOV A,B
            SWAP A
            MOV SODU,A
            DEC R0
            DEC R1
            MOV A,@R0
            ANL A,#0F0H
            SWAP A
            ORL A,SODU
            MOV B,#10
            DIV AB
            SWAP A
            MOV @R1,A
            MOV A,B
            SWAP A
            MOV SODU,A

            MOV A,@R0
            ANL A,#0FH
            ORL A,SODU
            MOV B,#10
            DIV AB
            ORL A,@R1
            MOV @R1,A
            SJMP TIEP
            THOATCHIA: MOV SODU,B
            RET
            ;;;KET THUC CHUONG TRINH DOI HEXA DECIMAL;;;;;;;;;;;;;;;;;
            ;;;;;;;;;;;;;;;;;;;;;;;;;
            Đoạn code này nằm trong phần mềm một thiết bị đo tần số, đo độ rộng 1 xung có độ phân giải 1mS, phát một xung có độ rộng cài đặt được với dãi đo 1~999999mS, và phát tần số có tần số cài đặt được từ 500Hz trở xuống.
            Vi điều khiển là AT89C52.
            Chúc vui

            Comment


            • #7
              Đây là đoạn code Tôi vừa mới viết theo yêu cầu của ban Thanhlam1911. Tôi đã mô phỏng thử, nó chuyển đổi rất chính xác:
              ;DOAN CODE CHUYEN DOI TH0_TL0 RA BCD TREN CAC BYTE 40H,41H,42H,43H,44H
              ; KHAI BAO
              THUONG_HIGH EQU 7FH
              THUONG_LOW EQU 7EH
              SBC_HIGH EQU 7DH
              SBC_LOW EQU 7CH
              SO_DU EQU 7BH
              ;---------------------
              ;CHUONG TRINH CHINH
              ORG 0000H
              SJMP MAIN
              ORG 0030H
              MAIN: CALL HEX_DEC
              SJMP MAIN

              ;----------------
              ;DOAN CHUONG CON

              HEX_DEC: MOV SBC_HIGH,TH0
              MOV SBC_LOW,TL0
              CALL CHIA_10
              MOV 40H,SO_DU ; BYTE CHUA CO SO THAP NHAT
              MOV SBC_HIGH,THUONG_HIGH
              MOV SBC_LOW,THUONG_LOW
              CALL CHIA_10
              MOV 41H,SO_DU ; BYTE CHUA CO SO THU 2
              MOV SBC_HIGH,THUONG_HIGH
              MOV SBC_LOW,THUONG_LOW
              CALL CHIA_10
              MOV 42H,SO_DU ; BYTE CHUA CO SO THU 3
              MOV SBC_HIGH,THUONG_HIGH
              MOV SBC_LOW,THUONG_LOW
              CALL CHIA_10
              MOV 43H,SO_DU ; BYTE CHUA CO SO THU 4
              MOV SBC_HIGH,THUONG_HIGH
              MOV SBC_LOW,THUONG_LOW
              CALL CHIA_10
              MOV 44H,SO_DU ; BYTE CHUA CO SO CAO NHAT
              RET

              ;--------------
              ;DOAN CODE CHIA 10
              ; SO BI CHIA CHUA TREN SBC_HIGH VAF SBC_LOW
              ;THUONG SO CHUA TREN THUONG_HIGH VA THUONG_LOW
              ; SO DU CHUA TREN SO_DU
              CHIA_10: MOV A,SBC_HIGH
              MOV B,#10
              DIV AB
              MOV THUONG_HIGH,A

              MOV A,B ; B DANG CHUA SO DU < 10
              SWAP A
              MOV B,A

              MOV A,SBC_LOW
              SWAP A
              ANL A,#0FH ; CHI LAY NIBLE CAO CUA SBC_LOW GHEP VAO SO DU LA NIBLE CAO DANG O B
              ORL A,B ; TAO DUOC 1 BYTE DE CHIA TIEP
              MOV B,#10
              DIV AB ; KET QUA PHEP CHIA NAY CHI LA MOT SO < 10

              SWAP A
              MOV THUONG_LOW,A ; DUA KET QUA VAO NIBLE CAO CUA THUONG_LOW
              MOV A,B
              SWAP A
              MOV B,A
              MOV A,SBC_LOW
              ANL A,#0FH ; CHI LAY NIBLE THAP CUA SBC_LOW GHEP VAO SO DU LA NIBLE CAO DANG O B
              ORL A,B ; TAO DUOC 1 BYTE DE CHIA TIEP
              MOV B,#10
              DIV AB
              ORL A,THUONG_LOW
              MOV THUONG_LOW,A
              MOV SO_DU,B
              RET
              ;---------------
              END
              Chúc vui!

              Comment


              • #8
                Nguyên văn bởi chipmickey Xem bài viết
                cách cuả bạn làm thì dúng với 8 bit thôi, mình giả sử nhé nếu áp dụng cách của bạn: TH0=23h, TL0=5Fh khi đó số cần hiển thị là 9055 (235Fh)
                theo chương trình của bạn thì sẽ được là 095 (tương ứng với TL0=5F) và 035 (tương ứng với TH0=23h) nhưng vậy sẽ không đúng. vì TH0 và TL0 hợp thành 16 bit. tức là kết quả sẽ phải hiển thị ra là 9055 mới đúng.
                Ừ nhỉ.mình sai lầm cơ bản.hix.cám ơn chipmickey nhiều!!

                Comment


                • #9
                  Thành thật cảm ơn bạn "pvkhai". Bài của bạn rất hay.Chỉ thay lệnh CALL = LỆNH LCALL. Mình đã sửa lại 1 tí và test thì đúng là hiển thị cực chuẩn. Bạn đúng là đỉnh cao thật. Để tỏ ý là cảm ơn mọi người thì bây giờ tớ sẽ lấy bài của "pvkhai" và sửa lại 1 tí. Các bạn có thể test trên Proteus:
                  ;phần cứng thì nối a,b,...,f với p2.0->p2.6
                  ;TH0 và TL0 thì có thể thay là 00001111B và 11111111B
                  ;các chân p3.3->p3.0 thì tương cho số hàng vạn->đơn vị
                  ;mình chỉ test cho 4 chữ số thôi
                  #include <sfr52.inc>
                  THUONG_HIGH EQU 7FH
                  THUONG_LOW EQU 7EH
                  SBC_HIGH EQU 7DH
                  SBC_LOW EQU 7CH
                  SO_DU EQU 7BH
                  ;---------------------
                  ;CHUONG TRINH CHINH
                  ORG 0000H
                  MOV DPTR,#LED7SEG
                  SJMP MAIN
                  ORG 0030H
                  MAIN:
                  LCALL HEX_DEC
                  ;TRA BANG DOI BCD RA LED7SEG
                  MOV A,40H
                  MOVC A,@A+DPTR
                  MOV 40H,A

                  MOV A,41H
                  MOVC A,@A+DPTR
                  MOV 41H,A

                  MOV A,42H
                  MOVC A,@A+DPTR
                  MOV 42H,A

                  MOV A,43H
                  MOVC A,@A+DPTR
                  MOV 43H,A
                  LCALL DISPLAY
                  SJMP MAIN

                  ;----------------
                  ;DOAN CHUONG CON

                  HEX_DEC: MOV SBC_HIGH,#00001111B
                  MOV SBC_LOW,#11111111B
                  ACALL CHIA_10
                  MOV 40H,SO_DU ; BYTE CHUA CO SO THAP NHAT
                  MOV SBC_HIGH,THUONG_HIGH
                  MOV SBC_LOW,THUONG_LOW
                  ACALL CHIA_10
                  MOV 41H,SO_DU ; BYTE CHUA CO SO THU 2
                  MOV SBC_HIGH,THUONG_HIGH
                  MOV SBC_LOW,THUONG_LOW
                  ACALL CHIA_10
                  MOV 42H,SO_DU ; BYTE CHUA CO SO THU 3
                  MOV SBC_HIGH,THUONG_HIGH
                  MOV SBC_LOW,THUONG_LOW
                  ACALL CHIA_10
                  MOV 43H,SO_DU ; BYTE CHUA CO SO THU 4
                  MOV SBC_HIGH,THUONG_HIGH
                  MOV SBC_LOW,THUONG_LOW
                  ACALL CHIA_10
                  MOV 44H,SO_DU ; BYTE CHUA CO SO CAO NHAT
                  RET

                  ;--------------
                  ;DOAN CODE CHIA 10
                  ; SO BI CHIA CHUA TREN SBC_HIGH VAF SBC_LOW
                  ;THUONG SO CHUA TREN THUONG_HIGH VA THUONG_LOW
                  ; SO DU CHUA TREN SO_DU
                  CHIA_10: MOV A,SBC_HIGH
                  MOV B,#10
                  DIV AB
                  MOV THUONG_HIGH,A

                  MOV A,B ; B DANG CHUA SO DU < 10
                  SWAP A
                  MOV B,A

                  MOV A,SBC_LOW
                  SWAP A
                  ANL A,#0FH ; CHI LAY NIBLE CAO CUA SBC_LOW GHEP VAO SO DU LA NIBLE CAO DANG O B
                  ORL A,B ; TAO DUOC 1 BYTE DE CHIA TIEP
                  MOV B,#10
                  DIV AB ; KET QUA PHEP CHIA NAY CHI LA MOT SO < 10

                  SWAP A
                  MOV THUONG_LOW,A ; DUA KET QUA VAO NIBLE CAO CUA THUONG_LOW
                  MOV A,B
                  SWAP A
                  MOV B,A
                  MOV A,SBC_LOW
                  ANL A,#0FH ; CHI LAY NIBLE THAP CUA SBC_LOW GHEP VAO SO DU LA NIBLE CAO DANG O B
                  ORL A,B ; TAO DUOC 1 BYTE DE CHIA TIEP
                  MOV B,#10
                  DIV AB
                  ORL A,THUONG_LOW
                  MOV THUONG_LOW,A
                  MOV SO_DU,B
                  RET
                  ;---------------
                  ;CHUONG TRINH TAO TRE 10MS
                  DELAY:
                  MOV R1,#20
                  MOV R0,#230
                  LAP: DJNZ R0,LAP
                  DJNZ R1,LAP
                  RET
                  ;--------------------------------------
                  DISPLAY:
                  ;HIEN THI LED 1
                  MOV P2,40H
                  CLR P3.0
                  ACALL DELAY ; TAO TRE 10MS
                  SETB P3.0
                  ;HIEN THI LED 2
                  MOV P2,41H
                  CLR P3.1
                  ACALL DELAY ; TAO TRE 10MS
                  SETB P3.1
                  ;HIEN THI LED 3
                  MOV P2,42H
                  CLR P3.2
                  ACALL DELAY ; TAO TRE 10MS
                  SETB P3.2
                  ;HIEN THI LED 4
                  MOV P2,43H
                  CLR P3.3
                  ACALL DELAY ; TAO TRE 10MS
                  SETB P3.3
                  RET
                  LED7SEG:
                  DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
                  ; 0 1 2 3 4 5 6 7 8 9
                  END

                  Comment


                  • #10
                    Bạn thanhlam1911 thân mến, bạn nên nghiên cứu viết code hiển thị LED 7segment theo phương pháp quét sử dụng bộ timer trong vi điều khiển. Dùng phương pháp này sẽ rất tiện lợi vì bộ timer hoạt động gần như độc lập với vi điều khiển, do đó vi điều khiển có nhiều thời gian thực hiện công việc khác chứ không phải mất thời gian để chạy đoạn code Delay.
                    Thân!

                    Comment


                    • #11
                      còn đoạn chương trình naỳ thì sao, thâỳ naò có thể giúp em không, muốn chuyển từ 99-0 thí lam thế nao đây, cưú em vơí em đang làm baì kiểm tra

                      ORG 0000H
                      main: MOV A,#0H
                      MOV P3,A
                      MOV P1,A
                      SETB 0A0H
                      SETB 0A1H
                      CHO: clr 0A0H
                      clr 0A1H
                      JB 0A0H,GIAM
                      JB 0A1H,TANG

                      AJMP CHO

                      giam: DEC A
                      ADD A,#0; dùng phép cộng ảo để thuc hien lenh da a
                      DA A ; dùng lệnh da a chuyển 16 - 10 sao lai ko đươc ;có cách naò khac nuã ko ạ, thâỳ naò biết chỉ em vơí nhá!
                      MOV P3,A
                      MOV R7,#06FH
                      AA: MOV R6,#01FH
                      BB: MOV R5,#01FH
                      CC: DJNZ R5,CC
                      DJNZ R6,BB
                      DJNZ R7, AA
                      SJMP CHO

                      tang: INC A
                      ADD A,#0 ; dùng phép cộng ảo de thưc hiện lenh da
                      DA A ; ở dâỵ thì laị được
                      MOV P3,A
                      MOV R7,#06FH
                      DD: MOV R6,#01FH
                      EE: MOV R5,#01FH
                      GG: DJNZ R5,GG
                      DJNZ R6,EE
                      DJNZ R7, DD
                      SJMP CHO
                      END
                      Last edited by hoangphi; 26-05-2008, 11:57.
                      học học nữa và học khi...... đến chết

                      Comment


                      • #12
                        Tôi mới làm xong vấn đề này, các giải quyết của tôi là:
                        - Chia byte thấp ra làm 3 số: Trăm _ Chục _ Đơn vị
                        - Mỗi lần giảm byte cao thì cộng đơn vị cho 6 --> cộng chục cho 5 và cờ nhớ --> cộng trăm cho 2 và cờ nhớ --> cộng ô nhớ ngàn cho cờ nhớ ....
                        - Mỗi lần cộng thì nhớ hiệu chỉnh thập phân.
                        |

                        Comment


                        • #13
                          Bạn "pvkhai" đánh giá rất đúng.Tớ viết chương trình hiển thị led như thế thì rất mất thời gian để hiển thị led. Tớ đang muốn thực hiệnh cách gì mà nhanh hơn. Đã có ý định là chốt led nhưng cảm thấy ko thích. Bạn có cách gì hướng dẫn hoặc giới thiệu tài liệu cho tớ ko? để tớ có cái cách viết chương trình quest led mà mất rất ít thời gian như bạn nói! Cảm ơn !

                          Comment


                          • #14
                            Bạn ThanhLam xem thử đoạn code sau:

                            ;KHAI BAO
                            DANH_DAU EQU 7FH ; BYTE DANH DAU THU TU LED SANG
                            ;GIA TRI O BYTE 40H KHI SANG SE DUOC DANH_DAU LA 0
                            ;GIA TRI O BYTE 41H KHI SANG SE DUOC DANH_DAU LA 1
                            ;...
                            ;;GIA TRI O BYTE 44H KHI SANG SE DUOC DANH_DAU LA 4
                            ;----------------------
                            ORG 0000H
                            SJMP MAIM
                            ORG 001BH
                            LJMP HIENTHI ; chu y lênh nay
                            MAIN: ; THIET LAP NGAT T1
                            MOV IE,#88H ; CHO PHEP NGAT T1
                            MOV TMOD,#10H ; T1 O MODE 16 BIT
                            MOV TH1,#0F8H ; 2mS NGAT 1 LAN
                            MOV TL1,#2FH
                            SETB TR1
                            MOV DANH_DAU,#0
                            MOV P3,#0FFH

                            ;.....
                            ; -------------
                            HIENTHI: PUSH ACC
                            MOV TH1,#0F8H
                            MOV TL1,#2FH
                            MOV A,DANH_DAU
                            CJNE A,#0,LED1
                            MOV P2,40H
                            MOV P3,#0FFH
                            CLR P3.0
                            INC DANH_DAU
                            SJMP EXIT_T1
                            LED1: CJNE A,#1,LED2
                            MOV P2,41H
                            MOV P3,#0FFH
                            CLR P3.1
                            INC DANH_DAU
                            SJMP EXIT_T1
                            LED2: CJNE A,#2,LED3
                            MOV P2,42H
                            MOV P3,#0FFH
                            CLR P3.2
                            INC DANH_DAU
                            SJMP EXIT_T1
                            LED3: CJNE A,#3,LED4
                            MOV P2,43H
                            MOV P3,#0FFH
                            CLR P3.3
                            INC DANH_DAU
                            SJMP EXIT_T1
                            LED4: MOV P2,40H
                            MOV P3,#0FFH
                            CLR P3.4
                            MOV DANH_DAU,#0

                            EXIT_T1: POP ACC
                            RETI
                            ;----------------------------
                            Đoạn code này : cư 2mS T1 sẽ tạo 1 lần ngắt, sau 5 lần ngắt 5 led 7seg sẽ lần lượt sáng, mất khoảng 10mS, như vậy trong một giây sẽ quét 100 lần ( bạn có thể cho quét 50 lần cũng được bằng cách nâng T1 lên 4mS).
                            Trong đoạn code có byte DANH_DAU để đánh dấu led nay sáng.
                            Chúc thành công!

                            Comment

                            Về tác giả

                            Collapse

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

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

                            Collapse

                            Đang tải...
                            X