Thông báo

Collapse
No announcement yet.

Xin góp ý về lập trình ASM đếm tăng giảm từ 0000 - đến 9999 hiển thị trên Led 7 Seg

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

  • Xin góp ý về lập trình ASM đếm tăng giảm từ 0000 - đến 9999 hiển thị trên Led 7 Seg

    Chào tất cả các anh chị em trong diễn đàn.
    Em đang tập lập trình đếm tăng giảm từ 0 - 9999 dùng phím bấm giao tiếp với VĐK 8051, hiển thị trên Led 7 thanh loại A chung.
    Hiện tại thì phần code em đã viết xong. Do chưa có điều kiện làm mạch thật nên mới chỉ mô phỏng trên Proteus.
    Vấn đề em gặp phải là: Trong quá trình ấn nút, nếu mình giữ nút thì các Led không sáng, và mỗi lần ấn nút thì Led có hiện tượng bị nháy nháy (2 hiện tượng này làm em không thích ) nhưng em vẫn chưa xử lý được.
    Các bác trong diễn đàn ai đã từ làm cái này rồi thì cho em xin ý kiến để giải quyết với.
    Em xin cảm ơn các bác trước !
    Đây là code em viết:
    Code:
    ;*************************************************  ******************************
    ; CHUONG TRINH        : DEM LEN XUONG 0000 - 9999 SU DUNG NUT BAM
    ;              ***********************************
    ; MO TA            :
    ;     - Phan cung    :
    ;        + AT89C51 (thach anh 12MHz)
    ;        + 4 Led 7 Seg (Anot chung)
    ;        + 2 phim bam
    ;    - Ket noi        :
    ;        + Switch UP noi voi p1.3
    ;        + Switch DOWN noi voi p1.7
    ;        + Cac thanh A-B-C-D-E-F-G cua Led 7 Seg lan luot noi voi p2.0, ... , p2.6
    ;        + Anot cua cac Led 1 den 4 (tinh tu trai sang) lan luot noi voi p0.0, ..., p0.3
    ;    - Chu thich    :
    ;        + Cac Led tich cuc khi p0 o muc 0, OUTP o muc 0
    ;        + Cac phim tich cuc muc 0
    ;    - Ten file        : Count_UP_0_9999.asm
    ;
    ; HOAN THANH        : 21/06/2012 - Successful
    ;
    ; COPYRIGHT        : Kyle Ray
    ;*************************************************  ******************************
    ;
    ;--------------------------------------------------------
    ;        C O N S T A N T        ;
    ;--------------------------------------------------------
        UP    bit    p1.3
        DOWN    bit    p1.7
        H_DV    equ    30h
        H_CH    equ    31h
        H_TR    equ    32h
        H_NG    equ    33h
        OUTP    equ    p2
    ;
        org    0h
        mov    dptr, #table
        mov    r6, #0            ; dung 2 thanh ghi r6, r7 nhu 1 thanh ghi 16 bit de luu tru so 
        mov    r7, #0            ; lan bam nut, r7 byte cao, r6 byte thap
    ;--------------------------------------------------------
    ; MAIN:                    ;
    ;    Duy tri viec kiem tra phim bam va hien    ;
    ;    thi                ;
    ;===============================
    ;    M A I N    P R O G R A M        ;
    ;===============================
    main:
        call    display
    ;
        jb    UP, skip            ; ko an UP: kiem tra xem co an DOWN ?
        call    delay_10ms        ; UP dc an: goi ct lam tre de chong rung phim
        jnb    UP, $            ; chong giu phim UP
        call    t_r76            ; goi chuong trinh tang so dem
        cjne    r7, #100, main        ; r7 < 100: tiep tuc hien thi
        mov    r7, #0            ; r7 = 100: xoa r7 va cho hien thi lai so 0000
        sjmp    main
    skip:    jb    DOWN, main
        call    delay_10ms        ; DOWN dc an: goi ct lam tre de chong rung phim
        jnb    DOWN, $            ; chong giu phim DOWN
        call    g_r76            ; goi chuong trinh giam so dem
        cjne    r7, #255, main        ; r7 > = 0: tiep tuc hien thi
        mov    r7, #99            ; r7 = 255: dat r7 = 99 de hien thi so 9999
        sjmp    main
    ;--------------------------------------------------------
    display:
    ;    - Tinh toan va hien thi cac so len Led 7    ;
    ;    - Cac thanh ghi a, b bi anh huong    ;
    ;--------------------------------------------------------
        mov    a, r7            ; dua byte cao vao a
        mov    b, #10
        div    ab            ; chia a cho b, thuong luu vao a, phan du luu vao b
        movc    a, @a+dptr        ; lay ma led hang nghin
        mov    H_NG, a            ; cat ma led hang nghin
        mov    a, b
        movc    a, @a+dptr        ; lay ma led hang tram
        mov    H_TR, a            ; cat ma led hang tram
    ;-----------------------------------
        mov    a, r6            ; dua byte thap vao a
        mov    b, #10
        div    ab            ; chia a cho b, thuong luu vao a, phan du luu vao b
        movc    a, @a+dptr        ; lay ma led hang chuc
        mov    H_CH, a            ; cat ma led hang chuc
        mov    a, b
        movc    a, @a+dptr        ; lay ma led hang don vi
        mov    H_DV, a            ; cat ma led hang don vi
    ;
        call    show
    ret
    ;--------------------------------------------------------
    show:
    ;    - Hien thi cac so len Led 7        ;
    ;    - Su dung r0 lam con tro lay du lieu    ;
    ;     gui ra p2, thanh ghi a tao xung quet    ;
    ;--------------------------------------------------------
        mov    r0, #33h            ; dia chi ngan nho hang nghin
        push    acc
        push    00
        mov    a, #11111110b        ; khoi tao xung quet
    next:    mov    p0, a            ; xuat xung quet
        rl    a
        cjne    a, #11011111b, next1    ; quet du 4 xung thi dung
        sjmp    back
    next1:    mov    OUTP, @r0        ; xuat du lieu
        call    delay_1ms        ; goi chuong trinh lam tre de led sang
        mov    OUTP, #0ffh        ; tat led
        call    delay_1ms
        dec    r0            ; giam r0 de lay du lieu hien thi led tiep theo
        sjmp    next
    back:    pop    00
        pop    acc
        ret
    ;--------------------------------------------------------
    t_r76:
    ;    - Tang va kiem tra so lan bam nut    ;
    ;--------------------------------------------------------
        inc    r6
        cjne    r6, #100, t_not_e        ; r6 < 100: tro ve ct chinh
        mov    r6, #0            ; r6 = 100: xoa r6, tang r7 va tro ve ct chinh
        inc    r7
    t_not_e:    ret
    ;--------------------------------------------------------
    g_r76:
    ;    - Giam va kiem tra so lan bam nut    ;
    ;--------------------------------------------------------
        dec    r6            ; giam r6
        cjne    r6, #255, g_not_e        ; r6 >= 0: tro ve ct chinh
        mov    r6, #99            ; r6 = 255: dat r6 = 99; giam r7 va tro ve ct chinh
        dec    r7
    g_not_e:    ret
    ;--------------------------------------------------------
    ;    CHUONG TRINH CON TAO TRE    ;
    ;--------------------------------------------------------
    delay_1ms:
        push    00
        push    01
        MOV    R0, #2
        MOV    R1, #248
        DJNZ    R1, $
        DJNZ    R0, $-4
        POP    01
        POP    00
    ret
    ;--------------------------------------------------------
    delay_10ms:
        push    00
        push    01
        MOV    R0, #20
        MOV    R1, #248
        DJNZ    R1, $
        DJNZ    R0, $-4
        POP    01
        POP    00
    ret
    ;--------------------------------------------------------
    table:
    ;        0       1       2       3       4      5     6      7      8      9
    ;        |       |       |        |       |      |      |      |      |      |
        db    0c0h, 0f9h, 0a4h, 0b0h, 99h, 92h, 82h, 0f8h, 80h, 90h
    ;===============================
        end
    Video:
    Sơ đồ mạch: Click image for larger version

Name:	22.jpg
Views:	1
Size:	93.8 KB
ID:	1413353
    File mô phỏng:

  • #2
    Nếu bạn muốn khi nhấn nút mà không tắt led thì cứ kiểm tra phím nhấn, nếu còn nhấn thì quay về chương trình con hiển thị! Còn việc led nhấp nháy là do tần số quét của bạn không đủ!Bạn dùng ngắt timer để hiển thị sẽ tốt hơn.phần cứng 2 đầu thạch anh là tụ không phân cực bạn nhé!Thân

    Comment


    • #3
      Nguyên văn bởi hahuyquyen Xem bài viết
      Còn việc led nhấp nháy là do tần số quét của bạn không đủ!Bạn dùng ngắt timer để hiển thị sẽ tốt hơn.phần cứng 2 đầu thạch anh là tụ không phân cực bạn nhé! Thân
      Cảm ơn bạn đã góp ý. Chắc do mình mô tả chưa rõ ràng nên bạn hiểu chưa hết ý mình.
      Về phần cứng, dùng tụ cho thạch anh thì mình không nói (vì đã từng lắp thử trên test board nhiều rồi). Tần số quét led của mình không phải là không đủ để gây nên hiện tượng nhấp nháy led.
      Vấn đề nhấp nháy mà mình đề cập đến ở đây là mỗi lần mình ấn phím thì cả 4 Led bị nháy (cái này làm mình không thích) mình chỉ muốn khi ấn nút thì Led nào tăng (giảm) số đếm thì chỉ có Led đó thay đổi số thôi.
      Nguyên văn bởi hahuyquyen Xem bài viết
      Nếu bạn muốn khi nhấn nút mà không tắt led thì cứ kiểm tra phím nhấn, nếu còn nhấn thì quay về chương trình con hiển thị!
      Chương trình này mình cũng đã cho kiểm tra phím ấn và khi có phím ấn thì quay về chương trình hiển thị rồi.

      Comment


      • #4
        Nguyên văn bởi Ck33spkt Xem bài viết
        Chào tất cả các anh chị em trong diễn đàn.
        Em đang tập lập trình đếm tăng giảm từ 0 - 9999 dùng phím bấm giao tiếp với VĐK 8051, hiển thị trên Led 7 thanh loại A chung.
        Hiện tại thì phần code em đã viết xong. Do chưa có điều kiện làm mạch thật nên mới chỉ mô phỏng trên Proteus.
        Vấn đề em gặp phải là: Trong quá trình ấn nút, nếu mình giữ nút thì các Led không sáng, và mỗi lần ấn nút thì Led có hiện tượng bị nháy nháy (2 hiện tượng này làm em không thích ) nhưng em vẫn chưa xử lý được.
        Các bác trong diễn đàn ai đã từ làm cái này rồi thì cho em xin ý kiến để giải quyết với.
        Em xin cảm ơn các bác trước !
        Đây là code em viết:
        Code:
        ;*************************************************  ******************************
        ; CHUONG TRINH        : DEM LEN XUONG 0000 - 9999 SU DUNG NUT BAM
        ;              ***********************************
        ; MO TA            :
        ;     - Phan cung    :
        ;        + AT89C51 (thach anh 12MHz)
        ;        + 4 Led 7 Seg (Anot chung)
        ;        + 2 phim bam
        ;    - Ket noi        :
        ;        + Switch UP noi voi p1.3
        ;        + Switch DOWN noi voi p1.7
        ;        + Cac thanh A-B-C-D-E-F-G cua Led 7 Seg lan luot noi voi p2.0, ... , p2.6
        ;        + Anot cua cac Led 1 den 4 (tinh tu trai sang) lan luot noi voi p0.0, ..., p0.3
        ;    - Chu thich    :
        ;        + Cac Led tich cuc khi p0 o muc 0, OUTP o muc 0
        ;        + Cac phim tich cuc muc 0
        ;    - Ten file        : Count_UP_0_9999.asm
        ;
        ; HOAN THANH        : 21/06/2012 - Successful
        ;
        ; COPYRIGHT        : Kyle Ray
        ;*************************************************  ******************************
        ;
        ;--------------------------------------------------------
        ;        C O N S T A N T        ;
        ;--------------------------------------------------------
            UP    bit    p1.3
            DOWN    bit    p1.7
            H_DV    equ    30h
            H_CH    equ    31h
            H_TR    equ    32h
            H_NG    equ    33h
            OUTP    equ    p2
        ;
            org    0h
            mov    dptr, #table
            mov    r6, #0            ; dung 2 thanh ghi r6, r7 nhu 1 thanh ghi 16 bit de luu tru so 
            mov    r7, #0            ; lan bam nut, r7 byte cao, r6 byte thap
        ;--------------------------------------------------------
        ; MAIN:                    ;
        ;    Duy tri viec kiem tra phim bam va hien    ;
        ;    thi                ;
        ;===============================
        ;    M A I N    P R O G R A M        ;
        ;===============================
        main:
            call    display
        ;
            jb    UP, skip            ; ko an UP: kiem tra xem co an DOWN ?
            call    delay_10ms        ; UP dc an: goi ct lam tre de chong rung phim
            jnb    UP, $            ; chong giu phim UP
            call    t_r76            ; goi chuong trinh tang so dem
            cjne    r7, #100, main        ; r7 < 100: tiep tuc hien thi
            mov    r7, #0            ; r7 = 100: xoa r7 va cho hien thi lai so 0000
            sjmp    main
        skip:    jb    DOWN, main
            call    delay_10ms        ; DOWN dc an: goi ct lam tre de chong rung phim
            jnb    DOWN, $            ; chong giu phim DOWN
            call    g_r76            ; goi chuong trinh giam so dem
            cjne    r7, #255, main        ; r7 > = 0: tiep tuc hien thi
            mov    r7, #99            ; r7 = 255: dat r7 = 99 de hien thi so 9999
            sjmp    main
        ;--------------------------------------------------------
        display:
        ;    - Tinh toan va hien thi cac so len Led 7    ;
        ;    - Cac thanh ghi a, b bi anh huong    ;
        ;--------------------------------------------------------
            mov    a, r7            ; dua byte cao vao a
            mov    b, #10
            div    ab            ; chia a cho b, thuong luu vao a, phan du luu vao b
            movc    a, @a+dptr        ; lay ma led hang nghin
            mov    H_NG, a            ; cat ma led hang nghin
            mov    a, b
            movc    a, @a+dptr        ; lay ma led hang tram
            mov    H_TR, a            ; cat ma led hang tram
        ;-----------------------------------
            mov    a, r6            ; dua byte thap vao a
            mov    b, #10
            div    ab            ; chia a cho b, thuong luu vao a, phan du luu vao b
            movc    a, @a+dptr        ; lay ma led hang chuc
            mov    H_CH, a            ; cat ma led hang chuc
            mov    a, b
            movc    a, @a+dptr        ; lay ma led hang don vi
            mov    H_DV, a            ; cat ma led hang don vi
        ;
            call    show
        ret
        ;--------------------------------------------------------
        show:
        ;    - Hien thi cac so len Led 7        ;
        ;    - Su dung r0 lam con tro lay du lieu    ;
        ;     gui ra p2, thanh ghi a tao xung quet    ;
        ;--------------------------------------------------------
            mov    r0, #33h            ; dia chi ngan nho hang nghin
            push    acc
            push    00
            mov    a, #11111110b        ; khoi tao xung quet
        next:    mov    p0, a            ; xuat xung quet
            rl    a
            cjne    a, #11011111b, next1    ; quet du 4 xung thi dung
            sjmp    back
        next1:    mov    OUTP, @r0        ; xuat du lieu
            call    delay_1ms        ; goi chuong trinh lam tre de led sang
            mov    OUTP, #0ffh        ; tat led
            call    delay_1ms
            dec    r0            ; giam r0 de lay du lieu hien thi led tiep theo
            sjmp    next
        back:    pop    00
            pop    acc
            ret
        ;--------------------------------------------------------
        t_r76:
        ;    - Tang va kiem tra so lan bam nut    ;
        ;--------------------------------------------------------
            inc    r6
            cjne    r6, #100, t_not_e        ; r6 < 100: tro ve ct chinh
            mov    r6, #0            ; r6 = 100: xoa r6, tang r7 va tro ve ct chinh
            inc    r7
        t_not_e:    ret
        ;--------------------------------------------------------
        g_r76:
        ;    - Giam va kiem tra so lan bam nut    ;
        ;--------------------------------------------------------
            dec    r6            ; giam r6
            cjne    r6, #255, g_not_e        ; r6 >= 0: tro ve ct chinh
            mov    r6, #99            ; r6 = 255: dat r6 = 99; giam r7 va tro ve ct chinh
            dec    r7
        g_not_e:    ret
        ;--------------------------------------------------------
        ;    CHUONG TRINH CON TAO TRE    ;
        ;--------------------------------------------------------
        delay_1ms:
            push    00
            push    01
            MOV    R0, #2
            MOV    R1, #248
            DJNZ    R1, $
            DJNZ    R0, $-4
            POP    01
            POP    00
        ret
        ;--------------------------------------------------------
        delay_10ms:
            push    00
            push    01
            MOV    R0, #20
            MOV    R1, #248
            DJNZ    R1, $
            DJNZ    R0, $-4
            POP    01
            POP    00
        ret
        ;--------------------------------------------------------
        table:
        ;        0       1       2       3       4      5     6      7      8      9
        ;        |       |       |        |       |      |      |      |      |      |
            db    0c0h, 0f9h, 0a4h, 0b0h, 99h, 92h, 82h, 0f8h, 80h, 90h
        ;===============================
            end
        Video:
        Sơ đồ mạch: [ATTACH=CONFIG]47092[/ATTACH]
        File mô phỏng:
        bạn nên có thao tác kiểm tra phím nhấn, trong C là lênh while(!phim), còn ASM thì mình ko dõ.
        theo mình thì mấy kiểu đếm này bạn nên dùng ngắt, sẽ tránh được hiện tượng trêb
        Nguyễn Huy Biên - 01649 802 694
        gmail :

        Comment


        • #5
          Nguyên văn bởi Ck33spkt Xem bài viết
          Chào tất cả các anh chị em trong diễn đàn.
          Em đang tập lập trình đếm tăng giảm từ 0 - 9999 dùng phím bấm giao tiếp với VĐK 8051, hiển thị trên Led 7 thanh loại A chung.
          Hiện tại thì phần code em đã viết xong. Do chưa có điều kiện làm mạch thật nên mới chỉ mô phỏng trên Proteus.
          Vấn đề em gặp phải là: Trong quá trình ấn nút, nếu mình giữ nút thì các Led không sáng, và mỗi lần ấn nút thì Led có hiện tượng bị nháy nháy (2 hiện tượng này làm em không thích ) nhưng em vẫn chưa xử lý được.
          Các bác trong diễn đàn ai đã từ làm cái này rồi thì cho em xin ý kiến để giải quyết với.
          Em xin cảm ơn các bác trước !
          Đây là code em viết:
          Code:
          ;*************************************************  ******************************
          ; CHUONG TRINH        : DEM LEN XUONG 0000 - 9999 SU DUNG NUT BAM
          ;              ***********************************
          ; MO TA            :
          ;     - Phan cung    :
          ;        + AT89C51 (thach anh 12MHz)
          ;        + 4 Led 7 Seg (Anot chung)
          ;        + 2 phim bam
          ;    - Ket noi        :
          ;        + Switch UP noi voi p1.3
          ;        + Switch DOWN noi voi p1.7
          ;        + Cac thanh A-B-C-D-E-F-G cua Led 7 Seg lan luot noi voi p2.0, ... , p2.6
          ;        + Anot cua cac Led 1 den 4 (tinh tu trai sang) lan luot noi voi p0.0, ..., p0.3
          ;    - Chu thich    :
          ;        + Cac Led tich cuc khi p0 o muc 0, OUTP o muc 0
          ;        + Cac phim tich cuc muc 0
          ;    - Ten file        : Count_UP_0_9999.asm
          ;
          ; HOAN THANH        : 21/06/2012 - Successful
          ;
          ; COPYRIGHT        : Kyle Ray
          ;*************************************************  ******************************
          ;
          ;--------------------------------------------------------
          ;        C O N S T A N T        ;
          ;--------------------------------------------------------
              UP    bit    p1.3
              DOWN    bit    p1.7
              H_DV    equ    30h
              H_CH    equ    31h
              H_TR    equ    32h
              H_NG    equ    33h
              OUTP    equ    p2
          ;
              org    0h
              mov    dptr, #table
              mov    r6, #0            ; dung 2 thanh ghi r6, r7 nhu 1 thanh ghi 16 bit de luu tru so 
              mov    r7, #0            ; lan bam nut, r7 byte cao, r6 byte thap
          ;--------------------------------------------------------
          ; MAIN:                    ;
          ;    Duy tri viec kiem tra phim bam va hien    ;
          ;    thi                ;
          ;===============================
          ;    M A I N    P R O G R A M        ;
          ;===============================
          main:
              call    display
          ;
              jb    UP, skip            ; ko an UP: kiem tra xem co an DOWN ?
              call    delay_10ms        ; UP dc an: goi ct lam tre de chong rung phim
              jnb    UP, $            ; chong giu phim UP
              call    t_r76            ; goi chuong trinh tang so dem
              cjne    r7, #100, main        ; r7 < 100: tiep tuc hien thi
              mov    r7, #0            ; r7 = 100: xoa r7 va cho hien thi lai so 0000
              sjmp    main
          skip:    jb    DOWN, main
              call    delay_10ms        ; DOWN dc an: goi ct lam tre de chong rung phim
              jnb    DOWN, $            ; chong giu phim DOWN
              call    g_r76            ; goi chuong trinh giam so dem
              cjne    r7, #255, main        ; r7 > = 0: tiep tuc hien thi
              mov    r7, #99            ; r7 = 255: dat r7 = 99 de hien thi so 9999
              sjmp    main
          ;--------------------------------------------------------
          display:
          ;    - Tinh toan va hien thi cac so len Led 7    ;
          ;    - Cac thanh ghi a, b bi anh huong    ;
          ;--------------------------------------------------------
              mov    a, r7            ; dua byte cao vao a
              mov    b, #10
              div    ab            ; chia a cho b, thuong luu vao a, phan du luu vao b
              movc    a, @a+dptr        ; lay ma led hang nghin
              mov    H_NG, a            ; cat ma led hang nghin
              mov    a, b
              movc    a, @a+dptr        ; lay ma led hang tram
              mov    H_TR, a            ; cat ma led hang tram
          ;-----------------------------------
              mov    a, r6            ; dua byte thap vao a
              mov    b, #10
              div    ab            ; chia a cho b, thuong luu vao a, phan du luu vao b
              movc    a, @a+dptr        ; lay ma led hang chuc
              mov    H_CH, a            ; cat ma led hang chuc
              mov    a, b
              movc    a, @a+dptr        ; lay ma led hang don vi
              mov    H_DV, a            ; cat ma led hang don vi
          ;
              call    show
          ret
          ;--------------------------------------------------------
          show:
          ;    - Hien thi cac so len Led 7        ;
          ;    - Su dung r0 lam con tro lay du lieu    ;
          ;     gui ra p2, thanh ghi a tao xung quet    ;
          ;--------------------------------------------------------
              mov    r0, #33h            ; dia chi ngan nho hang nghin
              push    acc
              push    00
              mov    a, #11111110b        ; khoi tao xung quet
          next:    mov    p0, a            ; xuat xung quet
              rl    a
              cjne    a, #11011111b, next1    ; quet du 4 xung thi dung
              sjmp    back
          next1:    mov    OUTP, @r0        ; xuat du lieu
              call    delay_1ms        ; goi chuong trinh lam tre de led sang
              mov    OUTP, #0ffh        ; tat led
              call    delay_1ms
              dec    r0            ; giam r0 de lay du lieu hien thi led tiep theo
              sjmp    next
          back:    pop    00
              pop    acc
              ret
          ;--------------------------------------------------------
          t_r76:
          ;    - Tang va kiem tra so lan bam nut    ;
          ;--------------------------------------------------------
              inc    r6
              cjne    r6, #100, t_not_e        ; r6 < 100: tro ve ct chinh
              mov    r6, #0            ; r6 = 100: xoa r6, tang r7 va tro ve ct chinh
              inc    r7
          t_not_e:    ret
          ;--------------------------------------------------------
          g_r76:
          ;    - Giam va kiem tra so lan bam nut    ;
          ;--------------------------------------------------------
              dec    r6            ; giam r6
              cjne    r6, #255, g_not_e        ; r6 >= 0: tro ve ct chinh
              mov    r6, #99            ; r6 = 255: dat r6 = 99; giam r7 va tro ve ct chinh
              dec    r7
          g_not_e:    ret
          ;--------------------------------------------------------
          ;    CHUONG TRINH CON TAO TRE    ;
          ;--------------------------------------------------------
          delay_1ms:
              push    00
              push    01
              MOV    R0, #2
              MOV    R1, #248
              DJNZ    R1, $
              DJNZ    R0, $-4
              POP    01
              POP    00
          ret
          ;--------------------------------------------------------
          delay_10ms:
              push    00
              push    01
              MOV    R0, #20
              MOV    R1, #248
              DJNZ    R1, $
              DJNZ    R0, $-4
              POP    01
              POP    00
          ret
          ;--------------------------------------------------------
          table:
          ;        0       1       2       3       4      5     6      7      8      9
          ;        |       |       |        |       |      |      |      |      |      |
              db    0c0h, 0f9h, 0a4h, 0b0h, 99h, 92h, 82h, 0f8h, 80h, 90h
          ;===============================
              end
          Video:
          Sơ đồ mạch: [ATTACH=CONFIG]47092[/ATTACH]
          File mô phỏng:
          đã quét led 7 đoạn thì khôngnên có thời gian chết.
          Code:
          ;*******************************************************************************
          ; CHUONG TRINH        : DEM LEN XUONG 0000 - 9999 SU DUNG NUT BAM
          ;              ***********************************
          ; MO TA            :
          ;     - Phan cung    :
          ;        + AT89C51 (thach anh 12MHz)
          ;        + 4 Led 7 Seg (Anot chung)
          ;        + 2 phim bam
          ;    - Ket noi        :
          ;        + Switch UP noi voi p1.3
          ;        + Switch DOWN noi voi p1.7
          ;        + Cac thanh A-B-C-D-E-F-G cua Led 7 Seg lan luot noi voi p2.0, ... , p2.6
          ;        + Anot cua cac Led 1 den 4 (tinh tu trai sang) lan luot noi voi p0.0, ..., p0.3
          ;    - Chu thich    :
          ;        + Cac Led tich cuc khi p0 o muc 0, OUTP o muc 0
          ;        + Cac phim tich cuc muc 0
          ;    - Ten file        : Count_UP_0_9999.asm
          ;
          ; HOAN THANH        : 21/06/2012 - Successful
          ;
          ; COPYRIGHT        : Kyle Ray
          ;*******************************************************************************
          ;
          ;--------------------------------------------------------
          ;        C O N S T A N T        ;
          ;--------------------------------------------------------
              UP    bit    p1.3
              DOWN    bit    p1.7
              H_DV    equ    30h
              H_CH    equ    31h
              H_TR    equ    32h
              H_NG    equ    33h
              OUTP    equ    p2
          ;
              org    0h
              mov    dptr, #table
              mov    r6, #0            ; dung 2 thanh ghi r6, r7 nhu 1 thanh ghi 16 bit de luu tru so 
              mov    r7, #0            ; lan bam nut, r7 byte cao, r6 byte thap
          ;--------------------------------------------------------
          ; MAIN:                    ;
          ;    Duy tri viec kiem tra phim bam va hien    ;
          ;    thi                ;
          ;===============================
          ;    M A I N    P R O G R A M        ;
          ;===============================
          main:
              call    display
          ;
               jb    UP, skip            ; ko an UP: kiem tra xem co an DOWN ?
          aa:    call    display
              jnb    UP, aa            ; chong giu phim UP
              call    t_r76            ; goi chuong trinh tang so dem
              cjne    r7, #100, main        ; r7 < 100: tiep tuc hien thi
              mov    r7, #0            ; r7 = 100: xoa r7 va cho hien thi lai so 0000
              sjmp    main
          skip:    jb    DOWN, main
          bb:    call    display
              jnb    DOWN, bb            ; chong giu phim DOWN
              call    g_r76            ; goi chuong trinh giam so dem
              cjne    r7, #255, main        ; r7 > = 0: tiep tuc hien thi
              mov    r7, #99            ; r7 = 255: dat r7 = 99 de hien thi so 9999
              sjmp    main
          ;--------------------------------------------------------
          display:
          ;    - Tinh toan va hien thi cac so len Led 7    ;
          ;    - Cac thanh ghi a, b bi anh huong    ;
          ;--------------------------------------------------------
              mov    a, r7            ; dua byte cao vao a
              mov    b, #10
              div    ab            ; chia a cho b, thuong luu vao a, phan du luu vao b
              movc    a, @a+dptr        ; lay ma led hang nghin
              mov    H_NG, a            ; cat ma led hang nghin
              mov    a, b
              movc    a, @a+dptr        ; lay ma led hang tram
              mov    H_TR, a            ; cat ma led hang tram
          ;-----------------------------------
              mov    a, r6            ; dua byte thap vao a
              mov    b, #10
              div    ab            ; chia a cho b, thuong luu vao a, phan du luu vao b
              movc    a, @a+dptr        ; lay ma led hang chuc
              mov    H_CH, a            ; cat ma led hang chuc
              mov    a, b
              movc    a, @a+dptr        ; lay ma led hang don vi
              mov    H_DV, a            ; cat ma led hang don vi
          ;
              call    show
          ret
          ;--------------------------------------------------------
          show:
          ;    - Hien thi cac so len Led 7        ;
          ;    - Su dung r0 lam con tro lay du lieu    ;
          ;     gui ra p2, thanh ghi a tao xung quet    ;
          ;--------------------------------------------------------
              mov    r0, #33h            ; dia chi ngan nho hang nghin
              push    acc
              push    00
              mov    a, #11111110b        ; khoi tao xung quet
          next:    mov    p0, a            ; xuat xung quet
              rl    a
              cjne    a, #11011111b, next1    ; quet du 4 xung thi dung
              sjmp    back
          next1:    mov    OUTP, @r0        ; xuat du lieu
              call    delay_1ms        ; goi chuong trinh lam tre de led sang
              mov    OUTP, #0ffh        ; tat led
              call    delay_1ms
              dec    r0            ; giam r0 de lay du lieu hien thi led tiep theo
              sjmp    next
          back:    pop    00
              pop    acc
              ret
          ;--------------------------------------------------------
          t_r76:
          ;    - Tang va kiem tra so lan bam nut    ;
          ;--------------------------------------------------------
              inc    r6
              cjne    r6, #100, t_not_e        ; r6 < 100: tro ve ct chinh
              mov    r6, #0            ; r6 = 100: xoa r6, tang r7 va tro ve ct chinh
              inc    r7
          t_not_e:    ret
          ;--------------------------------------------------------
          g_r76:
          ;    - Giam va kiem tra so lan bam nut    ;
          ;--------------------------------------------------------
              dec    r6            ; giam r6
              cjne    r6, #255, g_not_e        ; r6 >= 0: tro ve ct chinh
              mov    r6, #99            ; r6 = 255: dat r6 = 99; giam r7 va tro ve ct chinh
              dec    r7
          g_not_e:    ret
          ;--------------------------------------------------------
          ;    CHUONG TRINH CON TAO TRE    ;
          ;--------------------------------------------------------
          delay_1ms:
              push    00
              push    01
              MOV    R0, #2
              MOV    R1, #248
              DJNZ    R1, $
              DJNZ    R0, $-4
              POP    01
              POP    00
          ret
          ;--------------------------------------------------------
          delay_10ms:
              push    00
              push    01
              MOV    R0, #20
              MOV    R1, #248
              DJNZ    R1, $
              DJNZ    R0, $-4
              POP    01
              POP    00
          ret
          ;--------------------------------------------------------
          table:
          ;        0       1       2       3       4      5     6      7      8      9
          ;        |       |       |        |       |      |      |      |      |      |
              db    0c0h, 0f9h, 0a4h, 0b0h, 99h, 92h, 82h, 0f8h, 80h, 90h
          ;===============================
              end
          |

          Comment


          • #6
            Nguyên văn bởi tdm Xem bài viết
            đã quét led 7 đoạn thì không nên có thời gian chết.
            Ý kiến này rất hay! Em cám ơn bác nhiều.

            Comment


            • #7
              ai giúp em cho nó hiển thi 333 giúp em với em cảm ơn nhiều có hình mô phỏng bên dưới à mail của em đây: lam.3.ngon@gmail.com
              /*
              * File: main.c
              * Author: hndang
              *
              * Created on April 6, 2015, 7:33 AM
              */

              #include <stdio.h>
              #include <stdlib.h>
              #include <xc.h>
              #include <pic16f877a.h>

              #define _XTAL_FREQ 4000000
              #define LEDnghin RC4
              #define LEDtram RC5
              #define LEDchuc RC6
              #define LEDdonvi RC7
              #define LEDdata PORTD

              /*
              *
              */
              void TRM0init (void);
              void GPIOinit (void);
              void ISRinit (void);
              void DECtoBCD (unsigned int Dec);
              void ADCinit (void);
              unsigned int ReadADC (void);

              const unsigned char MaLed7Doan[]={0xC0,0xf9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x9 0};
              unsigned int CountLED = 0;
              unsigned int Nghin = 0, Tram = 0, Chuc = 0, Donvi = 0;
              unsigned int NumberToDisplay;
              unsigned int Dec;
              unsigned int ADCvalue = 0;

              void main(void) {
              GPIOinit();
              TRM0init();
              ISRinit();
              ADCinit();
              while(1){
              ADCvalue = ReadADC();
              DECtoBCD (ADCvalue);
              __delay_ms(1);
              }
              }
              void TRM0init (void){
              //khoi tao timer 0 dinh thoi 1ms
              TMR0 = 0x05;
              OPTION_REGbits.PS0=1;
              OPTION_REGbits.PS1=0;
              OPTION_REGbits.PS2=0;
              OPTION_REGbits.PSA=0;
              OPTION_REGbits.T0CS = 0;
              }
              void GPIOinit (void){
              TRISAbits.TRISA0 = 1;
              TRISCbits.TRISC3 = 0;
              TRISCbits.TRISC4 = 0;
              TRISCbits.TRISC5 = 0;
              TRISCbits.TRISC6 = 0;
              TRISCbits.TRISC7 = 0;
              RC4 = 1, RC5 = 1, RC6 = 1, RC7 = 1;// off tat ca led 7 doan
              RC3 = 1;
              TRISD = 0;
              PORTD = 0XFF;// OFF tat ca led 7 doan
              }
              void ADCinit (void){
              // chon tan so clock cho bo adc
              ADCON1bits.ADCS2 = 0, ADCON0bits.ADCS1 = 0,ADCON0bits.ADCS0 = 1;
              // chon kenh adc la kenh an0
              ADCON0bits.CHS2 = 0, ADCON0bits.CHS1 = 0, ADCON0bits.CHS0 = 0;
              // chon cach luu data
              ADCON1bits.ADFM = 1;
              // cau hinh cong vao
              ADCON1bits.PCFG3 = 0, ADCON1bits.PCFG2 = 1, ADCON1bits.PCFG1 = 1, ADCON1bits.PCFG0 = 1;
              // cap nguon cho khoi adc
              ADCON0bits.ADON = 1;
              }
              unsigned int ReadADC (void){
              unsigned int TempValue = 0;
              ADCON0bits.GO_nDONE = 1;
              while(ADCON0bits.GO_nDONE);
              TempValue = ADRESH*256 + ADRESL;
              return (TempValue);
              }
              void ISRinit (void){
              INTCONbits.GIE = 1;
              //khoi tao ngat timer 0
              INTCONbits.TMR0IE = 1;
              INTCONbits.TMR0IF = 0;
              }
              void DECtoBCD (unsigned int NumberToDisplay){
              Nghin = NumberToDisplay/1000;
              Tram = (NumberToDisplay - Nghin*1000)/100;
              Chuc = (NumberToDisplay - Nghin*1000 - Tram*100)/10;
              Donvi = NumberToDisplay - Nghin*1000 - Tram*100 - Chuc*10;
              }
              // ham phuc vu ngat
              void interrupt ISR(){
              // ngat timer 0
              if( INTCONbits.TMR0IF == 1){
              INTCONbits.TMR0IF = 0;
              TMR0 = 0x05;
              CountLED++;
              }
              {

              switch (CountLED)
              {
              case 1:{
              LEDnghin = 0;
              LEDtram = 1;
              LEDchuc = 1;
              LEDdonvi = 1;
              LEDdata = MaLed7Doan[Nghin];
              break;

              }
              case 2 : {
              LEDnghin = 1;
              LEDtram = 0;
              LEDchuc = 1;
              LEDdonvi = 1;
              LEDdata = MaLed7Doan[Tram];
              break;
              }
              case 3 : {
              LEDnghin = 1;
              LEDtram = 1;
              LEDchuc = 0;
              LEDdonvi = 1;
              LEDdata = MaLed7Doan[Chuc];
              break;
              }
              case 4 : {
              LEDnghin = 1;
              LEDtram = 1;
              LEDchuc = 1;
              LEDdonvi = 0;
              LEDdata = MaLed7Doan[Donvi];
              CountLED=0;
              break;
              }
              }
              }
              }

              Comment

              Về tác giả

              Collapse

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

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

              Collapse

              Đang tải...
              X