Thông báo

Collapse
No announcement yet.

Xin trợ giúp về lập trình cho LCD (16*2) chế độ 8 bits.

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

  • Xin trợ giúp về lập trình cho LCD (16*2) chế độ 8 bits.

    Em đang tự tìm hiểu về lập trình cho LCD dùng VĐK AT89C51 viết bằng ngôn ngữ Assembly.
    Sơ đồ chân của LCD về cơ bản em đã nắm được.
    Em có tham khảo các đoạn code ở trên mạng, mang về chỉnh sửa và viết đoạn code hiển thị chữ "Tong Duc Cuong" lên LCD như sau:
    Code:
    ;========================================================
    ; Ten chuong trinh	: Hien thi chu: "Tong Duc Cuong" len LCD
    ; Nguoi thuc hien	: Kyle Ray
    ; Thuc hien			: 14/04/2012 - 7h25'
    ; Phien ban			: 1.0
    ; Mo ta phan cung	:
    ;		| Dung AT89C51 - thach anh 12MHz
    ;		| LCD 2 line - 16*2 (LM016L)
    ;		| Line1: 80 81 82 83 84 85 86 ... 8F
    ;		| Line2: C0 C1 C2 C3 CC C5 C6 ... CF
    ; 		| Dieu khien LCD che do 8 bit
    ; 		| P1.0,..,.7 dung de xuat du lieu
    ; 		| P3.7,.6,.5 cho cac chan EN(0 enable,1 disable)
    ; 		| RS(0: lenh,1: du lieu),RW( 1 read, 0 write )
    ;--------------------------------------------------------
    ; Ngay hoan thanh	: ...
    ; Ngay kiem tra		: ...
    ; Nguoi kiem tra	: Kyle Ray
    ;--------------------------------------------------------
    ; Chu thich	:
    ;		| Duoi day la doan code don gian hien thi chu:
    ;		| "Tong Duc Cuong" len LCD. Giup ta lam quen voi
    ;		| cong viec lam trinh cho LCD.
    ;========================================================
    DB7 bit p1.7
    EN bit p3.7
    RS bit p3.6
    RW bit p3.5
    ;-------------------------------
    org 0h
    main:
    ;1.	Khoi dong LCD
    	acall	Init_LCD			;Goi chuong trinh khoi tao cac gia tri ban dau cho LCD
    ;2.	Xoa LCD
    	acall	Clear_LCD			;Goi chuong trinh xoa LCD
    ;3. Ghi du lieu len LCD
    	mov a,	#"T"				;Chu T
    	acall	Write_Data			;Goi CTC hien xuat chu T ra LCD
    	mov a,	#"O"
    	acall	Write_Data
    	mov a,	#"N"
    	acall	Write_Data
    	mov a,	#"G"
    	acall	Write_Data
    	mov a,	#" "
    	acall	Write_Data
    	mov a,	#"D"
    	acall	Write_Data
    	mov a,	#"U"
    	acall	Write_Data
    	mov a,	#"C"
    	acall	Write_Data
    	mov a,	#" "
    	acall	Write_Data
    	mov a,	#"C"
    	acall	Write_Data
    	mov a,	#"U"
    	acall	Write_Data
    	mov a,	#"O"
    	acall	Write_Data
    	mov a,	#"N"
    	acall	Write_Data
    	mov a,	#"G"
    	acall	Write_Data
    	sjmp $						;Cho o day
    ;=========== CHUONG TRINH CON ==========
    ;---------------------------------------
    Init_LCD:
    	setb EN
    	mov a,	#38h				;Function Set (LCD 2 lines, dot 5*7)
    	acall	Write_Command
    	mov a,	#0eh				;Display Control (cho phep hien thi con tro)
    	acall	Write_Command
    	mov a,	#6h					;Entry mode set (ky tu sau hien thi sau ki tu truoc
    	acall	Write_Command		;va khong thay doi vi tri ki tu truoc)
    	ret
    ;---------------------------------------
    Clear_LCD:
    	setb EN
    	mov a,	#01h
    	acall	Write_Command
    	mov a,	#80h				;Dua con tro ve dong 1 cot 1
    	acall	Write_Command		;Xuat lenh
    	ret
    ;---------------------------------------
    Write_Command:
    	acall Ready_LCD				;KT xem LCD da sang sang nhan lenh chua
    	setb EN						;EN = 1 nhan xung hight - to - low
    	clr	RS						;Dat RS = 0 cho phep LCD xuat lenh
    	clr	RW						;Dat RW = 0 de ghi du lieu toi LCD
    	mov P1, a					;Xuat ma lenh
    	clr EN						;EN = 0 chot du lieu
    	ret
    ;---------- Ready_LCD ----------
    Ready_LCD:
    	setb DB7					;Lay DB7 lam cong vao, de ktra co lenh
    	clr RS						;Dat RS = 0 de truy cap thanh ghi lenh
    	setb RW						;Dat RW = 1 de doc thanh thanh ghi lenh 
    ; Doc thanh ghi lenh va kiem tra co lenh xem LCD da san sang chua
    Back:
    	setb EN						;EN = 1 de tao xung cao
    	clr EN						;EN = 0 tao xung thap cho viec chot du lieu
    	jb DB7, Back				;Cho den khi co ban bang 0 (LCD san sang)
    	ret
    ;---------------------------------------
    Write_Data:
    	acall Ready_LCD				;LCD da san sang chua?
    	setb EN						;EN = 1 Creat High pulse
    	setb RS						;RS = 1 Select Data Register
    	clr RW						;RW = 0 Write data to LCD
    	mov P1, a					;Export data
    	clr EN						;EN = 0 Creat Low pulse to latch data
    	ret
    ;---------------------------------------
    end
    Em không có điều kiện làm mạch thật mà chỉ mô phỏng bằng phần mềm Proteus v7.8 và có vấn đề nảy sinh là khi mô phỏng thì LCD chỉ hiện mỗi 1 vạch ngang ở cuối LCD. Em chưa biết phải sử lý như thế nào vì đây là lần đầu tiên em viết code và mô phỏng về LCD.
    Nhờ các anh (chị) trong diễn đàn giúp đỡ em gỡ rối vụ này với.!
    P/S: Em có đính kèm file mô phỏng ở dưới, nhờ các anh (chị) xem giúp.!
    LCD.zip

  • #2
    Nguyên văn bởi Ck33spkt Xem bài viết
    Em đang tự tìm hiểu về lập trình cho LCD dùng VĐK AT89C51 viết bằng ngôn ngữ Assembly.
    Sơ đồ chân của LCD về cơ bản em đã nắm được.
    Em có tham khảo các đoạn code ở trên mạng, mang về chỉnh sửa và viết đoạn code hiển thị chữ "Tong Duc Cuong" lên LCD như sau:
    Code:
    ;========================================================
    ; Ten chuong trinh	: Hien thi chu: "Tong Duc Cuong" len LCD
    ; Nguoi thuc hien	: Kyle Ray
    ; Thuc hien			: 14/04/2012 - 7h25'
    ; Phien ban			: 1.0
    ; Mo ta phan cung	:
    ;		| Dung AT89C51 - thach anh 12MHz
    ;		| LCD 2 line - 16*2 (LM016L)
    ;		| Line1: 80 81 82 83 84 85 86 ... 8F
    ;		| Line2: C0 C1 C2 C3 CC C5 C6 ... CF
    ; 		| Dieu khien LCD che do 8 bit
    ; 		| P1.0,..,.7 dung de xuat du lieu
    ; 		| P3.7,.6,.5 cho cac chan EN(0 enable,1 disable)
    ; 		| RS(0: lenh,1: du lieu),RW( 1 read, 0 write )
    ;--------------------------------------------------------
    ; Ngay hoan thanh	: ...
    ; Ngay kiem tra		: ...
    ; Nguoi kiem tra	: Kyle Ray
    ;--------------------------------------------------------
    ; Chu thich	:
    ;		| Duoi day la doan code don gian hien thi chu:
    ;		| "Tong Duc Cuong" len LCD. Giup ta lam quen voi
    ;		| cong viec lam trinh cho LCD.
    ;========================================================
    DB7 bit p1.7
    EN bit p3.7
    RS bit p3.6
    RW bit p3.5
    ;-------------------------------
    org 0h
    main:
    ;1.	Khoi dong LCD
    	acall	Init_LCD			;Goi chuong trinh khoi tao cac gia tri ban dau cho LCD
    ;2.	Xoa LCD
    	acall	Clear_LCD			;Goi chuong trinh xoa LCD
    ;3. Ghi du lieu len LCD
    	mov a,	#"T"				;Chu T
    	acall	Write_Data			;Goi CTC hien xuat chu T ra LCD
    	mov a,	#"O"
    	acall	Write_Data
    	mov a,	#"N"
    	acall	Write_Data
    	mov a,	#"G"
    	acall	Write_Data
    	mov a,	#" "
    	acall	Write_Data
    	mov a,	#"D"
    	acall	Write_Data
    	mov a,	#"U"
    	acall	Write_Data
    	mov a,	#"C"
    	acall	Write_Data
    	mov a,	#" "
    	acall	Write_Data
    	mov a,	#"C"
    	acall	Write_Data
    	mov a,	#"U"
    	acall	Write_Data
    	mov a,	#"O"
    	acall	Write_Data
    	mov a,	#"N"
    	acall	Write_Data
    	mov a,	#"G"
    	acall	Write_Data
    	sjmp $						;Cho o day
    ;=========== CHUONG TRINH CON ==========
    ;---------------------------------------
    Init_LCD:
    	setb EN
    	mov a,	#38h				;Function Set (LCD 2 lines, dot 5*7)
    	acall	Write_Command
    	mov a,	#0eh				;Display Control (cho phep hien thi con tro)
    	acall	Write_Command
    	mov a,	#6h					;Entry mode set (ky tu sau hien thi sau ki tu truoc
    	acall	Write_Command		;va khong thay doi vi tri ki tu truoc)
    	ret
    ;---------------------------------------
    Clear_LCD:
    	setb EN
    	mov a,	#01h
    	acall	Write_Command
    	mov a,	#80h				;Dua con tro ve dong 1 cot 1
    	acall	Write_Command		;Xuat lenh
    	ret
    ;---------------------------------------
    Write_Command:
    	acall Ready_LCD				;KT xem LCD da sang sang nhan lenh chua
    	setb EN						;EN = 1 nhan xung hight - to - low
    	clr	RS						;Dat RS = 0 cho phep LCD xuat lenh
    	clr	RW						;Dat RW = 0 de ghi du lieu toi LCD
    	mov P1, a					;Xuat ma lenh
    	clr EN						;EN = 0 chot du lieu
    	ret
    ;---------- Ready_LCD ----------
    Ready_LCD:
    	setb DB7					;Lay DB7 lam cong vao, de ktra co lenh
    	clr RS						;Dat RS = 0 de truy cap thanh ghi lenh
    	setb RW						;Dat RW = 1 de doc thanh thanh ghi lenh 
    ; Doc thanh ghi lenh va kiem tra co lenh xem LCD da san sang chua
    Back:
    	setb EN						;EN = 1 de tao xung cao
    	clr EN						;EN = 0 tao xung thap cho viec chot du lieu
    	jb DB7, Back				;Cho den khi co ban bang 0 (LCD san sang)
    	ret
    ;---------------------------------------
    Write_Data:
    	acall Ready_LCD				;LCD da san sang chua?
    	setb EN						;EN = 1 Creat High pulse
    	setb RS						;RS = 1 Select Data Register
    	clr RW						;RW = 0 Write data to LCD
    	mov P1, a					;Export data
    	clr EN						;EN = 0 Creat Low pulse to latch data
    	ret
    ;---------------------------------------
    end
    Em không có điều kiện làm mạch thật mà chỉ mô phỏng bằng phần mềm Proteus v7.8 và có vấn đề nảy sinh là khi mô phỏng thì LCD chỉ hiện mỗi 1 vạch ngang ở cuối LCD. Em chưa biết phải sử lý như thế nào vì đây là lần đầu tiên em viết code và mô phỏng về LCD.
    Nhờ các anh (chị) trong diễn đàn giúp đỡ em gỡ rối vụ này với.!
    P/S: Em có đính kèm file mô phỏng ở dưới, nhờ các anh (chị) xem giúp.!
    [ATTACH]43110[/ATTACH]
    thiếu delay sau mỗi lần gửi dữ liệu cho LCD. Xem tài liệu để biết thêm chi tiết(bảng 4:tập lệnh LCD)
    Attached Files

    Comment


    • #3
      hì.asm mình pó tay rồi
      Nguyễn Huy Biên - 01649 802 694
      gmail :

      Comment


      • #4
        Nguyên văn bởi chung1608 Xem bài viết
        thiếu delay sau mỗi lần gửi dữ liệu cho LCD. Xem tài liệu để biết thêm chi tiết(bảng 4:tập lệnh LCD)
        Em cám ơn bác đã quan tâm. Nhưng bác ơi ở đây em sử dụng cách kiểm tra cờ bận (Busy Flag) của LCD rồi thì còn cần gì đến delay nữa ạ?

        Comment


        • #5
          bạn đọc kĩ LCD cần khoảng vài ms để thực hiện các lệnh và tùy lệnh mà thời gian thực hiện khác nhau do đó phải có delay chứ nếu bạn xuất dữ liệu liên tục LCD không thực hiện kịp

          Comment


          • #6
            Nguyên văn bởi Ck33spkt Xem bài viết
            Em cám ơn bác đã quan tâm. Nhưng bác ơi ở đây em sử dụng cách kiểm tra cờ bận (Busy Flag) của LCD rồi thì còn cần gì đến delay nữa ạ?
            đọc trang 23 đi chú sẽ thấy 2 chỗ ko thể kiểm tra cờ bận mà bắt buộc phải dùng delay. Và cái khúc kiểm tra cờ bận của chú cũng sai nữa
            http://www.crystalfontz.com/controllers/ST7066U.pdf

            Comment


            • #7
              Nguyên văn bởi trimen Xem bài viết
              bạn đọc kĩ LCD cần khoảng vài ms để thực hiện các lệnh và tùy lệnh mà thời gian thực hiện khác nhau do đó phải có delay chứ nếu bạn xuất dữ liệu liên tục LCD không thực hiện kịp
              Hi, bác chưa đọc kỹ hết code em viết rồi. Em biết là mỗi lệnh thực hiện dài ngắn khác nhau và cần phải chờ LCD thực hiện xong lệnh gửi lần trước thì mới được phép gửi tiếp vì thế em đã có cái nhãn "Ready_LCD" để kiểm tra sự sẵn sằng của LCD rồi.
              Vấn đề của em là không biết sai ở đâu mà khi em mô phỏng thì LCD không hiện chữ nào! Chưa làm loại này bao giờ, cũng không có điều kiện lắp mạch thật nên mới nhờ mọi người trợ giúp!

              Comment


              • #8
                Nguyên văn bởi chung1608 Xem bài viết
                đọc trang 23 đi chú sẽ thấy 2 chỗ ko thể kiểm tra cờ bận mà bắt buộc phải dùng delay. Và cái khúc kiểm tra cờ bận của chú cũng sai nữa
                http://www.crystalfontz.com/controllers/ST7066U.pdf
                Bác có thể chỉ rõ hơn giúp em là em sai ở chỗ nào không? Vì code này em lấy trong sách ra, nên em nghĩ là nó đúng !

                Comment


                • #9
                  Nguyên văn bởi Ck33spkt Xem bài viết
                  Bác có thể chỉ rõ hơn giúp em là em sai ở chỗ nào không? Vì code này em lấy trong sách ra, nên em nghĩ là nó đúng !
                  chịu khó đọc hiểu lưu đồ đi chú, toàn từ dễ thôi. Trong đó cũng có code mẫu rồi

                  Comment


                  • #10
                    Em đã sửa lại code như thế này nhưng vẫn chẳng thay đổi được gì cả, bác nào biết giúp em với !

                    Code:
                    ;========================================================
                    ; Ten chuong trinh	: Hien thi chu: "Tong Duc Cuong" len LCD
                    ; Nguoi thuc hien	: Kyle Ray
                    ; Thuc hien			: 14/04/2012 - 7h25'
                    ; Phien ban			: 1.0
                    ; Mo ta phan cung	:
                    ;		| Dung AT89C51 - thach anh 12MHz
                    ;		| LCD 2 line - 16*2 (LM016L)
                    ;		| Line1: 80 81 82 83 84 85 86 ... 8F
                    ;		| Line2: C0 C1 C2 C3 CC C5 C6 ... CF
                    ; 		| Dieu khien LCD che do 8 bit
                    ; 		| P1.0,..,.7 dung de xuat du lieu
                    ; 		| P3.7,.6,.5 cho cac chan EN(0 enable,1 disable)
                    ; 		| RS(0: lenh,1: du lieu),RW( 1 read, 0 write )
                    ;--------------------------------------------------------
                    ; Ngay hoan thanh	: ...
                    ; Ngay kiem tra		: ...
                    ; Nguoi kiem tra	: Kyle Ray
                    ;--------------------------------------------------------
                    ; Chu thich	:
                    ;		| Duoi day la doan code don gian hien thi chu:
                    ;		| "Tong Duc Cuong" len LCD. Giup ta lam quen voi
                    ;		| cong viec lam trinh cho LCD.
                    ;========================================================
                    num_ms equ 30h
                    DB7 bit p1.7
                    EN bit p3.7
                    RS bit p3.6
                    RW bit p3.5
                    ;-------------------------------
                    org 0h
                    	mov num_ms, #50
                    main:
                    ;__________________________B1. Khoi dong LCD
                    	acall	Init_LCD			;Goi chuong trinh khoi tao cac gia tri ban dau cho LCD
                    ;__________________________B2. Xoa LCD
                    	acall	Clear_LCD			;Goi chuong trinh xoa LCD
                    ;__________________________B3. Ghi du lieu len LCD
                    	mov a,	#"T"				;Chu T
                    	acall	Write_Data			;Goi CTC hien xuat chu T ra LCD
                    	mov a,	#"O"
                    	acall	Write_Data
                    	mov a,	#"N"
                    	acall	Write_Data
                    	mov a,	#"G"
                    	acall	Write_Data
                    	mov a,	#" "
                    	acall	Write_Data
                    	mov a,	#"D"
                    	acall	Write_Data
                    	mov a,	#"U"
                    	acall	Write_Data
                    	mov a,	#"C"
                    	acall	Write_Data
                    	mov a,	#" "
                    	acall	Write_Data
                    	mov a,	#"C"
                    	acall	Write_Data
                    	mov a,	#"U"
                    	acall	Write_Data
                    	mov a,	#"O"
                    	acall	Write_Data
                    	mov a,	#"N"
                    	acall	Write_Data
                    	mov a,	#"G"
                    	acall	Write_Data
                    	sjmp $						;Cho o day
                    ;=========== CHUONG TRINH CON ==========
                    ;---------------------------------------
                    Init_LCD:
                    	setb EN
                    	acall delay_50ms
                    	mov a,	#38h				;Function Set (LCD 2 lines, dot 5*7)
                    	acall	Write_Command
                    	acall delay_50ms
                    	mov a,	#38h				;Function Set (LCD 2 lines, dot 5*7)
                    	acall	Write_Command
                    	acall delay_50ms
                    	mov a,	#38h				;Function Set (LCD 2 lines, dot 5*7)
                    	acall	Write_Command
                    	acall delay_50ms
                    	mov a,	#0eh				;Display Control (cho phep hien thi con tro)
                    	acall	Write_Command
                    	acall delay_50ms
                    	mov a,	#6h				;Entry mode set (ky tu sau hien thi sau ki tu truoc
                    	acall	Write_Command		        ;va khong thay doi vi tri ki tu truoc)
                    	acall delay_50ms
                    	ret
                    ;---------------------------------------
                    Clear_LCD:
                    	setb EN
                    	mov a,	#01h
                    	acall	Write_Command
                    	mov a,	#80h				;Dua con tro ve dong 1 cot 1
                    	acall	Write_Command		        ;Xuat lenh
                    	ret
                    ;---------------------------------------
                    Write_Command:
                    	acall Ready_LCD				;KT xem LCD da sang sang nhan lenh chua
                    	setb EN					;EN = 1 nhan xung hight - to - low
                    	clr	RS					;Dat RS = 0 cho phep LCD xuat lenh
                    	clr	RW					;Dat RW = 0 de ghi du lieu toi LCD
                    	mov P1, a					;Xuat ma lenh
                    	clr EN						;EN = 0 chot du lieu
                    	ret
                    ;---------- Ready_LCD ----------
                    Ready_LCD:
                    	setb DB7					;Lay DB7 lam cong vao, de ktra co lenh
                    	clr RS						;Dat RS = 0 de truy cap thanh ghi lenh
                    	setb RW						;Dat RW = 1 de doc thanh thanh ghi lenh 
                    ; Doc thanh ghi lenh va kiem tra co lenh xem LCD da san sang chua
                    Back:
                    	setb EN					;EN = 1 de tao xung cao
                    	clr EN						;EN = 0 tao xung thap cho viec chot du lieu
                    	jb DB7, Back				;Cho den khi co ban bang 0 (LCD san sang)
                    	ret
                    ;---------------------------------------
                    Write_Data:
                    	acall Ready_LCD				;LCD da san sang chua?
                    	setb EN					;EN = 1 Creat High pulse
                    	setb RS					;RS = 1 Select Data Register
                    	clr RW					;RW = 0 Write data to LCD
                    	mov P1, a					;Export data
                    	clr EN						;EN = 0 Creat Low pulse to latch data
                    	ret
                    ;---------------------------------------
                    delay_50ms:
                    	push	7
                    	push	6
                    	push	5
                    	mov	r5, num_ms
                    	mov r6, #2
                    	mov r7,	#248
                    	djnz r7, $
                    	djnz r6, $-4
                    	djnz r5, $-8
                    	pop	5
                    	pop 6
                    	pop 7
                    	ret
                    ;---------------------------------------
                    end

                    Comment


                    • #11
                      đây là đoạn code mẫu của tài liệu, chú thấy rằng dù có kiểm tra cờ bận thì người ta vẫn thêm delay ko. Với nữa đã nói đoạn kiểm tra cờ bận của chú SAI mà ko thấy sửa
                      Code:
                      INITIAL_START:
                      CALL DELAY40mS
                      MOV A,#38H ;FUNCTION SET
                      CALL WRINS_NOCHK ;8 bit,N=1,5*7dot
                      CALL DELAY37uS
                      MOV A,#38H ;FUNCTION SET
                      CALL WRINS_NOCHK ;8 bit,N=1,5*7dot
                      CALL DELAY37uS
                      MOV A,#0FH ;DISPLAY ON
                      CALL WRINS_CHK
                      CALL DELAY37uS
                      MOV A,#01H ;CLEAR DISPLAY
                      CALL WRINS_CHK
                      CALL DELAY1.52mS
                      MOV A,#06H ;ENTRY MODE SET
                      CALL WRINS_CHK ;CURSOR MOVES TO RIGHT
                      CALL DELAY37uS
                      ;---------------------------------------------------------------------------------
                      MAIN_START:
                      XXXX
                      XXXX
                      XXXX
                      XXXX
                      .
                      .
                      .
                      .
                      ;---------------------------------------------------------------------------------
                      WRINS_CHK:
                      CALL CHK_BUSY
                      WRINS_NOCHK:
                      CLR RS ;EX:Port 3.0
                      CLR RW ;EX:Port 3.1
                      SETB E ;EX:Port 3.2
                      MOV P1,A ;EX:Port 1=Data Bus
                      CLR E
                      MOV P1,#FFH ;For Check Busy Flag
                      RET
                      ;---------------------------------------------------------------------------------
                      CHK_BUSY: ;Check Busy Flag
                      CLR RS
                      SETB RW
                      SETB E
                      JB P1.7,$
                      CLR E
                      RET

                      Comment


                      • #12
                        C thì mình có thể giúp chứ asm thì chịu roài. chưa có time ngâm cái này.

                        Comment


                        • #13
                          Nguyên văn bởi Ck33spkt Xem bài viết
                          Em đang tự tìm hiểu về lập trình cho LCD dùng VĐK AT89C51 viết bằng ngôn ngữ Assembly.
                          Sơ đồ chân của LCD về cơ bản em đã nắm được.
                          Em có tham khảo các đoạn code ở trên mạng, mang về chỉnh sửa và viết đoạn code hiển thị chữ "Tong Duc Cuong" lên LCD như sau:
                          Code:
                          ;========================================================
                          ; Ten chuong trinh	: Hien thi chu: "Tong Duc Cuong" len LCD
                          ; Nguoi thuc hien	: Kyle Ray
                          ; Thuc hien			: 14/04/2012 - 7h25'
                          ; Phien ban			: 1.0
                          ; Mo ta phan cung	:
                          ;		| Dung AT89C51 - thach anh 12MHz
                          ;		| LCD 2 line - 16*2 (LM016L)
                          ;		| Line1: 80 81 82 83 84 85 86 ... 8F
                          ;		| Line2: C0 C1 C2 C3 CC C5 C6 ... CF
                          ; 		| Dieu khien LCD che do 8 bit
                          ; 		| P1.0,..,.7 dung de xuat du lieu
                          ; 		| P3.7,.6,.5 cho cac chan EN(0 enable,1 disable)
                          ; 		| RS(0: lenh,1: du lieu),RW( 1 read, 0 write )
                          ;--------------------------------------------------------
                          ; Ngay hoan thanh	: ...
                          ; Ngay kiem tra		: ...
                          ; Nguoi kiem tra	: Kyle Ray
                          ;--------------------------------------------------------
                          ; Chu thich	:
                          ;		| Duoi day la doan code don gian hien thi chu:
                          ;		| "Tong Duc Cuong" len LCD. Giup ta lam quen voi
                          ;		| cong viec lam trinh cho LCD.
                          ;========================================================
                          DB7 bit p1.7
                          EN bit p3.7
                          RS bit p3.6
                          RW bit p3.5
                          ;-------------------------------
                          org 0h
                          main:
                          ;1.	Khoi dong LCD
                          	acall	Init_LCD			;Goi chuong trinh khoi tao cac gia tri ban dau cho LCD
                          ;2.	Xoa LCD
                          	acall	Clear_LCD			;Goi chuong trinh xoa LCD
                          ;3. Ghi du lieu len LCD
                          	mov a,	#"T"				;Chu T
                          	acall	Write_Data			;Goi CTC hien xuat chu T ra LCD
                          	mov a,	#"O"
                          	acall	Write_Data
                          	mov a,	#"N"
                          	acall	Write_Data
                          	mov a,	#"G"
                          	acall	Write_Data
                          	mov a,	#" "
                          	acall	Write_Data
                          	mov a,	#"D"
                          	acall	Write_Data
                          	mov a,	#"U"
                          	acall	Write_Data
                          	mov a,	#"C"
                          	acall	Write_Data
                          	mov a,	#" "
                          	acall	Write_Data
                          	mov a,	#"C"
                          	acall	Write_Data
                          	mov a,	#"U"
                          	acall	Write_Data
                          	mov a,	#"O"
                          	acall	Write_Data
                          	mov a,	#"N"
                          	acall	Write_Data
                          	mov a,	#"G"
                          	acall	Write_Data
                          	sjmp $						;Cho o day
                          ;=========== CHUONG TRINH CON ==========
                          ;---------------------------------------
                          Init_LCD:
                          	setb EN
                          	mov a,	#38h				;Function Set (LCD 2 lines, dot 5*7)
                          	acall	Write_Command
                          	mov a,	#0eh				;Display Control (cho phep hien thi con tro)
                          	acall	Write_Command
                          	mov a,	#6h					;Entry mode set (ky tu sau hien thi sau ki tu truoc
                          	acall	Write_Command		;va khong thay doi vi tri ki tu truoc)
                          	ret
                          ;---------------------------------------
                          Clear_LCD:
                          	setb EN
                          	mov a,	#01h
                          	acall	Write_Command
                          	mov a,	#80h				;Dua con tro ve dong 1 cot 1
                          	acall	Write_Command		;Xuat lenh
                          	ret
                          ;---------------------------------------
                          Write_Command:
                          	acall Ready_LCD				;KT xem LCD da sang sang nhan lenh chua
                          	setb EN						;EN = 1 nhan xung hight - to - low
                          	clr	RS						;Dat RS = 0 cho phep LCD xuat lenh
                          	clr	RW						;Dat RW = 0 de ghi du lieu toi LCD
                          	mov P1, a					;Xuat ma lenh
                          	clr EN						;EN = 0 chot du lieu
                          	ret
                          ;---------- Ready_LCD ----------
                          Ready_LCD:
                          	setb DB7					;Lay DB7 lam cong vao, de ktra co lenh
                          	clr RS						;Dat RS = 0 de truy cap thanh ghi lenh
                          	setb RW						;Dat RW = 1 de doc thanh thanh ghi lenh 
                          ; Doc thanh ghi lenh va kiem tra co lenh xem LCD da san sang chua
                          Back:
                          	setb EN						;EN = 1 de tao xung cao
                          	clr EN						;EN = 0 tao xung thap cho viec chot du lieu
                          	jb DB7, Back				;Cho den khi co ban bang 0 (LCD san sang)
                          	ret
                          ;---------------------------------------
                          Write_Data:
                          	acall Ready_LCD				;LCD da san sang chua?
                          	setb EN						;EN = 1 Creat High pulse
                          	setb RS						;RS = 1 Select Data Register
                          	clr RW						;RW = 0 Write data to LCD
                          	mov P1, a					;Export data
                          	clr EN						;EN = 0 Creat Low pulse to latch data
                          	ret
                          ;---------------------------------------
                          end
                          Em không có điều kiện làm mạch thật mà chỉ mô phỏng bằng phần mềm Proteus v7.8 và có vấn đề nảy sinh là khi mô phỏng thì LCD chỉ hiện mỗi 1 vạch ngang ở cuối LCD. Em chưa biết phải sử lý như thế nào vì đây là lần đầu tiên em viết code và mô phỏng về LCD.
                          Nhờ các anh (chị) trong diễn đàn giúp đỡ em gỡ rối vụ này với.!
                          P/S: Em có đính kèm file mô phỏng ở dưới, nhờ các anh (chị) xem giúp.!
                          [ATTACH]43110[/ATTACH]
                          Đang mài dũa nhôm và mica, sức khỏe lên nên ra tay nghĩa hiệp giúp em cái code nè.
                          Lỗi chính là ở phần mềm Protues, LCD ko có chế độ trả về mức thấp ở chân DB7 hoặc lý do nào khác mà chưa bít.
                          Đã sửa code lại ở phần Wait_lcd
                          Code edit:
                          Code:
                          ;========================================================
                          ; Ten chuong trinh	: Hien thi chu: "Tong Duc Cuong" len LCD
                          ; Nguoi thuc hien	: Kyle Ray
                          ; Thuc hien			: 14/04/2012 - 7h25'
                          ; Phien ban			: 1.0
                          ; Mo ta phan cung	:
                          ;		| Dung AT89C51 - thach anh 12MHz
                          ;		| LCD 2 line - 16*2 (LM016L)
                          ;		| Line1: 80 81 82 83 84 85 86 ... 8F
                          ;		| Line2: C0 C1 C2 C3 CC C5 C6 ... CF
                          ; 		| Dieu khien LCD che do 8 bit
                          ; 		| P1.0,..,.7 dung de xuat du lieu
                          ; 		| P3.7,.6,.5 cho cac chan EN(0 enable,1 disable)
                          ; 		| RS(0: lenh,1: du lieu),RW( 1 read, 0 write )
                          ;--------------------------------------------------------
                          ; Ngay hoan thanh	: ...
                          ; Ngay kiem tra		: ...
                          ; Nguoi kiem tra	: Kyle Ray
                          ;--------------------------------------------------------
                          ; Chu thich	:
                          ;		| Duoi day la doan code don gian hien thi chu:
                          ;		| "Tong Duc Cuong" len LCD. Giup ta lam quen voi
                          ;		| cong viec lam trinh cho LCD.
                          ;========================================================
                          DB7 bit p1.7
                          EN bit p3.7
                          RS bit p3.6
                          RW bit p3.5
                          num_ms	data	30h
                          ;-------------------------------
                          org 0000h
                          main:
                          ;1.	Khoi dong LCD
                          	acall	Init_LCD			;Goi chuong trinh khoi tao cac gia tri ban dau cho LCD
                          ;2.	Xoa LCD
                          	mov	P2,#0aah
                          	acall	Clear_LCD			;Goi chuong trinh xoa LCD
                          ;3. Ghi du lieu len LCD
                          	mov a,	#'T'				;Chu T
                          	acall	Write_Data			;Goi CTC hien xuat chu T ra LCD
                          	mov a,	#'O'
                          	acall	Write_Data
                          	mov a,	#'N'
                          	acall	Write_Data
                          	mov a,	#'G'
                          	acall	Write_Data
                          	mov a,	#' '
                          	acall	Write_Data
                          	mov a,	#'D'
                          	acall	Write_Data
                          	mov a,	#'U'
                          	acall	Write_Data
                          	mov a,	#'C'
                          	acall	Write_Data
                          	mov a,	#' '
                          	acall	Write_Data
                          	mov a,	#'C'
                          	acall	Write_Data
                          	mov a,	#'U'
                          	acall	Write_Data
                          	mov a,	#'O'
                          	acall	Write_Data
                          	mov a,	#'N'
                          	acall	Write_Data
                          	mov a,	#'G'
                          	acall	Write_Data
                          
                          	mov	a,#80h
                          	add	a,#40h
                          	acall	Write_Command
                          
                          	mov a,	#'T'				;Chu T
                          	acall	Write_Data			;Goi CTC hien xuat chu T ra LCD
                          	mov a,	#'i'
                          	acall	Write_Data
                          	mov a,	#'e'
                          	acall	Write_Data
                          	mov a,	#'n'
                          	acall	Write_Data
                          	mov a,	#'h'
                          	acall	Write_Data
                          	mov a,	#'u'
                          	acall	Write_Data
                          	mov a,	#'y'
                          	acall	Write_Data
                          	mov a,	#'p'
                          	acall	Write_Data
                          	mov a,	#'r'
                          	acall	Write_Data
                          	mov a,	#'o'
                          	acall	Write_Data
                          
                          	sjmp $						;Cho o day
                          ;=========== CHUONG TRINH CON ==========
                          ;---------------------------------------
                          Init_LCD:
                          	setb EN
                          	mov a,	#38h				;Function Set (LCD 2 lines, dot 5*7)
                          	acall	Write_Command
                          	mov a,	#0ch				;Display Control (cho phep hien thi con tro)
                          	acall	Write_Command
                          	mov a,	#06h					;Entry mode set (ky tu sau hien thi sau ki tu truoc
                          	acall	Write_Command		;va khong thay doi vi tri ki tu truoc)
                          	ret
                          ;---------------------------------------
                          Clear_LCD:
                          	mov a,	#01h
                          	acall	Write_Command
                          	mov a,	#80h				;Dua con tro ve dong 1 cot 1
                          	acall	Write_Command		;Xuat lenh
                          	mov	num_ms,#100
                          	call	delay_ms
                          	ret
                          ;---------------------------------------
                          Write_Command:
                          	setb EN						;EN = 1 nhan xung hight - to - low
                          	clr	RS						;Dat RS = 0 cho phep LCD xuat lenh
                          	clr	RW						;Dat RW = 0 de ghi du lieu toi LCD
                          	mov P1, a					;Xuat ma lenh
                          	clr EN						;EN = 0 chot du lieu
                          	acall wait_lcd		;KT xem LCD da sang sang nhan lenh chua
                          	
                          	ret
                          ;---------- Ready_LCD ----------
                          Ready_LCD:
                          	setb EN					;Lay DB7 lam cong vao, de ktra co lenh
                          	clr RS						;Dat RS = 0 de truy cap thanh ghi lenh
                          	setb RW						;Dat RW = 1 de doc thanh thanh ghi lenh 
                          ; Doc thanh ghi lenh va kiem tra co lenh xem LCD da san sang chua
                          	mov	p1,#0ffh						;EN = 1 de tao xung cao
                          	mov	a,p1						;EN = 0 tao xung thap cho viec chot du lieu
                          	jb acc.7,Ready_LCD
                          	clr EN
                          	CLR RW				;Cho den khi co ban bang 0 (LCD san sang)
                          	ret
                          ;---------------------------------------
                          wait_lcd: mov r1,#100
                          	djnz r1,$
                          	ret
                          Write_Data:
                          	setb EN						;EN = 1 Creat High pulse
                          	setb RS						;RS = 1 Select Data Register
                          	clr RW						;RW = 0 Write data to LCD
                          	mov P1,a					;Export data
                          	clr EN						;EN = 0 Creat Low pulse to latch data
                          	acall wait_lcd		;LCD da san sang chua?
                          	ret
                          ;---------------------------------------
                          ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                          ;#######################################################################################
                          ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                          delay_ms:	
                          	push	7
                          	push	6
                          	push	5
                          	mov	r5,num_ms
                          	mov 	r6,#4
                          	mov 	r7,#249
                          	djnz 	r7,$		;2*249=498
                                 	djnz 	r6,$-4		;(489+2)*4=2000	;
                          	djnz	r5,$-8		;(2000+2)*num_ms= clk_delay
                          	pop	5		;T_dl= clk_delay*chu_ki_may=clk_delay*1/(24000000/12)
                          	pop	6		;	=clk_delay*1/2000000 ~= num_ms/1000 (s)
                          	pop	7		;				=num_ms (ms)	
                                  ret
                          ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                          ;#######################################################################################
                          ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                          
                          end
                          Hình ảnh chạy mô phỏng
                          Click image for larger version

Name:	LCD.png
Views:	1
Size:	25.7 KB
ID:	1360356
                          FIle :

                          Email:
                          Tel: 0983.497.310

                          Comment


                          • #14
                            Nguyên văn bởi tienhuypro Xem bài viết
                            Đang mài dũa nhôm và mica, sức khỏe lên nên ra tay nghĩa hiệp giúp em cái code nè.
                            Lỗi chính là ở phần mềm Protues, LCD ko có chế độ trả về mức thấp ở chân DB7 hoặc lý do nào khác mà chưa bít.
                            Đã sửa code lại ở phần Wait_lcd
                            Code edit:
                            Code:
                            ;========================================================
                            ; Ten chuong trinh	: Hien thi chu: "Tong Duc Cuong" len LCD
                            ; Nguoi thuc hien	: Kyle Ray
                            ; Thuc hien			: 14/04/2012 - 7h25'
                            ; Phien ban			: 1.0
                            ; Mo ta phan cung	:
                            ;		| Dung AT89C51 - thach anh 12MHz
                            ;		| LCD 2 line - 16*2 (LM016L)
                            ;		| Line1: 80 81 82 83 84 85 86 ... 8F
                            ;		| Line2: C0 C1 C2 C3 CC C5 C6 ... CF
                            ; 		| Dieu khien LCD che do 8 bit
                            ; 		| P1.0,..,.7 dung de xuat du lieu
                            ; 		| P3.7,.6,.5 cho cac chan EN(0 enable,1 disable)
                            ; 		| RS(0: lenh,1: du lieu),RW( 1 read, 0 write )
                            ;--------------------------------------------------------
                            ; Ngay hoan thanh	: ...
                            ; Ngay kiem tra		: ...
                            ; Nguoi kiem tra	: Kyle Ray
                            ;--------------------------------------------------------
                            ; Chu thich	:
                            ;		| Duoi day la doan code don gian hien thi chu:
                            ;		| "Tong Duc Cuong" len LCD. Giup ta lam quen voi
                            ;		| cong viec lam trinh cho LCD.
                            ;========================================================
                            DB7 bit p1.7
                            EN bit p3.7
                            RS bit p3.6
                            RW bit p3.5
                            num_ms	data	30h
                            ;-------------------------------
                            org 0000h
                            main:
                            ;1.	Khoi dong LCD
                            	acall	Init_LCD			;Goi chuong trinh khoi tao cac gia tri ban dau cho LCD
                            ;2.	Xoa LCD
                            	mov	P2,#0aah
                            	acall	Clear_LCD			;Goi chuong trinh xoa LCD
                            ;3. Ghi du lieu len LCD
                            	mov a,	#'T'				;Chu T
                            	acall	Write_Data			;Goi CTC hien xuat chu T ra LCD
                            	mov a,	#'O'
                            	acall	Write_Data
                            	mov a,	#'N'
                            	acall	Write_Data
                            	mov a,	#'G'
                            	acall	Write_Data
                            	mov a,	#' '
                            	acall	Write_Data
                            	mov a,	#'D'
                            	acall	Write_Data
                            	mov a,	#'U'
                            	acall	Write_Data
                            	mov a,	#'C'
                            	acall	Write_Data
                            	mov a,	#' '
                            	acall	Write_Data
                            	mov a,	#'C'
                            	acall	Write_Data
                            	mov a,	#'U'
                            	acall	Write_Data
                            	mov a,	#'O'
                            	acall	Write_Data
                            	mov a,	#'N'
                            	acall	Write_Data
                            	mov a,	#'G'
                            	acall	Write_Data
                            
                            	mov	a,#80h
                            	add	a,#40h
                            	acall	Write_Command
                            
                            	mov a,	#'T'				;Chu T
                            	acall	Write_Data			;Goi CTC hien xuat chu T ra LCD
                            	mov a,	#'i'
                            	acall	Write_Data
                            	mov a,	#'e'
                            	acall	Write_Data
                            	mov a,	#'n'
                            	acall	Write_Data
                            	mov a,	#'h'
                            	acall	Write_Data
                            	mov a,	#'u'
                            	acall	Write_Data
                            	mov a,	#'y'
                            	acall	Write_Data
                            	mov a,	#'p'
                            	acall	Write_Data
                            	mov a,	#'r'
                            	acall	Write_Data
                            	mov a,	#'o'
                            	acall	Write_Data
                            
                            	sjmp $						;Cho o day
                            ;=========== CHUONG TRINH CON ==========
                            ;---------------------------------------
                            Init_LCD:
                            	setb EN
                            	mov a,	#38h				;Function Set (LCD 2 lines, dot 5*7)
                            	acall	Write_Command
                            	mov a,	#0ch				;Display Control (cho phep hien thi con tro)
                            	acall	Write_Command
                            	mov a,	#06h					;Entry mode set (ky tu sau hien thi sau ki tu truoc
                            	acall	Write_Command		;va khong thay doi vi tri ki tu truoc)
                            	ret
                            ;---------------------------------------
                            Clear_LCD:
                            	mov a,	#01h
                            	acall	Write_Command
                            	mov a,	#80h				;Dua con tro ve dong 1 cot 1
                            	acall	Write_Command		;Xuat lenh
                            	mov	num_ms,#100
                            	call	delay_ms
                            	ret
                            ;---------------------------------------
                            Write_Command:
                            	setb EN						;EN = 1 nhan xung hight - to - low
                            	clr	RS						;Dat RS = 0 cho phep LCD xuat lenh
                            	clr	RW						;Dat RW = 0 de ghi du lieu toi LCD
                            	mov P1, a					;Xuat ma lenh
                            	clr EN						;EN = 0 chot du lieu
                            	acall wait_lcd		;KT xem LCD da sang sang nhan lenh chua
                            	
                            	ret
                            ;---------- Ready_LCD ----------
                            Ready_LCD:
                            	setb EN					;Lay DB7 lam cong vao, de ktra co lenh
                            	clr RS						;Dat RS = 0 de truy cap thanh ghi lenh
                            	setb RW						;Dat RW = 1 de doc thanh thanh ghi lenh 
                            ; Doc thanh ghi lenh va kiem tra co lenh xem LCD da san sang chua
                            	mov	p1,#0ffh						;EN = 1 de tao xung cao
                            	mov	a,p1						;EN = 0 tao xung thap cho viec chot du lieu
                            	jb acc.7,Ready_LCD
                            	clr EN
                            	CLR RW				;Cho den khi co ban bang 0 (LCD san sang)
                            	ret
                            ;---------------------------------------
                            wait_lcd: mov r1,#100
                            	djnz r1,$
                            	ret
                            Write_Data:
                            	setb EN						;EN = 1 Creat High pulse
                            	setb RS						;RS = 1 Select Data Register
                            	clr RW						;RW = 0 Write data to LCD
                            	mov P1,a					;Export data
                            	clr EN						;EN = 0 Creat Low pulse to latch data
                            	acall wait_lcd		;LCD da san sang chua?
                            	ret
                            ;---------------------------------------
                            ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                            ;#######################################################################################
                            ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                            delay_ms:	
                            	push	7
                            	push	6
                            	push	5
                            	mov	r5,num_ms
                            	mov 	r6,#4
                            	mov 	r7,#249
                            	djnz 	r7,$		;2*249=498
                                   	djnz 	r6,$-4		;(489+2)*4=2000	;
                            	djnz	r5,$-8		;(2000+2)*num_ms= clk_delay
                            	pop	5		;T_dl= clk_delay*chu_ki_may=clk_delay*1/(24000000/12)
                            	pop	6		;	=clk_delay*1/2000000 ~= num_ms/1000 (s)
                            	pop	7		;				=num_ms (ms)	
                                    ret
                            ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                            ;#######################################################################################
                            ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                            
                            end
                            Hình ảnh chạy mô phỏng
                            [ATTACH=CONFIG]44121[/ATTACH]
                            FIle :
                            Cảm ơn bác. Để em về nghiên cứu, có gì không hiểu sẽ làm phiền các bác sau, hihi ...

                            Comment


                            • #15
                              mình cũng tải bài bạn gửi lên vừa sửa xong,bạn hiện thị nhiều ký tự trên nên dùng bảng mã mạch mô phỏng bạn không cần vẽ phức tạp quá code có thể thu gọn lại rất nhiều nhưng mình hơi bận nên chua làm được đây là code và mạch mô
                              phỏng:lcd.rar

                              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