PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Các ngôn ngữ lập trình khác (CCS C, HT PIC,...) (http://www.picvietnam.com/forum/forumdisplay.php?f=12)
-   -   CCS C for PIC16F877A (http://www.picvietnam.com/forum/showthread.php?t=357)

tranvanthuong 13-07-2007 11:33 AM

trời đất làm tui hoa cả mắt!!!

tranvanthuong 13-07-2007 11:35 AM

Trích:

Nguyên văn bởi anh_gioi (Post 10020)
kiểm tra lại hóa ra chẳng có lỗi gì cả.

tui bảo đảm với bạn với chương trình này khi lắp mạch thật thì sẽ chắc chắn mạch không chạy được bạn xem lại nhé!

anh_gioi 13-07-2007 03:07 PM

cậu nói đúng rồi!
mình lắp mạch thật mà chẳng thấy gì cả?
cậu có thể nói cho mình sai ở chỗ nào ko?
cám ơn trước nha!

anh_gioi 13-07-2007 03:12 PM

đây là đoạn mã mình cho chạy thật nhưng chẳng thấy báo gì cả:

Code:

#include "16F877A.h"
#include "C:\Documents and Settings\Administrator\Desktop\DEFS_16F877A\defs_16f877a.h"
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock = 8M)
#define RS RD0
#define RW RD1
#define E RD2
#define LCD portb
const unsigned char digital[]="TA LA VO DICH HA HA...!";
INT I=0;
//TAO HAM LENH
void commwrite(){
  RS = 0;
  RW = 0;
  E = 1;
  E = 0;
  delay_ms(100);}
 //tao ham gui du lieu
 void datawrite(){
                  RS = 1;
                  RW = 0;
                  E  = 1;
                  E  = 0;
                //  delay_ms(10);
                    }
 //ham chinh
 void main(){
        set_tris_b(0);
        set_tris_d(0);
        delay_ms(100);
       
        LCD = 0x38; //tao ma tran 5x7
        commwrite();
        LCD = 0x0c; //tat con tro,bat hien thi
        commwrite();
        LCD = 0x80; //con tro ve dong dau tien
       
        while(1){
                    LCD = digital[i];
                    datawrite();
                    delay_ms(100);
                    i++;
                    if(i ==13){ LCD = 0xc2;
                                commwrite();
                                delay_ms(100);}
                    if(i == 24){ LCD = 0x01;
                                    commwrite();
                                    delay_ms(500);
                                    LCD = 0x80;
                                    commwrite();
                                    i = 0;}
                        }
       
 }

mong mọi người xem dùm cái !

namqn: nhắc bạn một lần nữa về việc dùng các thẻ code để định dạng. Hãy xem tôi sửa post của bạn ra sao để biết cách làm.

anh_gioi 13-07-2007 10:44 PM

anh da sủa cho em đâu ạ?

namqn 13-07-2007 11:22 PM

Trích:

Nguyên văn bởi anh_gioi (Post 10045)
anh da sủa cho em đâu ạ?

Tôi sửa trong post của bạn. Khi bạn đã đăng nhập thì có thể nhấn nút edit của post đó để sửa, khi đó sẽ thấy tôi sửa nó như thế nào.

Thân,

anh_gioi 14-07-2007 10:15 AM

edit là chỉnh sửa bài của mình mà?
anh là ơn có thể xem code củ em ở cuối ạ.
hic...em mơi mua lcd mà chảng hiêrn thị được.tức quá....muốn cho cái búa..

namqn 14-07-2007 07:19 PM

Trích:

Nguyên văn bởi anh_gioi (Post 10054)
edit là chỉnh sửa bài của mình mà?
anh là ơn có thể xem code củ em ở cuối ạ.
hic...em mơi mua lcd mà chảng hiêrn thị được.tức quá....muốn cho cái búa..

Có khả năng bạn cần khởi tạo module LCD trước khi đặt chế độ hiển thị (tôi đã viết 1 lần rồi, nhưng bây giờ tìm bằng chức năng search của diễn đàn thì không ra). Tôi nói lại vậy (quy trình cho các module dùng chip điều khiển tương thích HD44780):

- Làm trễ một khoảng thời gian khi mới bật nguồn cho LCD (40 ms từ thời điểm Vdd = 2.7V, hay 15 ms từ thời điểm Vdd = 4.5V)
- Xuất lệnh 0x33 (0x30 đến 0x3F đều ok)
- Chờ khoảng 4.1 ms trở lên
- Xuất lệnh 0x33 (0x30 đến 0x3F đều ok)
- Chờ khoảng 100 us trở lên
- Xuất lệnh 0x33 (0x30 đến 0x3F đều ok)
- Xuất lệnh đặt chế độ (của bạn là 0x38)
- Xuất lệnh tắt màn hình 0x08
- Xuất lệnh xóa màn hình 0x01
- Xuất lệnh đặt chế độ nhập dữ liệu (tăng hay giảm địa chỉ, có dịch màn hình hay không)

Đó là quy trình khởi tạo cho module LCD chưa từng làm việc lần nào với vi điều khiển của bạn. Thông thường, khi module đã được khởi tạo rồi thì những lần sau bạn có thể dùng thẳng các lệnh đặt chế độ mà không cần thực hiện quy trình khởi tạo như trên.

Thân,

anh_gioi 16-07-2007 07:45 PM

cám ơn anh ạ.em đã cho hiển thị được lên LCD rùi ạ.nhưng chỉ hiển thị chữ không dấu thui,bây giờ em muốn hiển thị chữ có dấu thì làm thế nào ạ?
em cám ơn!!!!

bien_van_khat 16-07-2007 08:11 PM

Để làm chữ có dấu tối thiểu bạn phải có bộ font chữ có dấu, nhưng với LCD kiểu ký tự dạng như 16x2, 16x4 thì hiển thị chữ có dấu rất xấu.
Làm cái này trên LCD graphic tốt hơn nhiều.

anh_gioi 16-07-2007 09:15 PM

vậy bộ font này là loại bộ font nào? hiển thị xấu cũng được,chủ yếu mình muốn xem các làm như thế nào thui
(mình sử dụng 16F877A,LCD 16x2)

bien_van_khat 16-07-2007 10:56 PM

Mình ko theo dõi luồng này, nên ko chắc vấn đề này đã được đề cập hay chưa, bạn nên tìm lại trong diễn đàn, ở đây mình chỉ nói sơ qua.

Mỗi ký tự hiển thị trên lcd thường có kích thước 7 hàng x 5 cột do đó được xác định bởi 7byte, 3 bit cao nhất mỗi byte ko sử dụng. VD:
0x0E
0x0E
0x04
0x04
0x04
0x04
0x0C
Tạo thành chữ J hoa
Để có bộ font của riêng mình công việc của bạn là tìm ra các byte này ứng với mỗi ký tự. Công đoạn này tốn rất nhiều công sức nếu làm bằng tay, thường người ta dùng phần mềm, nhưng các phần mềm này lại thường ko free.

namqn 16-07-2007 11:08 PM

Trích:

Nguyên văn bởi anh_gioi (Post 10104)
vậy bộ font này là loại bộ font nào? hiển thị xấu cũng được,chủ yếu mình muốn xem các làm như thế nào thui
(mình sử dụng 16F877A,LCD 16x2)

LCD chủ yếu hiển thị bằng CGROM (Character Generator Read Only Memory), tức là bạn chỉ cần cho biết mã ASCII của ký tự, các pattern thể hiện ký tự (5x7, 5x8 hay 5x10) sẽ được lấy từ ROM. Các bộ điều khiển tương thích HD44780 cũng cho phép người dùng tự định nghĩa tối đa 8 ký tự (5x7 hay 5x8) trong vùng CGRAM (Character Generator Random Access Memory). Vùng nhớ này gồm 64 byte, chứa trực tiếp các pattern để tạo ký tự, và người dùng được phép ghi vào. Tuy nhiên, chỉ có thể vẽ thêm 8 ký tự, nên việc bạn muốn hiển thị tiếng Việt trên LCD ký tự là việc rất khó khăn và hạn chế. Nếu bạn vẫn muốn làm thì hãy tìm đọc datasheet của HD44780 và các tutorial trên mạng. Cách làm khá dài dòng nên không tiện nêu trên diễn đàn.

Một link để tham khảo:
http://deanandara.com/robots/ApuLcd.html

Thân,

anh_gioi 17-07-2007 12:02 AM

vậy nếu hiển thị trên LCD muốn dễ dàng thì em phải sử dụng lợi LCD khác a(ko phải loại 16x2)như loại mà bien_van_khat đã nói ạ.ngoài ra anh có thể nêu cho em những loại LCD lào nữa ko ạ(tất nhiên kinh phi mua LCD cũng phải rẻ ạ)

namqn 17-07-2007 01:49 AM

LCD thông thường có 2 loại khác nhau về cách thức hiện thực: LCD ký tự và LCD đồ họa. LCD ký tự có các ô định nghĩa sẵn sẽ hiển thị các ký tự nằm trong bộ ROM ký tự hay vài ký tự do người dùng định nghĩa. LCD đồ họa cho phép bạn vẽ (hiển thị) bất kỳ điểm ảnh nào, nó cũng có chế độ hiển thị ký tự. Tất nhiên LCD đồ họa thì giao tiếp phức tạp hơn và cũng đắt tiền hơn. Bạn nên dùng LCD ký tự khi mới làm quen với LCD, sau đó có nhu cầu thì chuyển sang LCD đồ họa. LCD đồ họa gần gũi nhất là các màn hình tại các quầy counter tính tiền của siêu thị, các màn hình trong các máy trò chơi bỏ túi, ...

Thân,


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

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam