Thông báo

Collapse
No announcement yet.

Xử lý biến đếm lớn hơn 256 để xuất led

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

  • Xử lý biến đếm lớn hơn 256 để xuất led

    Các anh ơi cho em hỏi, em đang làm mạch đếm sản phẩm, số lượng sản phẩm từ 0 đến 9999, thanh ghi đếm em chọn là DPTR, nhưng khi giá trị đếm vượt quá 256 thì em không biết cách nào hiệu chỉnh để xuất ra 7SEG. Mong các anh giúp đỡ dùm ! Thanks !

  • #2
    Nguyên văn bởi toilq30 Xem bài viết
    Các anh ơi cho em hỏi, em đang làm mạch đếm sản phẩm, số lượng sản phẩm từ 0 đến 9999, thanh ghi đếm em chọn là DPTR, nhưng khi giá trị đếm vượt quá 256 thì em không biết cách nào hiệu chỉnh để xuất ra 7SEG. Mong các anh giúp đỡ dùm ! Thanks !
    bạn có thể dùng vòng lặp để có thể đếm giá trị lớn hơn:
    vd:
    mov R0,#255
    ct1: mov R1,#255
    .....................
    ct2: djnz r1,ct2
    djnz r2,ct1
    kq lặp = 255x255 = 65025 lần
    tha hồ cho bạn đếm nhé. Chúc thành công
    Last edited by lenovo_y410; 05-10-2009, 23:06.

    Comment


    • #3
      Nguyên văn bởi lenovo_y410 Xem bài viết
      bạn có thể dùng vòng lặp để có thể đếm giá trị lớn hơn:
      vd:
      ct1: mov R0,#255
      ct2: mov R1,#255
      .....................
      djnz r1,ct2
      djnz r2,ct1
      kq lặp = 255x255 = 65025 lần
      tha hồ cho bạn đếm nhé. Chúc thành công
      Em cám ơn anh nhiều, nhưng em vẫn chưa hiểu lắm. Bài toán của em đặt ra là khi có sản phẩm đi qua thì giá trị của thanh ghi tăng lên 1, do giá trị đếm tối đa là 9999 nên em chọn thanh ghi để đếm là DPTR (không biết có đúng không), khi giá trị DPTR lớn hơn 256 thì em ko biết xử lý để xuất ra 4 con LED. Giả xử em muốn chọn 2 thanh ghi R0 và R1 thì em phải xử lý thế nào và có khác gì so với chon thanh ghi DPTR không. Mong các anh giúp em dùm ! Thankss!

      Comment


      • #4
        http://8052.com Vào trang này mà xem thuật toán thực hiện phép cộng trừ nhân chia 16 bit sử dụng 2 thanh ghi 8bit

        Comment


        • #5
          Khai báo 1 biến kiểu unsigned int, nó có giá trị từ 0 đến 65535 thì đếm vô tư rồi.
          Mỗi lần có sản phẩm đi qua thi cho biến này tăng thêm 1 giá trị.
          Kết quả ta chia lấy phần nghìn, trăm, chuc và phấn đơn vị xuất ra Led.
          Ví dụ như thế này chẳng hạn:
          PHP Code:
          unsigned int result;
          unsigned char a,b,c,d;
          result/1000;                    // Số hàng nghìn
          =(result%1000)/100;           // Số hàng trăm 
          = ((result%1000)%100)/10;  // Số hàng chục
          =((result%1000)%100)%10;  // Số hàng đơn vị 

          Comment


          • #6
            4 ký số bcd dùng 2byte

            Nguyên văn bởi toilq30 Xem bài viết
            Các anh ơi cho em hỏi, em đang làm mạch đếm sản phẩm, số lượng sản phẩm từ 0 đến 9999, thanh ghi đếm em chọn là DPTR, nhưng khi giá trị đếm vượt quá 256 thì em không biết cách nào hiệu chỉnh để xuất ra 7SEG. Mong các anh giúp đỡ dùm ! Thanks !
            thân gởi bạn, không biết như thế này có đúng ý bạn không. được thì thanks cái nhé
            bcdh equ 30h
            bcdl equ 31h
            buffer_bcd1 equ 32h
            buffer_bcd2 equ 33h
            buffer_bcd4 equ 34h
            buffer_bcd3 equ 35h
            led_num equ 36h

            inc_index_bcd:
            mov a,bcdl ; byte thấp bcd
            add a,#1
            da a ;đổi sang số BCD
            mov bcdl,a
            mov a,bcdh ; byte cao bcd
            addc a,#0 ;nếu bcdl tràn từ 99--00 thì tăng bcd lên 1(C=1)
            da a ;đổi sang số BCD
            mov bcdh,a

            mov a,bcdl
            mov r0,#buffer_bcd1
            xchd a,@r0 ;lấy số hàng đơn vị
            swap a
            mov r0,#buffer_bcd2
            xchd a,@r0 ;hàng chục

            mov a,bcdh
            mov r0,#buffer_bcd3
            xchd a,@r0 ;hàng trăm
            swap a
            mov r0,#buffer_bcd4
            xchd a,@r0 ;hàng nghìn
            ret
            Attached Files

            Email:
            Tel: 0983.497.310

            Comment


            • #7
              em cảm ơn sự nhiệt tình của các anh. Code viết = C nhìn dễ hiểu quá, đúng là C cấp cao thật. Còn ASM nhìn phức tạp quá, em sẽ nghiên cứu kỹ, nếu có gì thắc mắc em nhờ các anh giúp đỡ thêm. Vì em dang làm đồ án về mạch đếm mà . thanks

              Comment


              • #8
                Nguyên văn bởi toilq30 Xem bài viết
                em cảm ơn sự nhiệt tình của các anh. Code viết = C nhìn dễ hiểu quá, đúng là C cấp cao thật. Còn ASM nhìn phức tạp quá, em sẽ nghiên cứu kỹ, nếu có gì thắc mắc em nhờ các anh giúp đỡ thêm. Vì em dang làm đồ án về mạch đếm mà . thanks
                viết C thì dễ nhưng asm mới pro phải không bạn
                code tôi test ok chúc bạn thành công

                Email:
                Tel: 0983.497.310

                Comment


                • #9
                  Mấy anh ơi cho em hỏi sơ đồ kết nối để giao tiếp với EEPROM như trong hình sau đúng hay không vậy ? Do em muốn lưu trữ giá trị đếm lỡ khi mất điện nên em sử dụng con này. Và sẵn tiện các anh có thể giải thích dùm em chương trình đọc và ghi dữ liệu ( kèm file 24c04.asm) vào eeprom được không ?
                  Sao em đính kèm file mà không được !

                  ;RAM LOCATION USED IN THIS MODULE 70H
                  ;THIS IS A WORKING PROGRAM, TESTED ON 24C04 SERIAL MEMORY IC
                  ;THE SAME CODE CAN BE USED FOR OTHER I2C IC'S WITH MODIFICATION.


                  #include <sfr51.inc>

                  WTCMD EQU 10100000B ;24C04 WRITE COMMAND
                  RDCMD EQU 10100001B ;24C04 READ COMMAND
                  ADDRS EQU 70H

                  SCL BIT P3.0 ;SERIAL CLOCK PIN
                  SDA BIT P3.1 ;SERIAL DATA PIN


                  ORG 0000H
                  LJMP MAINLINE

                  ORG 0030H
                  MAINLINE:
                  MOV ADDRS,#00H
                  LOOP:
                  MOV R1,#11110000B
                  LCALL WRITE
                  INC ADDRS
                  MOV A,ADDRS
                  CJNE A,#0FH,LOOP


                  ;************************************************* ****************************
                  ;THIS IS USED TO WRITE INTO 24C04
                  ;ARGUMENTS1 --> ADDRS => ADDRESS TO BE WRITTEN INTO,IN 24C04 MEMORY
                  ;ARGUMENTS2 --> R1 ==> DATA TO BE WRITTEN
                  ;RETURN --> NONE
                  ;************************************************* **************************
                  WRITE:
                  MOV A,#WTCMD
                  ACALL OUTS

                  MOV A,ADDRS
                  ACALL OUT

                  MOV A,R1
                  ACALL OUT

                  ACALL TOP
                  RET
                  ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@
                  ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@
                  ;THIS SUB ROUTINE IS USED TO READ DATA FROM THE 24C04
                  ;ARGUMENTS --> ADDRS ==> ADDRESS IN 24C04,THE DATA SHOULD BE READ FROM.
                  ;RETURN --> R2(DATA THAT WAS READ)
                  ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@
                  READ:
                  MOV A,#WTCMD
                  ACALL OUTS

                  MOV A,ADDRS
                  LCALL OUT

                  MOV A,#RDCMD
                  LCALL OUTS

                  LCALL IN
                  MOV R2,A

                  LCALL STOP

                  RET
                  ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@


                  ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@
                  OUTS:
                  MOV B,#8
                  SETB SDA ; START CONDITTION
                  SETB SCL
                  NOP
                  CLR SDA
                  NOP
                  CLR SCL
                  NOP
                  NOP

                  OSLOOP:
                  RLC A
                  MOV SDA,C
                  SETB SCL
                  NOP
                  CLR SCL
                  DJNZ B,OSLOOP
                  SETB SDA
                  NOP
                  SETB SCL
                  NOP
                  CLR SCL
                  RET
                  ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@


                  ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@
                  OUT:
                  MOV B,#8
                  OLOOP:
                  RLC A
                  MOV SDA,C
                  SETB SCL
                  NOP
                  CLR SCL
                  DJNZ B,OLOOP
                  SETB SDA
                  NOP
                  SETB SCL
                  NOP
                  CLR SCL
                  RET
                  ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@


                  ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@
                  IN:
                  MOV B,#8
                  SETB SDA
                  NOP
                  NOP
                  CLR SCL
                  NOP
                  NOP
                  SETB SCL
                  NOP
                  NOP
                  INLOOP:
                  MOV C,SDA
                  RLC A
                  DJNZ B,INLOOP
                  CLR SCL
                  RET
                  ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@


                  ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@
                  STOP:
                  CLR SDA
                  NOP
                  SETB SCL
                  NOP
                  SETB SDA
                  LCALL DLAYms
                  RET
                  ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@
                  START:
                  CLR SCL
                  SETB SDA
                  NOP
                  SETB SCL
                  NOP
                  CLR SDA
                  LCALL DLAYms
                  RET
                  ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@
                  DLAYms:
                  MOV R6,#150
                  MOV B,#00
                  MS1: DJNZ B,$ ;((2*255)+(2*255)*150
                  DJNZ B,$ ;=153 MILLI SECONDS
                  DJNZ R6,MS1
                  RET
                  ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@


                  ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@
                  L_DELAY:
                  MOV R7,#0AH ;153 MILLISECONDS * 10
                  LLL: LCALL DLAYms ;1.53 SECONDS
                  DJNZ R7,LLL
                  RET
                  ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@
                  END

                  Comment


                  • #10
                    trong đoạn code co ghi rõ đó bạn "R1==>data tobe writen" R1 là dữ liệu được ghi vào
                    |

                    Comment


                    • #11
                      Nếu dÙng dptr thì khi thao tác nửa thanh ghi là DPL và DPH .Ok.Được chưa.
                      , , ,

                      Comment

                      Về tác giả

                      Collapse

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

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

                      Collapse

                      Đang tải...
                      X