![]()  | 
		
			
  | 	
	
 Tài trợ cho PIC Vietnam  | 
||||||||
| MPASM Lập trình bằng hợp ngữ là một việc làm vô cùng vất vả, tuy nhiên, để hiểu và làm việc với vi điều khiển, hợp ngữ trở thành một công cụ khá đắc lực ... | 
![]()  | 
	
	
| 
		 | 
	Ðiều Chỉnh | Xếp Bài | 
| 		
			
			 | 
		#1 | 
| 
			
			
			
			 Đệ tử 1 túi 
			
		
			
			
			Tham gia ngày: Jul 2006 
				
				
				
					Bài gửi: 19
 
				
				
				:  | 
	
	
	
	
		
			
			 Cac huynh de cho minh hoi chut xiu : 
		
	
		
		
			Chuong trinh ben duoi minh viet de hien thi ki tu A len LCD ,nhung khi mo phong no thi khong chay ,minh khong biet sai o cho nao ,cac huynh de kiem tra dum va sua dum cho minh nha ,minh dang lam de tai nen dang can gap .Cam on nhieu! Code: 
	TITLE "HIEN THI LEN LCD" PROCESSOR P16F876A #INCLUDE <P16F876A.INC> ;CHEN THU VIEN LIEN KET CHO CHUONG TRINH __CONFIG 3F71H ;CAU HINH CAC BIT HE THONG ERRORLEVEL -302 ;BO DI CAC LOI CHON BANK cblock 0X020 LCD_TEMP LCD_TEMP1 DELAY X_DELAY endc LCD_DATA EQU PORTB LCD_DATA_TRIS EQU TRISB LCD_CTRL EQU PORTA ; PORTA control bits LCD_E EQU 2 LCD_RW EQU 1 LCD_RS EQU 0 org 0x000 GOTO START START ;HIEN THI NHIET DO LEN LCD LCDINIT CLRF LCD_CTRL MOVLW 0x01E CALL X_DELAY500 ; 30 * 0.5mS = 15mS MOVLW 0x038 ; 8-bit-interface, 2-lines CALL LCDPUTCMD MOVLW 0x000 ; disp.off, curs.off, no-blink CALL LCDDMODE CALL LCDCLEAR MOVLW 0x004 ; disp.on, curs.off CALL LCDDMODE MOVLW 0x002 ; auto-inc (shift-cursor) CALL LCDEMODE ;MOVLW 0x01E ;CALL X_DELAY500 CALL LCDPUTCHAR RETURN ;************************************************* ********************* LCDBUSY BSF STATUS,RP0 ; bank 1 MOVLW 0x0FF ; Set PORTB for input MOVWF LCD_DATA_TRIS BCF STATUS, RP0 ; bank 0 BCF LCD_CTRL, LCD_RS ; lenh dang duoc viet len LCD BSF LCD_CTRL, LCD_RW ; vdk doc du lieu tu LCD BSF LCD_CTRL, LCD_E ; cho phep giao tiep LCD MOVF LCD_DATA, W ; Read busy flag + DDram address BCF LCD_CTRL, LCD_E ; cam ANDLW 0x80 ; Check Busy flag, High = Busy BTFSS STATUS, Z GOTO LCDBUSY LCDNOTBUSY BCF LCD_CTRL, LCD_RW BSF STATUS, RP0 ; bank 1 MOVLW 0x000 MOVWF LCD_DATA_TRIS ; Set PORTB for output BCF STATUS, RP0 ; bank 0 RETURN ;************************************************* ******************** LCDDMODE ANDLW 0x007 ; Strip upper bits IORLW 0x008 ; Function set CALL LCDPUTCMD RETURN ;************************************************* ********************* LCDCLEAR MOVLW 0x001 CALL LCDPUTCMD RETURN ;************************************************* ******************** LCDEMODE ANDLW 0x003 ; Strip upper bits IORLW 0x004 ; Function set CALL LCDPUTCMD RETURN ;************************************************* ********************* LCDPUTCHAR Movlw 0x080 ;dinh dia chi de xuat A CALL LCDPUTCMD Movlw 'A' movwf LCD_TEMP CALL LCDBUSY ; Wait for LCD to be ready BCF LCD_CTRL, LCD_RW ; vdk viet du lieu len LCD BSF LCD_CTRL, LCD_RS ; du lieu dang duoc viet len LCD BSF LCD_CTRL, LCD_E ; cho phep giao tiep LCD MOVF LCD_TEMP, W MOVWF LCD_DATA ; Send data to LCD BCF LCD_CTRL, LCD_E ; cam giao tiep LCD RETURN ;************************************************* ********************* LCDPUTCMD MOVWF LCD_TEMP ; Command to send is in W CALL LCDBUSY ; Wait for LCD to be ready BCF LCD_CTRL, LCD_RW ; vdk viet du lieu len LCD BCF LCD_CTRL, LCD_RS ; lenh dang duoc viet len LCD BSF LCD_CTRL, LCD_E ; cho phep giao tiep LCD MOVF LCD_TEMP, W MOVWF LCD_DATA ; Send data to LCD BCF LCD_CTRL, LCD_E ; cam giao tiep LCD RETURN ;************************************************* ****************** DELAY500 MOVLW D'165' ; +1 1 cycle MOVWF DELAY ; +2 1 cycle DELAY500_LOOP DECFSZ DELAY, F ; step1 1 cycle GOTO DELAY500_LOOP ; step2 2 cycles DELAY500_END RETURN ; +3 2 cycles ;*********************************** a delay of 'W' * 500mS X_DELAY500 MOVWF X_DELAY ; +1 1 cycle X_DELAY500_LOOP CALL DELAY500 ; step1 wait 500uSec DECFSZ X_DELAY, F ; step2 1 cycle GOTO X_DELAY500_LOOP ; step3 2 cycles X_DELAY500_END RETURN ; +2 2 cycles end hinh mo_phong_LCD duoi day: thay đổi nội dung bởi: namqn, 16-04-2007 lúc 07:00 PM.  | 
| 
		 | 
	
	
	
		
		
		
		
			 
		
		
		
		
		
		
			
			
		
	 | 
| 		
			
			 | 
		#2 | 
| 
			
			
			
			 Trưởng lão PIC bang 
			
		
			
			
								
		
	 | 
	
	
	
	
		
		
		
		 Module LCD của bạn nhìn lạ lắm, không có vẻ là một module của Proteus. Bạn chọn module LM016L (trong Optoelectronics, Alphanumeric LCDs) thử xem. 
		
	
		
		
		
		
			Lần sau bạn chú ý chuyển thành tập tin dạng .gif hay .jpg trước rồi hãy gửi kèm, như vậy sẽ tiết kiệm được không gian lưu trữ và băng thông cho diễn đàn. Thân, 
				__________________ 
		
		
		
		
	
	Biển học mênh mông, sức người có hạn. Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau: http://www.picvietnam.com/forum/showthread.php?t=1263  | 
| 
		 | 
	
	
	
		
		
		
		
			 
		
		
		
		
		
		
			
			
		
	 | 
| 		
			
			 | 
		#3 | |
| 
			
			
			
			 Đệ tử 1 túi 
			
		
			
			
			Tham gia ngày: Jul 2006 
				
				
				
					Bài gửi: 19
 
				
				
				:  | 
	
	
	
	
		
			
			 Trích: 
	
  | 
|
| 
		 | 
	
	
	
		
		
		
		
			 
		
		
		
		
		
		
			
			
		
	 | 
| 		
			
			 | 
		#4 | 
| 
			
			
			
			 Trưởng lão PIC bang 
			
		
			
			
								
		
	 | 
	
	
	
	
		
		
		
		 Bạn đã xem thử ví dụ của Proteus chưa? (Ví dụ nằm trong thư mục 'Samples\PIC 4 bit LCD Driver', trong thư mục cài đặt Proteus). 
		
	
		
		
		
		
			Tôi hỏi một câu hơi thừa: Bạn biết cách nạp chương trình đã dịch vào PIC trong Proteus chứ? Bạn có mạch thật chứ? Nên thử trên mạch thật. Thân, 
				__________________ 
		
		
		
		
	
	Biển học mênh mông, sức người có hạn. Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau: http://www.picvietnam.com/forum/showthread.php?t=1263  | 
| 
		 | 
	
	
	
		
		
		
		
			 
		
		
		
		
		
		
			
			
		
	 | 
| 		
			
			 | 
		#5 | 
| 
			
			
			
			 Đệ tử 1 túi 
			
		
			
			
			Tham gia ngày: Jul 2006 
				
				
				
					Bài gửi: 19
 
				
				
				:  | 
	
	
	
	
		
			
			 em viết chương trình hiển thị chữ lên lcd bằng ngôn ngữ C và mô phỏng bằng Proteus thì nó chạy ,còn chương trình asm này thì em mô phỏng không thấy chạy ,em mắc mạch thật để kiểm tra nhiều lần vẫn không thấy có dấu hiệu gì . 
		
	
		
		
		
		
		
	
	 | 
| 
		 | 
	
	
	
		
		
		
		
			 
		
		
		
		
		
		
			
			
		
	 | 
| 		
			
			 | 
		#6 | 
| 
			
			
			
			 Trưởng lão PIC bang 
			
		
			
			
								
		
	 | 
	
	
	
	
		
		
		
		 Bạn thử hình dung tình huống module LCD của bạn được khởi tạo mặc định là giao tiếp ở chế độ 4-bit sau khi bật nguồn. Khi đó phần mã thiết lập chế độ 8-bit của bạn ở trên có ổn không? Ngay cả giao tiếp mặc định là 8-bit sau khi bật nguồn thì phần code của bạn vẫn không ổn. 
		
	
		
		
		
		
			Các trình biên dịch ngôn ngữ cấp cao thường thực hiện thiết lập một cách tổng quát, không phụ thuộc vào chế độ giao tiếp mặc định khi bật nguồn của module LCD. Bạn có thể xem thử code hợp ngữ được sinh ra cho chương trình C của bạn để biết họ khởi tạo module ra sao. Bạn nên tìm đọc datasheet của HD44780 (đa số chip điều khiển LCD ký tự là tương thích với HD44780), trong đó bạn sẽ thấy quy trình khởi tạo LCD, và sẽ thấy chỗ không ổn trong phần code của bạn. Thân, 
				__________________ 
		
		
		
		
		
			Biển học mênh mông, sức người có hạn. Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau: http://www.picvietnam.com/forum/showthread.php?t=1263 thay đổi nội dung bởi: namqn, 13-05-2007 lúc 11:33 PM.  | 
| 
		 | 
	
	
	
		
		
		
		
			 
		
		
		
		
		
		
			
			
		
	 | 
| 		
			
			 | 
		#7 | 
| 
			
			
			
			 Nhập môn đệ tử 
			
		
			
				
			
			
			Tham gia ngày: Jun 2006 
				
				
				
					Bài gửi: 10
 
				
				
				:  | 
	
	
	
	
		
		
		
		 ôi quả thực là nhìn vào chương trình LCD của bạn chả ổn tí nào.Thực ra viết cho LCD đơn giản hơn ,mà bạn viết hơi rối nên khó đọc . Có lẽ bạn nên sắp xếp lại cho gọn hơn thì dễ tra lỗi hơn nhiều 
		
	
		
		
		
		
			
				__________________ 
		
		
		
		
	
	Lưu Diệc Phi - My Love  | 
| 
		 | 
	
	
	
		
		
		
		
			 
		
		
		
		
		
		
			
			
		
	 | 
| 		
			
			 | 
		#8 | 
| 
			
			
			
			 Nhập môn đệ tử 
			
		
			
			
			Tham gia ngày: Apr 2007 
				
				
				
					Bài gửi: 10
 
				
				
				:  | 
	
	
	
	
		
		
		
		 anh namdinhno1 có thể post lên code phần khởi tạo cho LCD được không?em  chưa hiểu rõ lắm về lập trình hiển thị trên LCD, muốn tìm hiểu mà khó quá! 
		
	
		
		
		
		
		
	
	 | 
| 
		 | 
	
	
	
		
		
		
		
			 
		
		
		
		
		
		
			
			
		
	 | 
| 		
			
			 | 
		#9 | 
| 
			
			
			
			 Nhập môn đệ tử 
			
		
			
			
			Tham gia ngày: Apr 2007 
				
				
				
					Bài gửi: 10
 
				
				
				:  | 
	
	
	
	
		
			
			 
				
				Bắt đầu tìm hiểu LCD
			 
			Theo như bác namqn chỉ dẫn, em đã load datasheet HD44780 về, có đoạn viết trong ảnh em gửi kèm. 
		
	
		
		
			Cho em hỏi, Khi viết code thì chỉ cần làm theo các bước như trên hay còn phải khai báo thêm thủ tục gì nữa? Mong mọi người giúp đỡ  | 
| 
		 | 
	
	
	
		
		
		
		
			 
		
		
		
		
		
		
			
			
		
	 | 
| 		
			
			 | 
		#10 | |
| 
			
			
			
			 Đệ tử 1 túi 
			
		
			
			
			Tham gia ngày: Jul 2006 
				
				
				
					Bài gửi: 19
 
				
				
				:  | 
	
	
	
	
		
			
			 Trích: 
	
 chương trình ở đây Code: 
	 #include <p16f877a.inc>
;========================== Hien thi ra LCD
;===== Port B = D7 ... D0
;===== RE0->RS; RE1->RW; RE2->E
  cblock	0X020
	        count		
                     delay
        	        x_delay
  endc
       
;==========================
org		0X00
GOTO                  MAIN
MAIN
		bsf		    STATUS,RP0	; chon bank 1
		movlw		0x00
		movwf		TRISE
		movwf		TRISB
        MOVLW        0X83
        MOVWF        ADCON1              ;cac ngo dieu khien la digital
        bcf	             STATUS,RP0	; chon bank 0		
		clrf		PORTE
		clrf		PORTB
		call		dl100ms
		call		dl100ms
        call		dl100ms
		
;==========================
start		
        call		lcdinit
        call		dl100ms
       	
;==========================
        call		line1
        call             line2   
        call             dl100ms
        call             dl100ms
        goto            $
;==========================
line1
		movlw		081h                ;dinh dia chi
		call		address
		call		st_line1
		return
;==========================
line2
		movlw		0c7h                ;dinh dia chi
		call		address
		call		st_line2
		return
;==========================
st_line1
		clrf		count
		bcf		    STATUS,2
display1
		movf		count,0
		call		text1
		xorlw		0x00
		btfsc		STATUS,2
		goto		exit1
		call		display_lcd
		incf		count,1
		goto		display1
exit1
		bcf		    STATUS,2
		return
;==========================
st_line2
		clrf		count
		bcf		    STATUS,2
display2
		movf		count,0
		call		text2
		xorlw		0x00
		btfsc		STATUS,2
		goto		exit2
		call		display_lcd
		incf		count,1
		goto		display2
exit2
		bcf		    STATUS,2
		return
;==========================HIEN THI KI TU
display_lcd
        
        
		bsf		    PORTE,2    ;set E
		nop
		nop
		bsf		    PORTE,0    ;set RS
		bcf		    PORTE,1    ;clr RW
		movwf		    PORTB      
                          call		    dl2ms
		bcf		    PORTE,2    ;clr E
		nop
		nop
		bcf		    PORTE,0    ;clr RS
		call		    dl100ms
		return
;==========================KHOI TAO LCD
lcdinit
		bsf		    PORTE,2    ;set RS
		nop
		nop
		bcf		    PORTE,0    ;clr RS
		bcf		    PORTE,1    ;clr RW 
		movlw		    38h                ;8 bits,2 lines
		movwf		    PORTB
       	             call		    dl2ms
		bcf		    PORTE,2    ;clr E
		call		    dl05ms
        		;=================
		bsf		    PORTE,2     
		nop
		nop
		bcf		    PORTE,0
		bcf		    PORTE,1
		movlw		    0eh                  ;display on, cursor underline on,cursor blink off
		movwf		    PORTB
		call		    dl2ms
     	             bcf		    PORTE,2
		call		    dl05ms
        ;=================
                          call		clrscr
		bsf		    PORTE,2
		nop
		nop
		bcf		    PORTE,0
		bcf		    PORTE,1
		movlw		    06h               ;increment,display shift off
		movwf		    PORTB
       	             call		    dl2ms
		bcf		    PORTE,2
		call		    dl05ms 
                          return
;========================== XOA MAN HINH
clrscr
		bsf		    PORTE,2       ;set E
		nop
		nop
		bcf		    PORTE,0       ;clr RS
		bcf		    PORTE,1       ;clr RW
		movlw		    01h
		movwf		    PORTB
		call		    dl2ms       ;2mS
		bcf		    PORTE,2
		call		    dl05ms         ;05mS
		return
		;=================
;============================GUI DIA CHI
address 
       
		bsf		    PORTE,2       ;set E
		nop			          		
		nop
		bcf		    PORTE,0       ;clr RS
                          bcf		    PORTE,1       ;clr RW
		movwf		    PORTB
                          call		    dl100ms
                          bcf		    PORTE,2       ;clr E
       	             call		    dl05ms
       	             return
		
;******************************************delay 0.5ms = 500uS
dl05ms
   	       movlw       D'165'              ; +1        1 cycle
   	       movwf       delay               ; +2        1 cycle
delay500_loop
   	       decfsz      delay, F            ; step1     1 cycle
   	       goto        delay500_loop       ; step2     2 cycles
                    delay500_end
   	       return                          ; +3        2 cycles
;***********************************  delay 100ms
dl100ms
                    movlw       D'200'              ; +1        1 cycle
   	       movwf       x_delay            ; +1        1 cycle
x_delay500_loop
   	       call        dl05ms            ; step1     wait 500uSec
   	       decfsz      x_delay, F          ; step2     1 cycle
   	       goto        x_delay500_loop     ; step3     2 cycles
                    x_delay500_end
   	       return                          ; +2        2 cycles
;*********************************** delay 2ms
dl2ms
                    movlw       D'4'              ; +1        1 cycle
   	       movwf       x_delay            ; +1        1 cycle
x_delay500_loop1
   	       call        dl05ms            ; step1     wait 500uSec
   	       decfsz      x_delay, F          ; step2     1 cycle
   	       goto        x_delay500_loop1     ; step3     2 cycles
                    x_delay500_end1
   	       return
;========================== 
text1
		addwf		02h,1
		retlw		'N'
		retlw		'H'
		retlw		'I'
		retlw		'E'
		retlw		'T'
		retlw		' '
		retlw		'D'
		retlw		'O'
                          retlw		' '
		retlw		'P'
		retlw		'H'
		retlw		'O'
		retlw		'N'
    	             retlw		'G'
                         retlw		 0
text2
		addwf		02h,1
		retlw		'3'
		retlw		'0'
    	             retlw		0x0df
		retlw		'C'
                          retlw		 0
     	        ;==========================	
END
thay đổi nội dung bởi: namqn, 12-05-2007 lúc 06:52 PM.  | 
|
| 
		 | 
	
	
	
		
		
		
		
			 
		
		
		
		
		
		
			
			
		
	 | 
| 		
			
			 | 
		#11 | 
| 
			
			
			
			 Trưởng lão PIC bang 
			
		
			
			
								
		
	 | 
	
	
	
	
		
		
		
		 Trình tự khởi tạo LCD ở chế độ giao tiếp 8-bit (theo datasheet của HD44780): 
		
	
		
		
		
		
			- Bật nguồn, chờ 15 ms sau khi nguồn đạt 4.5 V - Ghi lệnh 0x3x ra LCD (chưa dùng BF được) - Chờ 4.1 ms - Ghi lệnh 0x3x ra LCD (chưa dùng BF được) - Chờ 100 us - Ghi lệnh 0x3x ra LCD (chưa dùng BF được) - Ghi lệnh b'0011NFxx' ra LCD (chưa dùng BF được) - Ghi lệnh tắt màn hình (chưa dùng BF được) - Ghi lệnh xóa màn hình (chưa dùng BF được) - Ghi lệnh thiết lập cách nhập dữ liệu (chưa dùng BF được) - Kết thúc quá trình khởi tạo Từ đây trở đi có thể dùng BF. Code của bạn chưa thực hiện quá trình khởi tạo này cho LCD. Nếu bạn thực hiện đầy đủ những thao tác này mà LCD vẫn không làm việc thì bạn có thể: - Yêu cầu tôi gửi file .hex để bạn thử module - Tìm xem chip điều khiển của module thực sự là chip gì, và tìm datasheet của nó. Thân, 
				__________________ 
		
		
		
		
	
	Biển học mênh mông, sức người có hạn. Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau: http://www.picvietnam.com/forum/showthread.php?t=1263  | 
| 
		 | 
	
	
	
		
		
		
		
			 
		
		
		
		
		
		
			
			
		
	 | 
| 		
			
			 | 
		#12 | |
| 
			
			
			
			 Đệ tử 1 túi 
			
		
			
			
			Tham gia ngày: Jul 2006 
				
				
				
					Bài gửi: 19
 
				
				
				:  | 
	
	
	
	
		
			
			 Trích: 
	
  | 
|
| 
		 | 
	
	
	
		
		
		
		
			 
		
		
		
		
		
		
			
			
		
	 | 
| 		
			
			 | 
		#13 | 
| 
			
			
			
			 Đệ tử 1 túi 
			
		
			
			
			Tham gia ngày: Jul 2006 
				
				
				
					Bài gửi: 19
 
				
				
				:  | 
	
	
	
	
		
			
			 anh namqn oi,em đã khởi tạo thêm các lệnh như anh đã nói và không kiểm tra cờ bận mà chỉ dùng delay thôi nhưng nó vẫn không chạy ,à ghi lệnh b'0011NF00' ra lcd không dùng được vì nó không phải là số nhị phân. 
		
	
		
		
		
		
		
	
	 | 
| 
		 | 
	
	
	
		
		
		
		
			 
		
		
		
		
		
		
			
			
		
	 | 
| 		
			
			 | 
		#14 | |
| 
			
			
			
			 Trưởng lão PIC bang 
			
		
			
			
								
		
	 | 
	
	
	
	
		
		
		
		 Trích: 
	
 Bạn định nghĩa 'không chạy' như thế nào? Nếu bạn chưa thực hiện đặt font và số dòng thì liệu LCD có hiển thị đúng những gì bạn muốn không? Tôi thấy bạn hỏi lung tung mọi chỗ, nhưng không biết bạn đã thử tutorial về LCD của Nigel Goodwin chưa? Thân, 
				__________________ 
		
		
		
		
	
	Biển học mênh mông, sức người có hạn. Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau: http://www.picvietnam.com/forum/showthread.php?t=1263  | 
|
| 
		 | 
	
	
	
		
		
		
		
			 
		
		
		
		
		
		
			
			
		
	 | 
| 		
			
			 | 
		#15 | 
| 
			
			
			
			 Trưởng lão PIC bang 
			
		
			
			
								
		
	 | 
	
	
	
	
		
		
		
		 Về mạch thử nghiệm thực tế của bạn: 
		
	
		
		
		
		
			- Bạn đang dùng thạch anh tần số bao nhiêu? - Bạn đã xác định là mạch chạy tốt bằng một ví dụ nháy LED chứ? Thân, 
				__________________ 
		
		
		
		
	
	Biển học mênh mông, sức người có hạn. Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau: http://www.picvietnam.com/forum/showthread.php?t=1263  | 
| 
		 | 
	
	
	
		
		
		
		
			 
		
		
		
		
		
		
			
			
		
	 | 
![]()  | 
	
	
		
		
  | 
	
		
  |