Thông báo

Collapse
No announcement yet.

giúp em về LCD với

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

  • giúp em về LCD với

    em là người mới học 8051, bác nào giúp em chuong trình hiển thị chữ "My Love" lên LCD 16x2 với, bác giúp em cả cái mạch mô phỏng proteus luôn nhé, thank các bác trc nhé

  • #2
    tham khảo đoạn code này đi, xem có giúp được gì cho bạn

    ;chuong trinh nay da o.k
    RS EQU P3.0
    RW EQU P3.1
    E EQU P3.2
    ORG 0000H

    LCALL KHOI_TAOLCD
    MOV 30H,#'0' ;dung o nho chua so dem
    MOV 31H,#'0'
    MOV 32H,#'0'
    MOV 33H,#'0'
    MOV 34H,#'0'
    MOV 35H,#'0'
    MOV 36H,#'0'
    MOV 37H,#'0'
    MAIN:
    LCALL DAU_DONG
    LCALL PAGE1
    LCALL DELAY
    JB P1.0,THOAT
    LCALL PAGE2
    THOAT: JB P1.1,EXIT
    LCALL PAGE3
    EXIT: SJMP MAIN
    KHOI_TAOLCD:
    MOV A,#06H ;dich con tro sang phai
    LCALL GHI_LENH
    MOV A,#38H ;khai bao 2 line
    LCALL GHI_LENH
    MOV A,#0CH ;bat hien thi ,tat con tro
    LCALL GHI_LENH
    MOV A,#1H ;xoa man hinh hien thi
    LCALL GHI_LENH
    RET
    PAGE1:
    MOV R0,#0
    TT: MOV A,R0
    MOV DPTR,#MYDATA
    movc a,@a+dptr
    LCALL HIEN_THIDULIEU
    INC R0
    CJNE R0,#16,TT
    MOV R0,#0
    LCALL XDONG
    DONG2: MOV A,R0
    MOV DPTR,#MYDATA5
    movc a,@a+dptr
    LCALL HIEN_THIDULIEU
    INC R0
    CJNE R0,#16,DONG2
    RET
    PAGE2:

    LCALL XOA_LCD
    MOV R0,#0
    TT1: MOV A,R0
    MOV DPTR,#MYDATA1
    movc a,@a+dptr
    LCALL HIEN_THIDULIEU
    INC R0
    CJNE R0,#16,TT1
    LCALL KEU_PASS
    lcall vitri_lcd1
    lcall vitri_lcd2
    lcall vitri_lcd3
    lcall vitri_lcd4
    MOV A,33H
    LCALL HIEN_THIDULIEU
    MOV A,32H
    LCALL HIEN_THIDULIEU
    MOV A,31H
    LCALL HIEN_THIDULIEU
    MOV A,30H
    LCALL HIEN_THIDULIEU
    ;KHI NHAN SONG
    INC 30H ;THI MOI TANG
    MOV A,30H
    CJNE A,#58, TT1
    MOV 30H,#'0'
    INC 31H
    MOV A,31H
    CJNE A,#58, TT1
    MOV 31H,#'0'
    INC 32H
    MOV A,32H
    CJNE A,#58, TT1
    MOV 32H,#'0'
    INC 33H
    MOV A,33H
    CJNE A,#58, TT1
    MOV 33H,#'0'
    KT1: ret
    RET
    PAGE3:
    LCALL XOA_LCD
    MOV R0,#0
    TT2: MOV A,R0
    MOV DPTR,#MYDATA2
    movc a,@a+dptr
    LCALL HIEN_THIDULIEU
    INC R0
    CJNE R0,#16,TT2
    LCALL KEU_FAIL
    LCALL DELAY
    LCALL KEU_FAIL
    lcall delay
    LCALL KEU_FAIL
    lcall delay
    RET
    XDONG:
    MOV P0,#90H
    CLR RS ;=0,LENH
    CLR RW ;=0,GHI
    SETB E
    CLR E
    ACALL READY
    RET

    DAU_DONG:
    MOV P0,#80H
    CLR RS ;=0,LENH
    CLR RW ;=0,GHI
    SETB E
    CLR E
    ACALL READY
    RET
    XOA_LCD:
    MOV P0,#1H
    CLR RS ;=0,LENH
    CLR RW ;=0,GHI
    SETB E
    CLR E
    ACALL READY
    RET
    GHI_LENH:
    MOV P0,A
    CLR RS ;=0,LENH
    CLR RW ;=0,GHI
    SETB E
    CLR E
    ACALL READY
    RET

    HIEN_THIDULIEU:
    MOV P0,A
    SETB RS ;=1,DU LIEU
    CLR RW
    SETB E
    CLR E
    ACALL READY
    RET
    KEU_PASS:
    MOV R4,17
    Q: CLR P3.7
    LCALL DELAY1
    SETB P3.7
    LCALL DELAY1
    DJNZ R4,Q
    RET
    KEU_FAIL:
    MOV R4,15
    H: CLR P3.7
    LCALL DELAY2
    SETB P3.7
    LCALL DELAY2
    DJNZ R4,H
    RET
    READY: SETB P0.7 ;P0.7: input
    CLR RS ;RS=0: thanh ghi le^.nh
    SETB RW ;R/W=1: ddo.c
    BACK:
    CLR E ;E=0 -> ta.o ca.nh le^n
    SETB E ;E=1
    JB P0.7,BACK ;cho co ban =0
    RET
    VITRI_LCD1:
    MOV A,#8FH ;o thu 16 cua line 1 lcd
    LCALL GHI_LENH
    LCALL DELAY
    RET
    VITRI_LCD2:
    MOV A,#8EH
    LCALL GHI_LENH
    LCALL DELAY
    RET

    VITRI_LCD3:
    MOV A,#8DH
    LCALL GHI_LENH
    LCALL DELAY
    RET

    VITRI_LCD4:
    MOV A,#8CH
    LCALL GHI_LENH
    LCALL DELAY
    RET

    VITRI_LCD5:
    MOV A,#0CFH
    LCALL GHI_LENH
    LCALL DELAY
    RET
    VITRI_LCD6:
    MOV A,#0CEH
    LCALL GHI_LENH
    LCALL DELAY
    RET

    VITRI_LCD7:
    MOV A,#0CDH
    LCALL GHI_LENH
    LCALL DELAY
    RET

    VITRI_LCD8:
    MOV A,#0CCH
    LCALL GHI_LENH
    LCALL DELAY
    RET
    DELAY:
    MOV R6,#255
    DEL1: MOV R7,#255
    DEL2: DJNZ R7,DEL2
    DJNZ R6,DEL1
    RET
    DELAY1: MOV R6,#5
    DEL3: MOV R7,#92
    DEL4: DJNZ R7,DEL4
    DJNZ R6,DEL3
    RET

    DELAY2: MOV R6,#0FH
    DEL5: MOV R7,#0EH
    DEL6: DJNZ R7,DEL6
    DJNZ R6,DEL5
    RET

    ORG 200H
    MYDATA:
    db " empty test "
    ORG 250H
    MYDATA5:
    DB " READY ! "

    ORG 300H
    MYDATA1:
    DB"***** PASS *****"
    ORG 350H
    MYDATA2:
    DB "***** FAIL *****"
    END

    Comment


    • #3
      thank bac busy đã giúp đỡ, nhưng bác có code Viết bằng C ko, asm em ko biết j cả

      Comment


      • #4
        xem thử đi đây là mình chỉ conver lại thôi
        Code:
        // Ð.nh ngh.a các chân c.a LCD1602
        // Trong ví d. m.u s. d.ng 8 bit ð. ði.u khi.n LCD.
        #include <REGX51.H>
        #include <stdio.h>
        #define rs P3_5
        #define rw P3_6
        #define enable P3_7
        #define lcd_data P1
        unsigned char const LCD_INIT_STRING[4] = {1,0x38,6};
        unsigned char lcd_read_byte()
        {
        unsigned char dat;
        lcd_data = 0xFF;
        rw = 1;
        rw = 1;
        enable = 1;
        enable = 1;
        dat = lcd_data;
        enable = 0;
        return( dat);
        }
        void delay_us(unsigned char n)
        {
        unsigned char i;
        for(i=0;i<n;i++);
        }
        void delay_ms(unsigned int n)
        {
        unsigned int i;
        for(i=0;i<n;i++) delay_us(255);
        }
        void lcd_send_data( unsigned char n )
        {
        lcd_data = n;
        lcd_data = n;
        delay_us(10);
        enable = 1;
        delay_us(10);
        enable = 0;
        delay_us(10);
        }
        void lcd_send_byte( unsigned char address, unsigned char n )
        {
        rs = 0;
        while ( lcd_read_byte()&0x80) ; 
        rs = address;
        delay_us(10);
        rw = 0;
        delay_us(10);
        enable = 0;
        lcd_send_data(n);
        }
        void lcd_init()
        {
        char i;
        rs = 0;
        rw = 0;
        enable = 0;
        delay_ms(15);
        for(i=0;i<3;++i)
        lcd_send_byte(0,LCD_INIT_STRING[i]);
        }
        void lcd_gotoxy( unsigned char x, unsigned char y)
        {
        unsigned char address;
        switch(y)
        {
        case 1 : address=0x80;break;
        case 2 : address=0xC0;break;
        }
        address+=x-1;
        lcd_send_byte(0,address);
        }
        void lcd_putc( char c)
        {
        lcd_send_byte(1,c);
        }
        void lcd_put_str( const char *msg)
        {
        while(*msg) lcd_putc(*msg++);
        }
        main()
        {
        lcd_init();
        lcd_gotoxy(1,1);
        lcd_put_str ("LCD 1602 DEMO");
        lcd_gotoxy(1,2);
        lcd_put_str ("Chuc ban thanh cong"); 
        while(1);
        }

        Comment


        • #5
          làm gì viết dài ghê thế ! giao tiếp LCD 8bit là đơn giản nhất , nhưng mất đến 11 chân VDK. Sau đó đến 4 bit (chỉ mất 1 port), tiếp đến là chỉ dùng 3 chân VDK vẫn giao tiếp đc với LCD (wa kon 74HC164)

          U mới học thì code giao tiếp 8 bit nè
          Code:
          #include<AT89S53.h>
          
          sbit RW   = 0x94; // RW = P1.4
          sbit RS   = 0x95; // RS = P1.5
          sbit E    = 0x96; // E = P1.6
          		      // data = P2
          
          void delay_ms(unsigned int ms)
          { unsigned int i,j;
            for (i = 0;i<ms;i++ ) {for(j=0;j<120;j++){} }
          }
          
          void LCD_PutChar()
          { RW = 0 ; RS = 1 ; E = 1; E = 0 ; delay_ms(1);}
          
          void LCD_PutCmd()
          { RW = 0 ; RS = 0 ; E = 1; E = 0 ; delay_ms(1);}
          
          void int_LCD()
          { delay_ms(100);
            P2= 0x38 ; LCD_PutCmd() ; 	   
            P2= 0x0C ; LCD_PutCmd() ;
            P2= 0x01 ; LCD_PutCmd() ;
            P2= 0x06 ; LCD_PutCmd() ;
          }
          
          
          main()
          { P0 = 0xFF ; 
            P1 = 0xFF ;
            P2 = 0xFF ; 
            
            
            int_LCD();
          
            P2 = 0x80 ; LCD_PutCmd() ; // cho hiện dong Ready! ở dòng 1 cột 1
            P2 = 'R' ; LCD_PutChar() ;
            P2 = 'e' ; LCD_PutChar() ;
            P2 = 'a' ; LCD_PutChar() ;
            P2 = 'd' ; LCD_PutChar() ;
            P2 = 'y' ; LCD_PutChar() ;
            P2 = '!' ; LCD_PutChar() ;
            while(1);
          }

          Comment


          • #6
            bạn có thể tham khảo ở đây http://08tdt.com/forum/showthread.php?t=20

            Comment


            • #7
              các ơn các bac nhiều nha, em đã giải quyết đuọc bài này rồi,

              Comment


              • #8
                Nguyên văn bởi han_nang_008 Xem bài viết
                em là người mới học 8051, bác nào giúp em chuong trình hiển thị chữ "My Love" lên LCD 16x2 với, bác giúp em cả cái mạch mô phỏng proteus luôn nhé, thank các bác trc nhé
                hehe,chắc bác này làm để tặng người yêu đây

                Comment


                • #9
                  Bạn cài proteus ra là có mạch luôn rồi mà
                  NGUYỄN XUÂN VŨ
                  Mua bán, sửa chữa PLC, biến tần
                  Vỉ mạch điện tử công nghiệp các loại
                  0978462163

                  Comment


                  • #10
                    trong mục sample có lcd_demo đó vào đó xem
                    rồi nạp file bạn lập trình vào
                    ok nhé !
                    lcd có 2 chế độ hoạt động ( 8 bit và 4 bit)tùy thuộc vào code bạn khởi tạo lcd
                    đọc thêm datasheet sẽ giúp ích nhiều
                    chúc bạn thành công!
                    0945061338(vocam.h@gmail.com,lehanhdtk3@gmail.com)
                    ||
                    PROGRAMING(C,ASM),HARDWARE,LMD,RTC,GPRS,GPS....ALL OF VDK

                    Comment

                    Về tác giả

                    Collapse

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

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

                    Collapse

                    Đang tải...
                    X