![]() |
|
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 |
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. |
![]() |
![]() |
![]() |
#2 | |
Đệ 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. |
|
![]() |
![]() |
![]() |
#3 |
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 |
![]() |
![]() |
![]() |
#4 | |
Đệ tử 1 túi
Tham gia ngày: Jul 2006
Bài gửi: 19
: |
![]() Trích:
|
|
![]() |
![]() |
![]() |
#5 |
Đệ 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.
|
![]() |
![]() |
![]() |
#6 | |
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 |
|
![]() |
![]() |
![]() |
#7 |
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 |
![]() |
![]() |
![]() |
#8 | |
Đệ tử 1 túi
Tham gia ngày: Jul 2006
Bài gửi: 19
: |
![]() Trích:
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. |
|
![]() |
![]() |
![]() |
#9 | |
Đệ tử 5 túi
Tham gia ngày: Sep 2006
Bài gửi: 101
: |
Trích:
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. |
|
![]() |
![]() |
![]() |
|
|