PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > MPASM

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

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 ...

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 28-04-2007, 08:18 PM   #1
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
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.
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 12-05-2007, 06:37 PM   #2
friends
Đệ tử 1 túi
 
Tham gia ngày: Jul 2006
Bài gửi: 19
:
Thumbs up lcd_gui anh namqn

Trích:
Nguyên văn bởi namqn View Post
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 từ 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,
anh namqn ơi ,dưới đây là chương trình khác viết về hiển thị lcd bằng hợp ngữ nhưng em không đọc cờ bận nữa mà dùng chương trình delay để chờ,chương trình này nhìn chắc có lẽ dể hiểu hơn ,em đã mô phỏng bằng protues và nó đã chạy nhưng em mắc mạch thực tế thì nó vẩn không chạy ,hình như lcd chưa nhận được dữ liệu thì phải, em có gửi sơ đồ mạch mô phỏng ở dưới dây ,và sơ đồ mắc thực tế cũng tương tự nhưng em dùng LCD loại TC1602C (con này có thêm 2 chân để thắp sáng đèn nền). Em có thử dùng thêm điện trở thanh 4k7 ở portB kéo lên cao thế mà vẫn không thấy nó chạy ,anh xem dùm em chương trình xem nó bị lỗi chổ nào mà không chạy ,có cần phải chỉnh sửa delay ở chổ nào để khi mắc mạch thực tế lcd đáp ứng được ,anh biết thì chỉ dùm em cái ,chứ giờ em bó tay luôn rồi .

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
Hình Kèm Theo
File Type: jpg LCD.JPG (46.0 KB, 591 lần tải)

thay đổi nội dung bởi: namqn, 12-05-2007 lúc 06:52 PM.
friends vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 12-05-2007, 07:05 PM   #3
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
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
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 13-05-2007, 09:42 AM   #4
friends
Đệ tử 1 túi
 
Tham gia ngày: Jul 2006
Bài gửi: 19
:
Thumbs up lcd

Trích:
Nguyên văn bởi namqn View Post
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,
anh namqn oi ,chương trình trên em khởi tạo thêm những thông số anh đã nói ở trên và em không dùng cờ bận để kiểm tra mà dùng delay như trên để chờ có được không? ah anh hay ai đó đã viết hợp ngữ cho pic (giao tiếp 8 đường) để hiển thị lên lcd mà mắc mạch thực đã chạy rồi không ,nếu có ,có thể cho em xin để tham khảo thêm không ?em thấy viết bằng hợp ngữ này khó chạy quá ,phải thiết lập nhiều thông số quá .
friends vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 13-05-2007, 08:13 PM   #5
friends
Đệ tử 1 túi
 
Tham gia ngày: Jul 2006
Bài gửi: 19
:
Thumbs up lcd

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.
friends vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 13-05-2007, 11:23 PM   #6
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi friends View Post
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.
Bạn phải tự đặt N và F theo yêu cầu của bạn chứ. Tôi chỉ ghi format của nó ra thôi (nếu bạn vẫn không biết phải đặt N và F bằng bao nhiêu thì đây: N=1: hiển thị 2 dòng, N=0: hiển thị 1 dòng, F=1: dùng font 5x10, F=0: dùng font 5x8).

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
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 13-05-2007, 11:55 PM   #7
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
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
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 14-05-2007, 09:21 PM   #8
friends
Đệ tử 1 túi
 
Tham gia ngày: Jul 2006
Bài gửi: 19
:
Thumbs up lcd

Trích:
Nguyên văn bởi namqn View Post
Bạn phải tự đặt N và F theo yêu cầu của bạn chứ. Tôi chỉ ghi format của nó ra thôi (nếu bạn vẫn không biết phải đặt N và F bằng bao nhiêu thì đây: N=1: hiển thị 2 dòng, N=0: hiển thị 1 dòng, F=1: dùng font 5x10, F=0: dùng font 5x8).

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,
à thì ra là cái đó , em đã đặt nó rồi ,đó là bắt buộc khi giao tiếp với lcd, bài gửi trên đã thiết lập đầy đủ: giao tiếp 8 đường (0x38),hiển thị 2 dòng ,xóa màn hinh (0x01),hiển thị,dịch...chỉ thiếu thiết lập thêm 3 lệnh như anh đã trình bày (0x30) lệnh này thì em không hiểu nó để làm gì,em đã đoc datasheet của nó nhưng nó không nói về việc khởi tạo lệnh này để làm gì,
tutorial đó em chưa thử (những bài viết đó chỉ giao tiếp 4 đường),em có thử một số file.hex dịch từ c nhưng nó vẫn không chạy (mà các chương trình này mô phỏng thì chạy).
nó không chạy vì em thấy khi cấp nguồn chỉ xuất hiện ở các địa chỉ ở hàng dưới những ma trận điểm 5x8.còn hàng trên trắng xóa không có hiển thị gì hết.

thay đổi nội dung bởi: namqn, 15-05-2007 lúc 01:18 AM.
friends vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 06-08-2007, 09:26 AM   #9
Jerry
Đệ tử 5 túi
 
Jerry's Avatar
 
Tham gia ngày: Sep 2006
Bài gửi: 101
:
Trích:
Nguyên văn bởi namqn View Post
Bạn phải tự đặt N và F theo yêu cầu của bạn chứ. Tôi chỉ ghi format của nó ra thôi (nếu bạn vẫn không biết phải đặt N và F bằng bao nhiêu thì đây: N=1: hiển thị 2 dòng, N=0: hiển thị 1 dòng, F=1: dùng font 5x10, F=0: dùng font 5x8).

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,
Gửi bạn Nam
Như bạn nói ở trên thì N=1: hiển thị 2 dòng, N=0: hiển thị 1 dòng, F=1: dùng font 5x10, F=0: dùng font 5x8). Vậy tôi muốn hỏi nếu hiển thị 4 dòng thì N = bao nhiêu? Tôi đọc trong tài liệu chỉ thấy nói đến hiển thị 1 dòng và 2 dòng thôi, còn số dòng lớn hơn thì không thấy đề cập đến. Tôi đang viết chương trình điều khiển LCD 4 dòng, 16 ký tự, font 5x8, điều khiển 4 bit. Vậy con số cụ thể để khởi tạo cho LCD sẽ là bao nhiêu? Rất mong bạn trả lời sớm.
Jerry vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 01:16 PM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam