PDA

View Full Version : Lcd


friends
16-04-2007, 12:48 PM
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!

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:

namqn
16-04-2007, 07:03 PM
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,

friends
26-04-2007, 07:59 PM
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,

anh oi, em thay chữ RETURN của LCDINIT ở trên bẳng chữ " GOTO $ " và thay LCD đó bẳng LM016L mà mô phỏng cũng không chạy ,anh hay mọi người thử xem lại kĩ dùm em cái nha, em đã mất nhiều thời gian để kiểm tra nó mà cũng không thấy chạy (có thể nó có liên quan tới delay không?),làm cho em không thể lập trình được các phần khác.

namqn
26-04-2007, 08:11 PM
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,

friends
28-04-2007, 10:53 AM
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,

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

namqn
28-04-2007, 08:18 PM
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,

namdinhno1
30-04-2007, 11:10 AM
ô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

atclub
06-05-2007, 10:39 PM
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á!

atclub
06-05-2007, 11:08 PM
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 đỡ

friends
12-05-2007, 06:37 PM
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

#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

namqn
12-05-2007, 07:05 PM
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,

friends
13-05-2007, 09:42 AM
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
13-05-2007, 08:13 PM
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.

namqn
13-05-2007, 11:23 PM
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,

namqn
13-05-2007, 11:55 PM
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,

friends
14-05-2007, 09:21 PM
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.

friends
14-05-2007, 09:40 PM
rồi em đã thử mạch với led và chạy tốt,thạch anh em dùng là 4meg

namqn
15-05-2007, 01:37 AM
Chuỗi 3 lệnh 0x3x là dùng để thực hiện reset bộ điều khiển của LCD. Khi bật nguồn lên mà LCD không tự thực hiện reset thì cần dùng chuỗi lệnh đó để kích hoạt quá trình reset của LCD.

Dựa vào mô tả cấu hình phần cứng của bạn trong các mã nguồn đã post lên, tôi đã dịch một chương trình nhỏ để bạn thử module LCD của bạn. PortB dùng cho D0..D7, các chân RE0..RE2 dùng cho RS, RW, và E như bạn đã mô tả. PIC dùng cấu hình XT với thạch anh 4 MHz. Mã .hex được gửi kèm (chương trình đã được thử nghiệm với cấu hình phần cứng trên).

Thân,

friends
16-05-2007, 04:33 PM
Chuỗi 3 lệnh 0x3x là dùng để thực hiện reset bộ điều khiển của LCD. Khi bật nguồn lên mà LCD không tự thực hiện reset thì cần dùng chuỗi lệnh đó để kích hoạt quá trình reset của LCD.

Dựa vào mô tả cấu hình phần cứng của bạn trong các mã nguồn đã post lên, tôi đã dịch một chương trình nhỏ để bạn thử module LCD của bạn. PortB dùng cho D0..D7, các chân RE0..RE2 dùng cho RS, RW, và E như bạn đã mô tả. PIC dùng cấu hình XT với thạch anh 4 MHz. Mã .hex được gửi kèm (chương trình đã được thử nghiệm với cấu hình phần cứng trên).

Thân,

cảm ơn anh nhiều nha ,em thử về kiểm tra mạch xem sao ,em báo cáo lại sau.

friends
16-05-2007, 06:19 PM
anh nampn oi ,em đã về thử module lcd rồi ,nó vẩn thế không có chạy .em đã cắm vào board khác thạch anh mới ,tụ mới 33pf và nạp cho 2 con pic file.hex của anh đưa để thay đổi kiểm tra mà vẩn không chạy .em có thử kiểm tra chương trình chớp tắt ở chân RB0 100ms hay 800ms cho 2 con pic của em thì cũng không thấy nó chớp tắt mà cứ sáng liên tục.
những nguyên nhân đó là do đâu gây ra anh nhỉ ,mà con LCD của em mới mua được 1 tuần nên không thể cháy được (nguồn cấp 5v1) em có mượn lcd của đứa bạn loại gì đó cũng có mã số 1602 và có 16 chân để thử mà vẩn không thấy chạy ,hay là do mạch nạp nạp sai giá trị ,hay do 2 con pic16f877a bị hỏng ở bộ dao động (mà bị hỏng sao lại vẫn nạp chương trình được).

dưới đây là chương trình đơn giản chớp tắt 100ms hay 800ms (thạch anh 4 mhz ,em có thay đổi cấu hình bit ở các tần số dao động RS,_XT_OSC,_HS_OSC để kiểm tra )và kết quả thu được như em đã nói ở trên.
anh xem và có thể kết luận được nguyên nhân do đâu không.

#include<p16f877a.inc> ;chen thu vien lien ket cho chuong trinh
__CONFIG 3F71H
ERRORLEVEL -302
;su duing thach anh 4mhz,led nhap nhay tren chan RB0
cblock
delay
x_delay
endc
org 00h
goto START
START

clrf PORTB
bcf STATUS,RP1
bsf STATUS,RP0 ;chon bank1
movlw D'0'
movwf TRISB

bcf STATUS,RP0

SS
bsf PORTB,0
call dl100ms

bcf PORTB,0
call dl100ms

goto SS
;******************************************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

end

namqn
16-05-2007, 07:49 PM
Phía sau cblock phải có một hằng số, đó là hằng số đầu tiên được gán cho chuỗi hằng số nằm giữa cblock ... endc. Một ví dụ cho việc dùng cblock:
cblock 0x20
cnt1
cnt2
tmp
endc


Theo những gì bạn mô tả, tôi cho là mạch ứng dụng của bạn không làm việc. Nhận định bộ dao động của PIC không hỏng vì vẫn nạp được chương trình là không đúng. Khi nạp chương trình, PIC lấy clock từ chân PGC cho các phần mạch dịch và đồng bộ dữ liệu, còn khi chạy chương trình thì bộ dao động cung cấp xung clock cho lõi xử lý và các ngoại vi. Tôi đã gặp trường hợp chip vẫn có thể nhận dạng, và nạp chương trình, nhưng nó hoàn toàn không thể chạy chương trình đã được nạp.

Tôi cũng có dùng một module LCD mã hiệu TC1602A, và nó dùng bộ điều khiển tương thích với HD44780.

Bạn kiểm tra lại mạch ứng dụng của bạn đi, nếu bạn không rõ mạch ứng dụng có yêu cầu tối thiểu ra sao thì cứ vẽ mạch nguyên lý mà bạn đang dùng, và post lên đây để được góp ý.

Thân,

zero
17-05-2007, 09:32 AM
có ai đã thử điều khiển LCD ở chế độ 4BIT chưa?
Nếu ai đã thử rồi thì có thể cho tôi thuật toán được ko?
VD: Cách out DATA,Contro
Nếu có Soucre thì càng tốt (C nhé vì tôi rất ghét Assembly)

zero
17-05-2007, 11:30 AM
Hiện tôi đã có thể điều khiển được LCD ở chế độ 4BIT
Tôi sẽ hoàn thành CODE hoàn chỉnh và gửi lên sau
Nói nôm na là: thay vì Out 8Bit ra ta Out lần lượt 4Bit cao trước sau đó là 4Bit thấp
VD: để out chữ A ra ta làm như sau
Vì A=&H41

E 1
RS 1
DB &H4 '4Bit cao
E 0
Pause

E 1
RS 1
DB &H1 '4Bit thap
E 0
Pause

Với lệnh điều khiển ta cũng làm tương tự tôi lấy ví dụ về hàm khởi tạo
Function Init_LCD()
RS 0
E 1
DB &H0
E 0
Pause
E 1
DB &HF
E 0
Pause

E 1
DB &H2
E 0
Pause
E 1
DB &HC
E 0
Pause

Clrscr
End Function

Trên đây là đoạn chương trình tôi viết trên VB kết nối qua LPT
Rất mong mọi người cho ý kiến

friends
17-05-2007, 02:43 PM
Phía sau cblock phải có một hằng số, đó là hằng số đầu tiên được gán cho chuỗi hằng số nằm giữa cblock ... endc. Một ví dụ cho việc dùng cblock:
cblock 0x20
cnt1
cnt2
tmp
endc


Theo những gì bạn mô tả, tôi cho là mạch ứng dụng của bạn không làm việc. Nhận định bộ dao động của PIC không hỏng vì vẫn nạp được chương trình là không đúng. Khi nạp chương trình, PIC lấy clock từ chân PGC cho các phần mạch dịch và đồng bộ dữ liệu, còn khi chạy chương trình thì bộ dao động cung cấp xung clock cho lõi xử lý và các ngoại vi. Tôi đã gặp trường hợp chip vẫn có thể nhận dạng, và nạp chương trình, nhưng nó hoàn toàn không thể chạy chương trình đã được nạp.

Tôi cũng có dùng một module LCD mã hiệu TC1602A, và nó dùng bộ điều khiển tương thích với HD44780.

Bạn kiểm tra lại mạch ứng dụng của bạn đi, nếu bạn không rõ mạch ứng dụng có yêu cầu tối thiểu ra sao thì cứ vẽ mạch nguyên lý mà bạn đang dùng, và post lên đây để được góp ý.

Thân,

anh nampn ơi,đã test file.hex của anh đưa và test nhiều lần cuối cùng cũng đã chạy ,chương trình em viết cũng đã chạy rồi ,nguyên nhân không chạy là do nút reset gắn trên chân 1 bị hỏng rồi nên mới đầu cấp nguồn bấm nút reset và do cái này không tác động nên chương trình mới vào chạy ở một địa chỉ bất kì ,do đó nó không hiển thị ,em vừa kiểm tra thấy nó chạy là em liền lên net báo cho anh biết ngay để khỏi phải làm mất thời gian của anh nữa.
cho em cám ơn an nhiều nha.

Jerry
06-08-2007, 09:26 AM
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.

namqn
06-08-2007, 06:01 PM
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.
Đó là thông tin cấu hình dành cho module có 2 dòng, với module 4 dòng thì ý nghĩa của N tất nhiên sẽ khác đi. Bạn nên tìm datasheet của module đang dùng để có thông tin chính xác hơn. Một link tham khảo để bạn thấy HD44780 có thể dùng cho các module 1-dòng, 2-dòng, và 4-dòng.

http://home.iae.nl/users/pouweha/lcd/lcd0.shtml

Thân,

Jerry
07-08-2007, 10:04 AM
Mình đã tìm datasheet và đọc rất kỹ. Tiếc là trong datasheet thường không đề cập rõ đến các vấn đề về trình tự điều khiển mà chỉ nói chung chung về chân cẳng và các thông số kỹ thuật. Tuy nhiên mình cũng đã tìm ra con số khởi tạo LCD loại 4 hàng 16 ký tự, điều khiển 4bit là 0x28, giống y như loại 2 hàng 16 ký tự. Và có 1 tài liệu giải thích là loại 4 hàng được hiểu là 2 hàng nhưng số ký tự nhiều hơn (gấp đôi), cho nên byte để khởi tạo cho 2 loại này là giống nhau.

trungduc
17-11-2008, 02:49 PM
HELP ME! HELP ME! HELP ME!

Xin chào các anh chị em PICVN.
Em đang loai hoai voi con PIC16f877A và LCD16*2 (TC1602A-01T). Lượm lặt tài liệu và code trên mạng, đến giờ đã hiểu láng máng nhưng vẫn không làm sao hiển thị được tí gì. Anh chị em nào có code đơn giản đã chạy rồi cho mình TEST thử nhé.
Thanks!!!

ketxanh
23-11-2008, 11:12 PM
HELP ME! HELP ME! HELP ME!

Xin chào các anh chị em PICVN.
Em đang loai hoai voi con PIC16f877A và LCD16*2 (TC1602A-01T). Lượm lặt tài liệu và code trên mạng, đến giờ đã hiểu láng máng nhưng vẫn không làm sao hiển thị được tí gì. Anh chị em nào có code đơn giản đã chạy rồi cho mình TEST thử nhé.
Thanks!!!

Bạn có thể tham khảo tài liệu này.Mình đã làm thực tế và chạy tốt. Chúc bạn thành công

trungduc
24-11-2008, 08:35 AM
Cảm ơn bạn rất nhiều!
Tài liệu này giúp tôi rất nhiều đây