PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Các ngôn ngữ lập trình khác (CCS C, HT PIC,...)

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

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 10-04-2008, 10:52 PM   #1
cuccutiara
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.
cuccutiara vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 11-04-2008, 12:22 AM   #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
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
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 11-04-2008, 01:16 AM   #3
cuccutiara
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.
cuccutiara vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 11-04-2008, 02:04 AM   #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
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};
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:
Code:
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,
__________________
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-04-2008, 09:20 PM   #5
kimhuynguyen
Đệ tử 3 túi
 
Tham gia ngày: Nov 2007
Nơi Cư Ngụ: Vietnam
Bài gửi: 48
:
Trích:
Nguyên văn bởi namqn View Post
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};
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:
Code:
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:
Code:
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.
__________________
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
kimhuynguyen vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 17-04-2008, 09:37 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
Đú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';
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,
__________________
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 12-04-2008, 12:16 AM   #7
cuccutiara
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.
cuccutiara vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 17-04-2008, 09:43 AM   #8
anhvietqx
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é
anhvietqx vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 17-04-2008, 07:30 PM   #9
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
Trích:
Nguyên văn bởi anhvietqx View Post
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,
__________________
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 20-06-2012, 03:44 PM   #10
tantme
Đệ tử 1 túi
 
Tham gia ngày: Aug 2011
Bài gửi: 13
:
Trích:
Nguyên văn bởi namqn View Post
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
tantme vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 21-06-2012, 03:04 PM   #11
tdm
Đệ tử 7 túi
 
Tham gia ngày: May 2005
Bài gửi: 258
:
Trích:
Nguyên văn bởi tantme View Post
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.
__________________
viết chương trình cho vdk chạy ổn định là cả một vấn đề.
tdm 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:20 AM.


Đượ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