Thông báo

Collapse
No announcement yet.

Giải thuật chuyển số nhị phân 16 BIT thành các con số BCD không nén

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

  • Giải thuật chuyển số nhị phân 16 BIT thành các con số BCD không nén

    có bạn nào biết cách chuyển chẳng hạn con số 2560 tức 0a00h thành các con số 02h,05h,06h,00h xin chỉ dùm

  • #2
    Code:
    unsigned char result[4];//4 byte chứa số đã chuyển thành không nén
    result[0]=parameter%10;//parameter biến mà bạn cần chuyển thành BCD không nén kiểu int
    parameter/=10;
    result[1]=parameter%10;
    parameter/=10;
    result[2]=parameter%10;
    parameter/=10;
    result[3]=parameter%10;
    parameter/=10;
    Code này cho C.

    Sông dài, Thuyền lớn, Biển rộng bao la.
    Tháo neo ngôn ngữ, lèo lái con thuyền kiến thức nhân loại.

    Comment


    • #3
      còn với asm thì viết nó như thế nào

      Comment


      • #4
        org 0
        mov a,#0a00h ;day la so can chuyen
        mov b,#10
        div ab
        mov r0,b ;so don vi chua trong r0
        mov b,#10
        div ab
        mov r1,b ;so hang chuc chua trong r1
        mov b,#10
        div ab
        mov r2,b ;so hang tram chua trong r2
        mov b,#10
        div ab
        mov r3,b ;so hang ngan chua trong r3
        mov r4,a ;so hang chuc ngan chua trong r4
        ; vi so 16 bit tối đa la 65535 (5 chữ số)
        end

        Comment


        • #5
          vì a là thanh ghi chỉ chứa con số 8 bit cho nên không thể
          .........
          mov a,#0a00h ;day la so can chuyen
          .........
          với lại lệnh div ab chỉ dùng để chia 1 so 8 bit cho 1 số 8 bit vì vậy không thể làm như trên được

          Comment


          • #6
            ;chia con so16 bit cho con so 8 bit
            ;giai thuat :
            ; 1. Dat 8bit cao vao R7, 8 bit thap vao R6
            ; mov r7, high(conso16BIT)
            ; mov r6, low(conso16BIT)
            ; 2. dat so chia 8 bit vao b
            ; mov b,sochia8bit

            ; 3.0 xoa co nho c (clr c)
            ; dich trai co nho(rlc) R6 (luc nay R6.0 = 0)
            ; 3.1 dich trai co nho(rlc) R7 (dua R6.7 vao R7.0)
            ; 3.2 dich trai co nho (rlc) a (dua R7.7 vao acc.0)
            ; 4. so sanh a va b neu:
            ; - a < b quay ve 1.
            ; - a>= b lay a - b va setb R6.0 sau do quay ve 1.
            ; 5. qui trinh ket thuc khi da day het 16 bit vao acc.0
            ; ket qua la con so co : 8 bit cao R7 , 8 bit thap R6 , so du nam o thanh ghi a

            Comment


            • #7
              Code ASM đây, mình không nhớ là lấy từ nguồn nào

              Hex16toBCD:

              ; Converts 2-digit hex number (r3:r2)
              ; to 5-digit BCD number (030H:031H:032H:033H:034H).
              ; Destroys A, B, registers r all.

              mov r0, #030H ; r0 = pout
              mov dptr, #tab ; r=tab(p)

              com1:

              clr a ; p <- 0
              movc a, @a+dptr ; r <- tab(p)
              mov r7, a
              inc dptr
              clr a
              movc a, @a+dptr
              mov r6, a

              mov r4, #0 ; c <- 0


              soma: ; n <- n-r
              clr c
              mov a, r2
              subb a, r6
              mov r2, a

              mov a, r3
              subb a, r7
              mov r3, a
              jc saida ; if < 0 goto saida
              inc r4 ; if >0 then c <- c +1
              jmp soma ; goto soma

              saida:
              mov a, r4
              mov @r0, a ; tabout (pout) <- c

              mov a, r2
              add a, r6 ; n=n+r
              mov r2, a

              mov a, r3
              addc a, r7
              mov r3, a

              inc r0 ; psaida=psaida +1

              clr a
              movc a, @a+dptr
              cjne a, #1, incrementa ; tab(p) = 1 ?

              ret ; if yes, end

              incrementa: ; if no, p <- p+1
              inc dptr
              jmp com1 ; goto com1


              tab:
              dw 10000
              dw 1000
              dw 100
              dw 10
              dw 1
              Imagine all the people
              Living life in peace...

              Comment


              • #8
                Tui xin bổ sung về giải thuật của đoạn code trên.
                Điểm hay của giải thuật là chỉ sử dụng phép trừ mà không sử dụng phép chia cho 10 tìm số dư như các giải thuật khác.
                Điều này giúp nó chạy được trên hầu hết các loại MCU (dĩ nhiên phải sửa code lại), vì một số MCU dòng RISC không có lệnh nhân/chia.
                Imagine all the people
                Living life in peace...

                Comment


                • #9
                  cach chuyen so hexa sang BCD la chia so hexa cho 10 lien tiep. Ban co the tham khao o cac quyen sach viet ve VDK 89c51.
                  Neu ban thuc hien bang AVR thi phai viet 1 chuong trinh con thuc hien phep chia. De viet chuong trinh thuc hien phep chia thi ban dung thuat toan sau:
                  (ko bit co dung ko 0,5 nam roi)
                  gia su A:B la hai so nhi phan dc luu trong 2 thanh ghi
                  BEGIN: dich trai A(1 bit) vao 1 thanh ghi phu(C),
                  so sanh C va B , neu c<b thi ghi 0 vao thanh ghi ket qua(D) nguoc lai ghi 1 vao thanh ghi kq.
                  lap lai BEGIN cho den khi A dich het so bit no co.
                  Sau khi da co chuong trinh chia roi thi ban nap thanh ghi A gia tri so can chuyen, thanh ghi B la 10. sau do viet them phan kiem tra xem A<B ko, neu ko thi goi lai chuong trinh chia.
                  Good luck!
                  Last edited by dtn0hut; 24-04-2007, 17:03.
                  |

                  Comment


                  • #10
                    Nguyên văn bởi phamkhuyen Xem bài viết
                    ;chia con so16 bit cho con so 8 bit
                    ;giai thuat :
                    ; 1. Dat 8bit cao vao R7, 8 bit thap vao R6
                    ; mov r7, high(conso16BIT)
                    ; mov r6, low(conso16BIT)
                    ; 2. dat so chia 8 bit vao b
                    ; mov b,sochia8bit

                    ; 3.0 xoa co nho c (clr c)
                    ; dich trai co nho(rlc) R6 (luc nay R6.0 = 0)
                    ; 3.1 dich trai co nho(rlc) R7 (dua R6.7 vao R7.0)
                    ; 3.2 dich trai co nho (rlc) a (dua R7.7 vao acc.0)
                    ; 4. so sanh a va b neu:
                    ; - a < b quay ve 1.
                    ; - a>= b lay a - b va setb R6.0 sau do quay ve 1.
                    ; 5. qui trinh ket thuc khi da day het 16 bit vao acc.0
                    ; ket qua la con so co : 8 bit cao R7 , 8 bit thap R6 , so du nam o thanh ghi a
                    Mình viết theo giải thuật này, nhưng mình chạy ko thấy có kết quả, mặc dù mình debug trên giấy thấy thuật toán này cho kết quả đúng. Đúng hơn là mình ko biết cách kiểm tra đoạn code này, mình loay hoay ko biết nó sai ở đâu mà khi chạy ko cho đc kết quả ra Led hoặc đơn giản mình mov kết quả ra 1 P nào đấy thôi cũng ko thấy gì, bạn nào làm ơn sửa hộ mình đc ko. Thông cảm nhé mình mới học lập trình vxl nên ko có kn, mong các bạn giúp đỡ mình. Xin chân thành cảm ơn


                    Div16_8:

                    mov R7,HiByte
                    mov R6,LoByte
                    ; Mov b,SoChia8Bit
                    mov count,#00h
                    Mov Tmp,#00h

                    DivLoop:
                    Clr C
                    mov a,R6;
                    rlc a; R6.0=0, R6.7 dua vao C flag
                    mov R6,a

                    mov a,R7
                    rlc a; R7.0= C flag, r7.7 dua vao C flag
                    mov R7,a

                    mov a, Tmp
                    rlc a; acc.0 = c flag = R7.7,
                    mov Tmp,a

                    inc Count

                    clr ov
                    clr c

                    mov b,SoChia8Bit
                    mov a,Tmp


                    subb a,b

                    jb ov, ANhoHonB
                    mov Tmp, a

                    mov a,R6
                    orl a, #01h
                    mov R6,a ; setb R6.0
                    mov p2,a

                    ANhoHonB:
                    mov a,Count
                    cjne a,#16,DivLoop

                    Mov a,R6 ; ket qua dua vao acc



                    ret
                    Last edited by ngocdq; 20-06-2007, 21:47.
                    |

                    Comment


                    • #11
                      CHIA CON SỐ 16 BIT CHO CON SỐ 8 BIT .asm

                      xin lỗi phần trả lời cua tôi mà bạn trích dẫn có chỗ sai : Quay về 3 chứ không phải 1
                      Sau đây là đoan chương trình tôi viết bạn thử lại xem



                      Code:
                      $mod51
                      ;**************************************************************************
                      ;CHUONG TRING :		chia16_8
                      ;Chia con so 16bit cho con so 8 bit
                      ;Nguoi thuc hien : 		PHAM THANH KHUYEN
                      ; Ngay thuc hien: 		20/06/2007
                      ;Prosessor: 			89c51
                      ;OSC:			12MHz
                      ;**************************************************************************
                      ;giai thuat : 
                      ; 1. Dat 8bit cao vao R7, 8 bit thap vao R6
                      ; mov r7, high(conso16BIT)
                      ; mov r6, low(conso16BIT)
                      ; 2. dat so chia 8 bit vao b
                      ; mov b,sochia8bit
                      
                      ; 3.0 xoa co nho c (clr c)
                      ; dich trai co nho(rlc) R6 (luc nay R6.0 = 0)
                      ; 3.1 dich trai co nho(rlc) R7 (dua R6.7 vao R7.0)
                      ; 3.2 dich trai co nho (rlc) a (dua R7.7 vao acc.0)
                      ; 4. so sanh a va b neu:
                      ; - a < b quay ve 3.
                      ; - a>= b lay a - b va setb R6.0 sau do quay ve 3.
                      ; 5. qui trinh ket thuc khi da day het 16 bit vao acc.0 
                      ; ket qua la con so co : 8 bit cao R7 , 8 bit thap R6 , so du nam o thanh ghi a
                      ;****************************************************************************
                      
                      ;...............................................................................................................
                      ;vi du chia con so 8564 ( hex=2174h) cho 4 (04h) = 2141 (085dh)
                      ;Dung PROTEUS de kiem tra
                      ;KET QUA : P1 = 00001000 (08) ; P0 = 01011101 (5D)
                      ;.................................................................................................................
                      
                      		Byte_h	equ	21h
                      		Byte_l	equ	74h
                      		Sochia	equ	04h
                      
                      		ORG 0000h
                      		Ljmp main
                      		
                      
                      		ORG 0030h
                      main:
                      		mov p2, #11001101b
                      		mov p0, #0
                      		mov p1, #0
                      start:		call chia16_8
                      		mov p0, r6
                      		mov p1, r7
                      		jmp start
                      
                      ;---------------------------------------------------------------------------------------
                      ;CHUONG TRINH CHIA CON SO 16 BIT CHO 8 BIT
                      chia16_8:
                      
                      ;buoc1:
                      		mov r6, #Byte_l
                      		mov r7, #Byte_h
                      ;buoc2:
                      		mov b, #sochia
                      		clr a
                      		mov r2, #16	
                      buoc3:
                      		xch a, r6		;
                      		clr c
                      		rlc a
                      		xch a, r6
                      ;
                      		xch a, r7		;
                      		rlc a
                      		xch a, r7		
                      ;
                      		rlc a
                      ;buoc4:
                      		mov r0, a
                      		clr c
                      		subb a, b
                      		jnc a_lonORbang_b
                      		mov a, r0
                      		jmp xoay
                      a_lonORbang_b:	xch a, r6
                      		add a, #1
                      		xch a, r6
                      
                      xoay:
                      		djnz r2, buoc3
                      		xch a, b
                      		RET	
                      
                      end
                      Attached Files

                      Comment


                      • #12
                        đây chỉ là cách làm nhưng không biết có ai giải thích vì sao làm như vậy?

                        Comment


                        • #13
                          298 = 2*100+9*10+8*1
                          298 = 100101010
                          100 = 1100100
                          10 = 1010
                          1 = 0001
                          298 =100101010 = X*1100100 +Y*1010+Z*0001
                          100101010 / 1100100 = 0010 DƯ 1100010 >> X=0010
                          1100010 / 1010 =1001 DƯ 1000 >> Y =0010
                          1000 / 1 =1000 , HEÁT DÖ >> Z = 1000
                          VAÄY: X=0010 BCD = 2
                          Y=0010 BCD = 9
                          Z=1000 BCD = 8

                          QUA MOI LẦN KIỂM TRA (CP) VÀ CHIA (DIV) HOẶC TRừ (SUB) LIÊN TIẾP KẾT QUả LưU VàO THANH GHI RỒI NHÉt (STR) VẦO SRAM THEO THỨ TỰ X,Y,Z SAU ĐÓ LẤY RA THEO THỨ TỰ BẰNG CÁCH LUI CON TRỎ Z LẠI ĐỂ TRUY CẬP SRAM . LẤY Z,Y,X RỒI XUẤT LẦN LƯỢT RA PORT DATA CÙNG VỚI QUÉT CỘT TƯƠNG ỨNG NHƯ LÀ MỘT INTERUPT_TIMER0 _ISR ( KHỎANG 5MS) SẼ LÀM CHO 3 LED 7SEG SAU KHI QUA 7447 SẼ SÁNG LÊN CÁC CON SỐ 2 – 9 – 8 .
                          KHÔNG THỂ NÓI LẤY MỘT KẾT QUẢ NHỊ PHÂN 8 BIT CỦA MỘT ADC CHẲNG HẠN RỒI CHIA LIÊN TIẾP CHO 10 (MƯỜI). VÌ VẬY CẦN GIẢI THÍCH RÕ RÀNG NHƯ VẬY.

                          VẤN ĐỀ kosovo ĐÃ ĐƯỢC GIẢI QUYẾT. NẾU AI CÓ HỌC VDK THÌ CÓ THỂ CÙNG TRAO ĐỔI
                          TG: 0902989240.

                          http://www.youtube.com/watch?v=gPjYL...eature=related

                          Comment


                          • #14
                            có ai biết lam trên avr ko chỉ mình với

                            Comment

                            Về tác giả

                            Collapse

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

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

                            Collapse

                            Đang tải...
                            X