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

  • #16
    Nguyên văn bởi dtcn_112 Xem bài viết
    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
    Em cũng đã từng thấy nhiều người sử dụng cái cách tra bảng mã gì đó nhưng không hiểu gì về hoạt động của nó cả. Bác có tài liệu hay nguyên lý tra bảng thì cho em xin về nghiên cứu với? Chứ viết code thủ công thế này thì dài và tốn dung lượng Ram lắm !

    Comment


    • #17
      Nguyên văn bởi Ck33spkt Xem bài viết
      Em cũng đã từng thấy nhiều người sử dụng cái cách tra bảng mã gì đó nhưng không hiểu gì về hoạt động của nó cả. Bác có tài liệu hay nguyên lý tra bảng thì cho em xin về nghiên cứu với? Chứ viết code thủ công thế này thì dài và tốn dung lượng Ram lắm !
      Code mới viết theo cách tra bảng nè:
      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	DPTR,#STRING_CODE
      	CALL	WRITE_TEXT
      
      	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
      WRITE_TEXT:
      	CLR A
      	MOVC A,@A+DPTR
      	JZ EXIT
      	LCALL Write_Data
      	INC	DPTR
      	SJMP WRITE_TEXT
        EXIT:	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
      ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      ;#######################################################################################
      ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      STRING_CODE: DB	'TONG DUC CUONG',0
      end

      Email:
      Tel: 0983.497.310

      Comment


      • #18
        Nguyên văn bởi tienhuypro Xem bài viết
        Code mới viết theo cách tra bảng nè:
        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	DPTR,#STRING_CODE
        	CALL	WRITE_TEXT
        
        	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
        WRITE_TEXT:
        	CLR A
        	MOVC A,@A+DPTR
        	JZ EXIT
        	LCALL Write_Data
        	INC	DPTR
        	SJMP WRITE_TEXT
          EXIT:	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
        ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        ;#######################################################################################
        ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        STRING_CODE: DB	'TONG DUC CUONG',0
        end
        Cái dòng lệnh num_ms data 30h có nghĩa là gì ạ? Có thể thay chữ "data" bằng "equ" được không bác?
        Last edited by Ck33spkt; 29-04-2012, 10:25. Lý do: Sai chính tả

        Comment


        • #19
          Nguyên văn bởi Ck33spkt Xem bài viết
          Cái dòng lệnh num_ms data 30h có nghĩa là gì ạ? Có thể thay chữ "data" bằng "equ" được không bác?
          Nó giống nhau thôi

          Email:
          Tel: 0983.497.310

          Comment


          • #20
            Nguyên văn bởi tienhuypro Xem bài viết
            Nó giống nhau thôi
            Bác có thể giúp em phân biệt là khi nào thì mình phải dùng kiểu "data" còn khi nào thì mình dùng kiểu "equ" không?

            Comment


            • #21
              Nguyên văn bởi tienhuypro Xem bài viết
              Nó giống nhau thôi
              sai rồi đó chú, khi khai báo DATA thì là khai báo hằng, ko ảnh hưởng tới RAM.
              Còn khai báo EQU là khai báo địa chỉ RAM trực tiếp

              Comment


              • #22
                Nguyên văn bởi chung1608 Xem bài viết
                sai rồi đó chú, khi khai báo DATA thì là khai báo hằng, ko ảnh hưởng tới RAM.
                Còn khai báo EQU là khai báo địa chỉ RAM trực tiếp
                Hình như bác này nói ngược hay sao ý nhỉ?

                Comment


                • #23
                  Nguyên văn bởi Ck33spkt Xem bài viết
                  Hình như bác này nói ngược hay sao ý nhỉ?
                  thế thì chú thử dịch hai khai báo dưới xem khai báo nào lỗi
                  Code:
                  ABC	EQU	R1
                  DEF	DATA	R0

                  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