10-04-2008, 10:52 PM | #1 |
Nhập môn đệ tử
Tham gia ngày: Sep 2007
Bài gửi: 9
: |
Hiện thị LCD bị sai?
Em viết chương trình đơn giản để hiện thị LCD, nhưng ko hiểu sao hiển thị ko như ý muốn, ko biết sai ở đâu. Các bác giúp em mới. Chương trình ko lỗi nhưng hiển thị các số bị lỗi. Em mới học nên cũng ko biết dùng debug, tìm trong diễn đàn mãi ko thấy, bác cho em xin link hướng dẫn debug ccs với ạ.
Code:
#include <16F877a.h> #fuses HS,NOWDT,NOPROTECT,NOLVP #use delay(clock=20000000)//xung thach anh #use rs232(baud=9600,parity=n,xmit=pin_C6,rcv=pin_C7)//khai bao che do hoat dong cua 16F877A //Day la DK LCD chuyen dung cho 16F877A //Voi cac qui dinh chan nhu sau // Data out=PortB // D0=RS // D1=RW // D2=E // trinh tu lam viec // 1)KhoiDong() // 2)DieuKhien(Malenh) // 3)GiuLieu(Code) byte i; int8 a[8]; void DieuKhien(Byte Ma_Lenh) { Output_B (Ma_lenh); //Xuet ma lenh Output_low(pin_D5); //Dat Rs=0 cho xuat lenh Output_low(pin_D6); //R\W=0 de ghi du lieu toi LCD output_high(pin_D7); Output_low(pin_D7); //;Dat E=0 chot du lieu Delay_ms(10); } void KhoiDong() { DieuKhien(0x38); DieuKhien(0x0e); DieuKhien(0x01); DieuKhien(0x06); DieuKhien(0x80); } void GiuLieu(byte Code) { Output_B (Code); //Xuat ma lenh output_high(pin_D5); //Dat Rs=1 xua du lieu Output_low(pin_D6); //R\W=0 de ghi du lieu toi LCD output_high(pin_D7); Output_low(pin_D7); //Dat E=0 chot du lieu Delay_ms(100); } void Trabang (byte x) { byte y,; for (i=1;i<=8;i++) { y = x/(2^(8-i)); / dịch 8-i bit y = y&&1; /lấy bit thấp nhất if (y == 1) a[i] = 49; /gui ra LCD hien so 1 if (y == 0) a[i] = 48; /LCD hien so 0 } } Void Main() { KhoiDong(); Trabang(0); for (i=1;i<=8;++i) { GiuLieu(a[i]); } } thay đổi nội dung bởi: namqn, 11-04-2008 lúc 12:16 AM. |
11-04-2008, 12:22 AM | #2 |
Trưởng lão PIC bang
|
Bạn muốn kết quả được hiển thị như thế nào, và thực tế thì LCD hiển thị ra sao? Bạn đưa thêm thông tin thì sẽ thu hẹp phạm vi tìm lỗi, những người khác có thể giúp bạn nhanh hơn.
Bạn nên xem thử luồng nằm ở link trong chữ ký của tôi, để đặt vấn đề hiệu quả hơ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 |
11-04-2008, 01:16 AM | #3 |
Nhập môn đệ tử
Tham gia ngày: Sep 2007
Bài gửi: 9
: |
Em muốn hiển thị một số nhị phân 8 bit lên LCD, nên làm như sau: trabang (byte x): mục đích là chuyển từng bit của x thành từng phần tử của mảng 8 phần tử, sau đó hiển thị từng phần tử đó. Với x=255, hiển thị là 11111111 (đúng) nhưng với các số khác thì sai hết cả. Dò mãi mà ko biết lỗi ở đâu? Cảm ơn bác nhiều.
|
11-04-2008, 02:04 AM | #4 |
Trưởng lão PIC bang
|
Như vậy có lẽ hàm trabang() của bạn có vấn đề. Thực ra để chuyển dữ liệu binary thành một chuỗi để hiển thị thì không cần làm cầu kỳ như bạn.
Bạn chỉ cần khai báo một bảng mặt nạ như sau: Code:
byte const mask[8] = {1, 2, 4, 8, 16, 32, 64, 128}; Code:
for (i=0; i<=8; i++) { if (x & mask[i]) a[i] = '1'; else a[i] = '0'; } 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 |
12-04-2008, 12:16 AM | #5 |
Nhập môn đệ tử
Tham gia ngày: Sep 2007
Bài gửi: 9
: |
Em hiểu ý bác rồi, em làm được rồi, thank you ever so much.
|
17-04-2008, 09:43 AM | #6 |
Nhập môn đệ tử
Tham gia ngày: Feb 2008
Bài gửi: 3
: |
các bạn ah. Tớ đang muốn hiển thị giá trị điện áp đọc ra từ ADC ra LCD nhưng đang gặp 1 vấn đề là mình không biết hiển thị số dấu phẩy động thế nào: Ví dụ:mình cần hiển thị 5,15 thì mình mới hiển thị được số 5 thôi. Có bạn nào biết thì chỉ mình với nhé
|
17-04-2008, 07:30 PM | #7 | |
Trưởng lão PIC bang
|
Trích:
1. Hiển thị phần nguyên 2. Hiển thị dấu "," (hay dấu ".", nếu muốn dùng kiểu Anh Mỹ) 3. Lấy phần thập phân (bằng biểu thức: value - floor(value)) 4. Nhân phần thập phân với 100 (hay 1000) để có 2 chữ số (3 chữ số) được hiển thị (ở dạng số nguyên) 5. Hiển thị tiếp 2 (hay 3) chữ số đó 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 |
|
17-04-2008, 09:20 PM | #8 | |
Đệ tử 3 túi
Tham gia ngày: Nov 2007
Nơi Cư Ngụ: Vietnam
Bài gửi: 48
: |
Trích:
Xin chào, namqn xem lại có được không: for (i=0; i<=8; i++)... --> i = 0, 1, 2, 3, 4, 5, 6, 7, 8 --> 9 bits đúng ra phải là: for (i=0; i<8; i++) Và nữa, đoạn code trên sẽ tạo chuỗi có LSB trước MSB(?) Có thể thực hiện đơn giản hơn như sau không: Code:
for (i=0; i<8; i++) { if (x & (0x80 shr i)) a[i] = '1'; else a[i] = '0'; }
__________________
More friends more foods thay đổi nội dung bởi: kimhuynguyen, 17-04-2008 lúc 09:44 PM. Lý do: Sửa sai lỗi username namqn |
|
17-04-2008, 09:37 PM | #9 |
Trưởng lão PIC bang
|
Đúng vậy, for (i=0; i<8; i++) thì mới đúng. Tôi đã không kiểm tra cận.
Code đúng là tạo ra LSB nằm trước MSB, nhưng có thể in MSB trước hay sau đều được, tùy vào đoạn code in dữ liệu thôi. Tôi chỉ gợi ý cách giải quyết yêu cầu của thuật toán, còn thuật toán là do tác giả chọn. Việc chọn lựa giữa Code:
if (x & (0x80 shr i)) a[i] = '1'; else a[i] = '0'; Code:
if (x & mask[i]) a[i] = '1'; else a[i] = '0'; Bạn đã đánh sai username của tôi. 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 |
20-06-2012, 03:44 PM | #10 | |
Đệ tử 1 túi
Tham gia ngày: Aug 2011
Bài gửi: 13
: |
Trích:
|
|
21-06-2012, 03:04 PM | #11 |
Đệ tử 7 túi
Tham gia ngày: May 2005
Bài gửi: 258
: |
đưa code bạn đã viết lên đây.
__________________
viết chương trình cho vdk chạy ổn định là cả một vấn đề. |
|
|