PDA

View Full Version : Hiện thị LCD bị sai?


cuccutiara
10-04-2008, 10:52 PM
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 ạ.


#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]);
}
}

namqn
11-04-2008, 12:22 AM
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,

cuccutiara
11-04-2008, 01:16 AM
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.

namqn
11-04-2008, 02:04 AM
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:
byte const mask[8] = {1, 2, 4, 8, 16, 32, 64, 128};

Sau đó trong hàm trabang() (hay có thể đổi tên thành bin2ascii() cho chính xác hơn), bạn chỉ cần thực hiện:
for (i=0; i<=8; i++)
{
if (x & mask[i]) a[i] = '1'; else a[i] = '0';
}

Như vậy là mảng a[] sẽ chứa biểu diễn ASCII của số nhị phân x. Có lẽ bạn cần khai báo lại thành char a[8] cho thích hợp với đoạn code trên.

Thân,

cuccutiara
12-04-2008, 12:16 AM
Em hiểu ý bác rồi, em làm được rồi, thank you ever so much.

anhvietqx
17-04-2008, 09:43 AM
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é

namqn
17-04-2008, 07:30 PM
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é
Tôi làm như sau:
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,

kimhuynguyen
17-04-2008, 09:20 PM
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:
byte const mask[8] = {1, 2, 4, 8, 16, 32, 64, 128};

Sau đó trong hàm trabang() (hay có thể đổi tên thành bin2ascii() cho chính xác hơn), bạn chỉ cần thực hiện:
for (i=0; i<=8; i++)
{
if (x & mask[i]) a[i] = '1'; else a[i] = '0';
}

Như vậy là mảng a[] sẽ chứa biểu diễn ASCII của số nhị phân x. Có lẽ bạn cần khai báo lại thành char a[8] cho thích hợp với đoạn code trên.

Thân,


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:

for (i=0; i<8; i++)
{
if (x & (0x80 shr i)) a[i] = '1'; else a[i] = '0';
}


không cần phải lưu bảng tra.

namqn
17-04-2008, 09:37 PM
Đú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
if (x & (0x80 shr i)) a[i] = '1'; else a[i] = '0';

if (x & mask[i]) a[i] = '1'; else a[i] = '0';
còn tùy theo PIC được dùng. Nếu PIC không có lệnh dịch nhiều bit một lúc (PIC16F877A rơi vào trường hợp này) thì các lệnh dịch với i tăng dần sẽ kém hiệu quả hơn lệnh tra bảng. Tất nhiên dùng bảng thì sẽ tốn thêm 8 word cho bảng, nhưng chưa hẳn mã máy cho lệnh dịch sinh ra đã ngắn hơn mã máy cho lệnh tra bảng. Những điều này để cho người dùng CCS C đánh giá, còn tôi không dùng CCS C nên không đánh giá được.

Bạn đã đánh sai username của tôi.

Thân,

tantme
20-06-2012, 03:44 PM
Tôi làm như sau:
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,

a ơi. e làm theo cách này nhưng sau dấu "," nó không hiển thi số gì hết, dấu phẩy thì hiển thị đựoc rồi. còn phần sau nữa. a giúp e với

tdm
21-06-2012, 03:04 PM
a ơi. e làm theo cách này nhưng sau dấu "," nó không hiển thi số gì hết, dấu phẩy thì hiển thị đựoc rồi. còn phần sau nữa. a giúp e với
đưa code bạn đã viết lên đây.