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 16-04-2007, 12:48 PM   #1
friends
Đệ tử 1 túi
 
Tham gia ngày: Jul 2006
Bài gửi: 19
:
Thumbs up Lcd

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:
Hình Kèm Theo
File Type: gif mo_phong_LCD.gif (8.2 KB, 713 lần tải)

thay đổi nội dung bởi: namqn, 16-04-2007 lúc 07:00 PM.
friends vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 16-04-2007, 07:03 PM   #2
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
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
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 26-04-2007, 07:59 PM   #3
friends
Đệ tử 1 túi
 
Tham gia ngày: Jul 2006
Bài gửi: 19
:
Thumbs up lcd_tiep

Trích:
Nguyên văn bởi namqn View Post
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.
friends vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 26-04-2007, 08:11 PM   #4
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 đã 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
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 28-04-2007, 10:53 AM   #5
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 đã 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ì .
friends vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 28-04-2007, 08:18 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
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 30-04-2007, 11:10 AM   #7
namdinhno1
Nhập môn đệ tử
 
namdinhno1's Avatar
 
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
namdinhno1 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 06-05-2007, 10:39 PM   #8
atclub
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á!
atclub vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 06-05-2007, 11:08 PM   #9
atclub
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 đỡ
Hình Kèm Theo
File Type: gif aa.GIF (19.9 KB, 31 lần tải)
atclub 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:40 PM   #10
friends
Đệ tử 1 túi
 
Tham gia ngày: Jul 2006
Bài gửi: 19
:
rồi em đã thử mạch với led và chạy tốt,thạch anh em dùng là 4meg
friends vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 15-05-2007, 01:37 AM   #11
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
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,
File Kèm Theo
File Type: zip LCD_8bit.zip (735 Bytes, 204 lần tải)
__________________
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, 15-05-2007 lúc 08:19 PM.
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 16-05-2007, 04:33 PM   #12
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
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 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 16-05-2007, 06:19 PM   #13
friends
Đệ tử 1 túi
 
Tham gia ngày: Jul 2006
Bài gửi: 19
:
Thumbs up lcd

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.

Code:
#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

thay đổi nội dung bởi: namqn, 16-05-2007 lúc 07:22 PM.
friends vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 16-05-2007, 07:49 PM   #14
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
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:
Code:
	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,
__________________
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 17-05-2007, 09:32 AM   #15
zero
Đệ tử 4 túi
 
Tham gia ngày: Feb 2007
Bài gửi: 87
:
Send a message via Yahoo to zero
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 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:02 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