Thông báo

Collapse
No announcement yet.

giúp em với lcd hiển thị kí tự đúng kí tự sai tùm lùm

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

  • giúp em với lcd hiển thị kí tự đúng kí tự sai tùm lùm

    mình là cái mạch xuất thông điệp đơn giản ra lcd dùng at89s52 và lcd 16x2
    không hiểu sao chữ H biến thành L , chữ A biến thành E, chữ K biến thành O, chữ S biến thành W ....
    code mình chép trong sách vày nè

    e bit p2.0
    rw bit p2.1
    rs bit p2.2
    byteout equ p0

    org 0000h
    mov 0a2h,#0
    lcall khtaolcd
    lcall first_line
    lcall second_line
    sjmp $
    ;---------------------------------------------
    khtaolcd:
    setb e
    clr rs
    clr rw

    mov a,#38h
    lcall ktao
    lcall ddelay41

    mov a,#38h
    lcall ktao
    lcall ddelay100

    mov a,#38h
    lcall ktao

    mov a,#0ch
    lcall ktao
    mov a,#01h
    lcall ktao

    mov a,#06h
    lcall ktao

    mov a,#80h
    lcall ktao

    mov a,#0fh
    lcall ktao

    ret
    ;-------------------------------------

    ddelay41: mov r6,#90h
    del412: mov r7,#200
    djnz r7,$
    djnz r6,del412
    ret

    ;-------------------------------------

    ddelay100: mov r7,#00
    djnz r7,$
    ret

    ;-------------------------------------

    command_byte:
    clr rs
    ljmp bdelay

    data_byte: setb rs

    bdelay:
    clr rw
    clr e
    nop

    setb e
    nop
    nop
    mov byteout,#0ffh

    setb rw
    clr rs
    clr e

    nop
    nop
    setb e
    lcall ddelay100
    ret
    ;---------------------------------------

    first_line:
    mov a,#080h
    lcall ktao
    mov dptr,#FD
    lcall write
    ret
    ;---------------------------------------

    second_line:
    mov a,#0c0h
    lcall ktao
    mov dptr,#SD
    lcall write
    ret
    ;---------------------------------------

    ktao: mov byteout,a
    lcall command_byte
    ret
    ;---------------------------------------

    write: mov a,#0
    movc a,@a+dptr
    cjne A,#99h,writea
    ret

    writea: mov byteout,a
    acall data_byte
    inc dptr
    sjmp write
    ;---------------------------------------
    FD: DB 'ABCDEFGHIJKLMNOP',099h
    SD: DB 'QRSTUVWXYZ',099h

    END

  • #2
    hiển thị sai có thể do thời gian delay chưa hợp lí !

    Comment


    • #3
      mình đã thử tăng thời gian delay lên sai vẫn sai

      Comment


      • #4
        Nguyên văn bởi thundernhut Xem bài viết
        mình là cái mạch xuất thông điệp đơn giản ra lcd dùng at89s52 và lcd 16x2
        không hiểu sao chữ H biến thành L , chữ A biến thành E, chữ K biến thành O, chữ S biến thành W ....
        code mình chép trong sách vày nè

        e bit p2.0
        rw bit p2.1
        rs bit p2.2
        byteout equ p0 ;đây hình như là cách khai báo hằng số chứ không phải phép gán địa chỉ

        org 0000h
        mov 0a2h,#0
        lcall khtaolcd
        lcall first_line
        lcall second_line
        sjmp $
        ;---------------------------------------------
        khtaolcd:
        setb e
        clr rs
        clr rw

        mov a,#38h
        lcall ktao
        lcall ddelay41

        mov a,#38h
        lcall ktao
        lcall ddelay100

        mov a,#38h
        lcall ktao ;vì sao lại thực hiện khối lệnh cấu hình LCD 3 lần?

        mov a,#0ch
        lcall ktao
        mov a,#01h
        lcall ktao

        mov a,#06h
        lcall ktao

        mov a,#80h
        lcall ktao

        mov a,#0fh
        lcall ktao

        ret
        ;-------------------------------------

        ddelay41: mov r6,#90h
        del412: mov r7,#200
        djnz r7,$
        djnz r6,del412
        ret

        ;-------------------------------------

        ddelay100: mov r7,#00
        djnz r7,$
        ret

        ;-------------------------------------

        command_byte:
        clr rs
        ljmp bdelay

        data_byte: setb rs

        bdelay:
        clr rw
        clr e
        nop

        setb e
        nop
        nop
        mov byteout,#0ffh ; vì sao lại mov giá trị 0FFH vào byteout?

        setb rw
        clr rs
        clr e

        nop
        nop
        setb e
        lcall ddelay100
        ret
        ;---------------------------------------

        first_line:
        mov a,#080h
        lcall ktao
        mov dptr,#FD
        lcall write
        ret
        ;---------------------------------------

        second_line:
        mov a,#0c0h
        lcall ktao
        mov dptr,#SD
        lcall write
        ret
        ;---------------------------------------

        ktao: mov byteout,a
        lcall command_byte
        ret
        ;---------------------------------------

        write: mov a,#0
        movc a,@a+dptr
        cjne A,#99h,writea
        ret

        writea: mov byteout,a
        acall data_byte
        inc dptr
        sjmp write
        ;---------------------------------------
        FD: DB 'ABCDEFGHIJKLMNOP',099h ; với kiểu chuỗi ký tự phải đặt trong dấu " " chứ không phải là dấu nháy đơn ' '
        SD: DB 'QRSTUVWXYZ',099h

        END
        cái chương trình em của em thun này quả là...trăm đường tơ rối
        bon sẽ chú thích vào những chỗ có khả năng lỗi, em kiểm tra lại.
        Mà hình như em biên soạn trên Read51 thì phải.
        Kinh nghiệm của mình khi biên soạn chương trình là viết bằng chữ in hoa, tổ chức các khối kheo léo, như vậy dễ kiểm soát lỗi.
        Đây là một đoạn chương trình hiển thị trên LCD bon viết ngày xưa, bạn có thể tham khảo:

        ;************************************************* *** HIEN THI TREN LCD
        ;************************************************* ***

        COMMAND:
        MOV R7,#255
        DJNZ R7,$
        MOV P2,A ;XUAT MA LENH
        CLR RS ;DAT RS=0 CHO XUAT LENH
        CLR RW ;R/W=0 DE GHI DU LIEU TOI LCD
        SETB ENB
        NOP
        CLR ENB ;TAO XUNG CHOT DU LIEU
        RET

        DISPLAY:
        MOV R7,#100
        DJNZ R7,$

        MOV P2,A ;XUAT DU LIEU
        SETB RS ;RS=1 CHO PHEP XUAT DU LIEU
        CLR RW ;R/W=0 DE GHI DU LIEU RA LCD
        SETB ENB
        NOP
        CLR ENB ;TAO XUNG CHOT DU LIEU
        RET
        ;*******************************************
        ; *
        ; HIEN THI THONG DIEP TINH *
        ; *
        ;*******************************************
        HIEN_THI_MESS:
        MOV A,#06H
        LCALL COMMAND
        MOV A,#0CH
        LCALL COMMAND
        MOV DPH,DPTR_H
        MOV DPL,DPTR_L
        LOOP_HT1:
        CLR A
        MOVC A,@A+DPTR
        CJNE A,#0,SKIP_HT1
        INC DPTR
        RET
        SKIP_HT1 :
        LCALL DISPLAY

        MOV R5,TIME14
        QEEEW2:
        LCALL DELAY255_30
        DJNZ R5,QEEEW2
        INC DPTR
        SJMP LOOP_HT1
        Kiếm tiền cưới vợ!!!

        Comment


        • #5
          em có thử để chuỗi ký tự trong dấu " " rùi nhưng kết quả không khác vẫn sai y chang
          em tự mày mò học vxl , nên chỉ xem sách chứ chưa hiểu hết và nắm hết đoạn code trong sách ở trên
          đoạn code của anh bonseho : em thắc mắc cái DPH và DPL là gì?
          anh bonseho có thể post đầy đủ code luôn không tại em thấy hơi khó hiểu với cái đoạn LOOP_HT1 ở chỗ nào ?
          Em thì suy nghĩ khá đơn giản là chỉ cần có đoạn chương trình có dạng tổng quát:
          ---------------
          ;batdau
          ..... ; viet gi mien chay dung la ok
          ;doan chuoi xuat
          FD: DB 'XYZ' ;sua 'XYZ' thanh chuoi muon hien thi dòng 1
          SD: DB 'XYZ' ;sua 'XYZ' thanh chuoi muon hien thi dòng 2
          end
          ---------------

          Em chỉ cần đoạn code hoàn chỉnh dạng vậy là đủ cho công việc rùi
          anh em nào có đoạn code như trên cho em xin luôn. hi hi hi

          Comment


          • #6
            Nguyên văn bởi thundernhut Xem bài viết
            em có thử để chuỗi ký tự trong dấu " " rùi nhưng kết quả không khác vẫn sai y chang
            em tự mày mò học vxl , nên chỉ xem sách chứ chưa hiểu hết và nắm hết đoạn code trong sách ở trên
            đoạn code của anh bonseho : em thắc mắc cái DPH và DPL là gì?
            anh bonseho có thể post đầy đủ code luôn không tại em thấy hơi khó hiểu với cái đoạn LOOP_HT1 ở chỗ nào ?
            Em thì suy nghĩ khá đơn giản là chỉ cần có đoạn chương trình có dạng tổng quát:
            ---------------
            ;batdau
            ..... ; viet gi mien chay dung la ok
            ;doan chuoi xuat
            FD: DB 'XYZ' ;sua 'XYZ' thanh chuoi muon hien thi dòng 1
            SD: DB 'XYZ' ;sua 'XYZ' thanh chuoi muon hien thi dòng 2
            end
            ---------------

            Em chỉ cần đoạn code hoàn chỉnh dạng vậy là đủ cho công việc rùi
            anh em nào có đoạn code như trên cho em xin luôn. hi hi hi
            Sau này nếu em có cơ hộ tự tay biên soạn một chương trình vài trăm trang giấy thì tự em sẽ rút ra được cách xây dựng bố cục chương trình mà thôi

            DPH & DPL là byte cao và byte thấp của con trỏ dữ liệu DPTR.
            Vì đây là một phần trong chương trình đồ án ngày trước của bon, nó còn lên quan tới phần cứng và những phần chương trình khác, nên có thể có và biến lạ.

            HIEN_THI_MESS:
            MOV A,#06H
            LCALL COMMAND ;hiển thị dòng trên LCD
            MOV A,#0CH
            LCALL COMMAND
            MOV DPH,DPTR_H
            MOV DPL,DPTR_L ; nạp giá trị cho con trỏ DPTR, DPH , DPL là 2byte cao và thấp của DPTR, các biến nhớ DPTR_H, DPTR_L dùng để làm các bién nhơ trung gian nhằm thuận lợi cho việc gọi chương trình con

            LOOP_HT1: ; Đoạn chương trình này thực hiện hiển thị chuỗi ký tự , kèm hiệu ứng rải chữ
            CLR A
            MOVC A,@A+DPTR
            CJNE A,#0,SKIP_HT1 ;kết thúc chuỗi kí tự là số 0
            INC DPTR
            RET
            SKIP_HT1 :
            LCALL DISPLAY

            MOV R5,TIME14 ;tạo trễ hiển thị chữ tiếp theo, biến TIME14 là giá trị có thể thay đổi bằng phím bên ngoài -. điều chỉnh tốc độ rải chữ
            QEEEW2:
            LCALL DELAY255_30
            DJNZ R5,QEEEW2
            INC DPTR
            SJMP LOOP_HT1


            Vậy thôi
            Kiếm tiền cưới vợ!!!

            Comment

            Về tác giả

            Collapse

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

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

            Collapse

            Đang tải...
            X