Thông báo

Collapse
No announcement yet.

Giúp em giải quyết vấn đề : tràn bit (overflow)

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

  • Giúp em giải quyết vấn đề : tràn bit (overflow)

    em đang lập trình đồng hồ số.khj em chuyển qua chương trình chỉnh thời gian cho đồng hồ số thì khj dùng lệnh dec hoạc inc thì bit nó bị tràn (em nghj là thế) nên nó hiện trên led 7 thanh loạn hết cả lên.bác nào có cách khắc phục tình trạng trên hộ em với
    có cái video
    Code:
    SCL BIT P3.0
    SDA BIT P3.1
    DULIEU EQU 50H
    ADD_DATA EQU 54H
    GIO EQU 51H
    PHUT EQU 52H
    GIAY EQU 53H
    
    ORG 00H
    
    LJMP MAIN
    ORG 0013H
    LJMP CHINH_GIO
    
    ORG 40H
    MAIN:
    MOV IE,#10000100b
    WAIT:
    CALL HIEN_NORMAL
    SJMP WAIT
    HIEN_NORMAL:
    CALL HIEN_S
    CALL HIEN_P
    CALL HIEN_H
    RET
    HIEN_S:
    MOV ADD_DATA,#00H
    CALL READ_DATA
    MOV GIAY,DULIEU
    CALL HIENTHI_S
    RET
    HIEN_P:
    MOV ADD_DATA,#01H
    CALL READ_DATA
    MOV PHUT,DULIEU
    CALL HIENTHI_P
    RET
    HIEN_H:
    MOV ADD_DATA,#02H
    CALL READ_DATA
    MOV GIO,DULIEU
    CALL HIENTHI_H
    RET
    SEND_DATA:
    CALL START
    MOV A,#0D0H
    CALL SEND
    SETB SCL
    CLR SCL
    MOV A,ADD_DATA
    CALL SEND
    SETB SCL
    CLR SCL
    MOV A,DULIEU
    CALL SEND 
    SETB SCL
    CLR SCL
    CALL STOP
    RET
    
    READ_DATA:
    CALL START
    MOV A,#0D0H
    CALL SEND
    SETB SCL
    CLR SCL
    MOV A,ADD_DATA
    CALL SEND
    SETB SCL
    CLR SCL
    CALL STOP
    CALL START
    MOV A,#0D1H
    CALL SEND
    SETB SCL
    CLR SCL
    CALL RECIVE
    SETB SCL
    CLR SCL
    CALL STOP
    RET
    
    SEND:
    MOV R1,#8
    LOOP:
    RLC A
    MOV SDA,C
    SETB SCL
    CLR SCL
    DJNZ R1,LOOP
    RET
    RECIVE:
    MOV R1,#8
    CLR A
    LOOP1:
    MOV C,SDA
    SETB SCL
    CLR SCL
    RLC	A
    DJNZ R1,LOOP1
    MOV DULIEU,A
    RET
    START:
    SETB SDA
    SETB SCL
    NOP
    CLR SDA
    NOP
    CLR SCL
    RET
    STOP:
    CLR SCL
    CLR SDA
    NOP
    SETB SCL
    NOP
    SETB SDA
    RET
    HIENTHI_S:
    MOV P2,#00000000B
    SWAP A
    ANL A,#00001111B
    MOV 	DPTR,#MALED		;
    MOVC 	A,@A+DPTR
    MOV P1,A
    SETB P2.0
    CALL DELAY
    CLR P2.0
    MOV A,DULIEU
    ANL A,#00001111B
    MOV 	DPTR,#MALED		;
    MOVC 	A,@A+DPTR
    MOV P1,A
    SETB P2.1
    CALL DELAY
    CLR P2.1
    RET
    HIENTHI_P:
    MOV P2,#00000000B
    SWAP A
    ANL A,#00001111B
    MOV 	DPTR,#MALED		;
    MOVC 	A,@A+DPTR
    MOV P1,A
    SETB P2.2
    CALL DELAY
    CLR P2.2
    MOV A,DULIEU
    ANL A,#00001111B
    MOV 	DPTR,#MALED		;
    MOVC 	A,@A+DPTR
    MOV P1,A
    SETB P2.3
    CALL DELAY
    CLR P2.3
    RET
    HIENTHI_H:
    MOV P2,#00000000B
    SWAP A
    ANL A,#00001111B
    MOV 	DPTR,#MALED		;
    MOVC 	A,@A+DPTR
    MOV P1,A
    SETB P2.4
    CALL DELAY
    CLR P2.4
    MOV A,DULIEU
    ANL A,#00001111B
    MOV 	DPTR,#MALED		;
    MOVC 	A,@A+DPTR
    MOV P1,A
    SETB P2.5
    CALL DELAY
    CLR P2.5
    RET
    CHINH_GIO:
    JNB P3.2,OUTH
    MOV A,GIO
    MOV DULIEU,GIO
    CALL HIENTHI_H
    CALL CHECK
    SJMP CHINH_GIO
    OUTH:
    MOV ADD_DATA,#02H
    CALL SEND_DATA
    JNB P3.2,$
    sjmp CHINH_PHUT
    CHECK:
    JB P3.4,CHECK2
    JNB P3.4,$
    INC GIO
    MOV A,GIO
    CJNE A,#24H,CHECK
    CALL MINGIO
    SJMP CHECK
    CHECK2:
    JB P3.5,EXIT
    JNB P3.5,$
    MOV A,GIO
    CJNE A,#00H,GIAM
    CALL MAXGIO
    RET
    GIAM:
    DEC GIO
    SJMP CHINH_GIO
    EXIT:
    RET
    MAXGIO:
    MOV GIO,#23H
    RET
    MAXPHUT:
    MOV GIO,#59H
    RET
    MAXGIAY:
    MOV GIO,#59H
    RET
    MINGIO:
    MOV GIO,#00H
    RET
    MINPHUT:
    MOV PHUT,#00H
    RET
    MINGIAY:
    MOV GIAY,#00H
    RET
    CHINH_PHUT:
    JNB P3.2,OUTP
    MOV A,PHUT
    MOV DULIEU,PHUT
    CALL HIENTHI_P
    CALL CHECKP
    SJMP CHINH_PHUT
    OUTP:
    MOV ADD_DATA,#01H
    CALL SEND_DATA
    JNB P3.2,$
    sjmp CHINH_GIAY
    
    CHECKP:
    JB P3.4,CHECKP2
    JNB P3.4,$
    INC PHUT
    MOV A,PHUT
    CJNE A,#60H,CHECKP
    CALL MINPHUT
    SJMP CHECKP
    CHECKP2:
    JB P3.5,EXIT
    JNB P3.5,$
    MOV A,PHUT
    CJNE A,#00H,GIAMPHUT
    CALL MAXPHUT
    RET
    GIAMPHUT:
    DEC PHUT
    LJMP CHINH_PHUT
    RET
    CHINH_GIAY:
    JNB P3.2,OUTS
    MOV A,GIAY
    MOV DULIEU,GIAY
    CALL HIENTHI_S
    CALL CHECKS
    SJMP CHINH_GIAY
    OUTS:
    MOV ADD_DATA,#00H
    CALL SEND_DATA
    RETI
    CHECKS:
    JB P3.4,CHECKS2
    JNB P3.4,$
    INC GIAY
    MOV A,GIAY
    CJNE A,#60H,CHECKS
    CALL MINGIAY
    SJMP CHECKS
    CHECKS2:
    JB P3.5,EXIT
    JNB P3.5,$
    MOV A,GIAY
    CJNE A,#00H,GIAMGIAY
    CALL MAXGIAY 
    RET
    GIAMGIAY:
    DEC GIAY
    LJMP CHINH_GIAY
    RET
    
    DELAY: MOV R1,#99
    DJNZ R1,$
    RET
    MALED:
    	DB 		40H,79H,24H,30H,19H,12H,02H,78H,00H,10H
    
    END

  • #2
    những chỗ tăng giảm giờ (hoặc phút) bạn chỉnh lại cách tăng và giảm như sau:
    tăng
    Code:
            MOV	A,GIO
    	ADD	A,#1H
    	DA	A
    	MOV	GIO,A
    giảm
    Code:
            MOV	A,GIO
    	ADD	A,#99H
    	DA	A
    	MOV	GIO,A

    Comment


    • #3
      Mình chưa làm về cái này nên không dám tham gia vào code của bạn, nhưng mình có góp ý cho bạn thế này:
      Theo như bạn mô tả về chương trình thì khi bấm phím điều chỉnh tăng hoặc giảm, LED 7 thanh hiển thị không đúng với số lần bấm phím. Mình nghĩ vấn đề này là do đoạn xử lí nhận biết phím bấm chưa được tốt, vì thế khi bạn bấm phím VĐK chưa kịp nhận biết phím bấm nên mới có tình trạng số hiển thị không trùng khớp với số lần bấm phím.

      Comment


      • #4
        Nguyên văn bởi Ck33spkt Xem bài viết
        Mình chưa làm về cái này nên không dám tham gia vào code của bạn, nhưng mình có góp ý cho bạn thế này:
        Theo như bạn mô tả về chương trình thì khi bấm phím điều chỉnh tăng hoặc giảm, LED 7 thanh hiển thị không đúng với số lần bấm phím. Mình nghĩ vấn đề này là do đoạn xử lí nhận biết phím bấm chưa được tốt, vì thế khi bạn bấm phím VĐK chưa kịp nhận biết phím bấm nên mới có tình trạng số hiển thị không trùng khớp với số lần bấm phím.
        thực ra nút bấm luôn có tác dụng tăng nhưng led lại ko hiển thị, chú thử lấy code đó mô phỏng với bảng tra 16 giá trị thay vì 10 giá trị như của chủ thớt xem
        ở CTcon tăng giảm phút, giả sử phút đang là 49, nếu tăng thì VDK sẽ tăng kiểu nào:
        49 tăng 1 thành 50 ! SAI
        49 tăng 1 thành 4A mới đúng. Và vì trong bảng tra ko có giá trị thứ 11 của số A nên ko hiển thị đc

        Comment


        • #5
          cảm ơn các anh nhé

          Comment


          • #6
            Nguyên văn bởi chung1608 Xem bài viết
            thực ra nút bấm luôn có tác dụng tăng nhưng led lại ko hiển thị, chú thử lấy code đó mô phỏng với bảng tra 16 giá trị thay vì 10 giá trị như của chủ thớt xem
            ở CTcon tăng giảm phút, giả sử phút đang là 49, nếu tăng thì VDK sẽ tăng kiểu nào:
            49 tăng 1 thành 50 ! SAI
            49 tăng 1 thành 4A mới đúng. Và vì trong bảng tra ko có giá trị thứ 11 của số A nên ko hiển thị đc
            Nếu đúng như anh nói thì cần phải thêm một đoạn chương trình đổi từ số hex sang số thập phân trước khi hiển thị hả bác?

            Comment


            • #7
              Nguyên văn bởi Ck33spkt Xem bài viết
              Nếu đúng như anh nói thì cần phải thêm một đoạn chương trình đổi từ số hex sang số thập phân trước khi hiển thị hả bác?
              hai đoạn code trên là để xử lý tăng giảm kết hợp biến đổi ra gói BCD 8 bit nạp ngược lại cho 1307, và để hiện thị gói BCD này thì ko thể đổi hex sang thập phẩn để hiển thị mà phải dùng cách của chủ thớt là ANL lấy trọng số thấp cao

              Comment


              • #8
                Nguyên văn bởi chung1608 Xem bài viết
                những chỗ tăng giảm giờ (hoặc phút) bạn chỉnh lại cách tăng và giảm như sau:
                Tăng
                Code:
                        mov	a,gio
                	add	a,#1h
                	da	a
                	mov	gio,a
                giảm
                Code:
                        mov	a,gio
                	add	a,#99h
                	da	a
                	mov	gio,a
                bác cho em hỏi ngu 1 tí: Sao cái giảm lại cộng 99

                Comment


                • #9
                  Nguyên văn bởi xamdor_bka Xem bài viết
                  bác cho em hỏi ngu 1 tí: Sao cái giảm lại cộng 99
                  vì lệnh DA A chỉ làm việc sau lệnh ADD và ADDC, mà hai lệnh này là lệnh cộng nên để tăng 1 ta cộng cho 1 còn để giảm 1 ta cộng cho 99H (nhớ là 99H chứ ko phải 99 ) muốn hiểu rõ thì bạn phải xem giải thích lệnh DA trong sách của bạn

                  Comment


                  • #10
                    Nguyên văn bởi chung1608 Xem bài viết
                    vì lệnh DA A chỉ làm việc sau lệnh ADD và ADDC, mà hai lệnh này là lệnh cộng nên để tăng 1 ta cộng cho 1 còn để giảm 1 ta cộng cho 99H (nhớ là 99H chứ ko phải 99 ) muốn hiểu rõ thì bạn phải xem giải thích lệnh DA trong sách của bạn
                    Ra là vậy, hay thật.
                    99H = 1001.1001 là số BCD lớn nhất, nên cộng với bất kỳ số nào cũng làm số đó bị giảm 1. Giống như bị tràn vậy.
                    A = 6h
                    99h + 6h = 5h (A = 5h)
                    99h + 5h = 4h (A = 4h)
                    ....

                    Comment


                    • #11
                      Nguyên văn bởi TheHouse Xem bài viết
                      Ra là vậy, hay thật.
                      99H = 1001.1001 là số BCD lớn nhất, nên cộng với bất kỳ số nào cũng làm số đó bị giảm 1. Giống như bị tràn vậy.
                      A = 6h
                      99h + 6h = 5h (A = 5h)
                      99h + 5h = 4h (A = 4h)
                      ....
                      Bạn suy thế nào mà lại ra cái lập luận trên vậy?
                      99h + 6h = 9Fh
                      99h + 5h = 9Eh
                      và FFh = 1111 1111B mới là số BCD lớn nhất!

                      Comment


                      • #12
                        Nguyên văn bởi Ck33spkt Xem bài viết
                        Bạn suy thế nào mà lại ra cái lập luận trên vậy?
                        99h + 6h = 9Fh
                        99h + 5h = 9Eh
                        và FFh = 1111 1111B mới là số BCD lớn nhất!
                        BCD số 9 là lớn nhất chú à
                        Binary-Coded Decimal trong tên chỉ có hệ nhị phân và thập phân thì lấy đâu ra FF
                        vào wikipedia mà xem ^^

                        Comment


                        • #13
                          Nguyên văn bởi chung1608 Xem bài viết
                          BCD số 9 là lớn nhất chú à
                          Binary-Coded Decimal trong tên chỉ có hệ nhị phân và thập phân thì lấy đâu ra FF
                          vào wikipedia mà xem ^^
                          Vâng cái này thì đúng là em nhầm. Chữ số '9D = 1001' đúng là BCD lớn nhất. Nhưng chủ topic cũng nhầm vì phải là 99D không phải 99H.
                          Last edited by Ck33spkt; 13-09-2012, 00:15. Lý do: Sai chính tả

                          Comment


                          • #14
                            Nguyên văn bởi TheHouse Xem bài viết
                            Ra là vậy, hay thật.
                            99H = 1001.1001 là số BCD lớn nhất, nên cộng với bất kỳ số nào cũng làm số đó bị giảm 1. Giống như bị tràn vậy.
                            A = 6h
                            99h + 6h = 5h (A = 5h)
                            99h + 5h = 4h (A = 4h)
                            ....
                            thank bác!đúng vấn đề em đang thắc mắc

                            Comment


                            • #15
                              Nguyên văn bởi Ck33spkt Xem bài viết
                              Vâng cái này thì đúng là em nhầm. Chữ số '9D = 1001' đúng là BCD lớn nhất. Nhưng chủ topic cũng nhầm vi phải là 99D không phải 99H.
                              em dùng 99h thì chương trình chạy ngon,chứng tỏ nó đúng

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X