PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   PIC - Thiết kế và Ứng dụng (http://www.picvietnam.com/forum/forumdisplay.php?f=23)
-   -   giúp mình về LCD va PIC 16f877 (http://www.picvietnam.com/forum/showthread.php?t=8154)

lambaotrung 21-03-2011 02:38 PM

giúp mình về LCD va PIC 16f877
 
hiện giờ mình đang làm bài tập kết nói và hiển thi từ PIc lên LCD.
+bài tập 1: là kết noi PIC & LCD gữi nhưng chửa nghĩa bình thường lên như " TEST, HELLO"...
+bài tập 2: là đưa giá trị của một thanh ghi lên màn hình LCD tại vị trí con trỏ.
+bài tập 3: là kết nói PIC lên LCD thông qua ADC để thấy đổi giá trị.....

mình cố thể dùng màn hình loại 16x4 dc ko...

và kết nói 4birt hay 8bit.....

chân thành cảm ơn các bạn.

caovanhuong 21-03-2011 07:51 PM

1 Attachment(s)
Trích:

Nguyên văn bởi lambaotrung (Post 42797)
hiện giờ mình đang làm bài tập kết nói và hiển thi từ PIc lên LCD.
+bài tập 1: là kết noi PIC & LCD gữi nhưng chửa nghĩa bình thường lên như " TEST, HELLO"...
+bài tập 2: là đưa giá trị của một thanh ghi lên màn hình LCD tại vị trí con trỏ.
+bài tập 3: là kết nói PIC lên LCD thông qua ADC để thấy đổi giá trị.....

mình cố thể dùng màn hình loại 16x4 dc ko...

và kết nói 4birt hay 8bit.....

chân thành cảm ơn các bạn.

có thể sử dụng LCD 16x4, giao tiếp 8bit hoạc 4bit
đây là cái thư viện mình viết giao tiếp 8 bit
BT1: xuất "PIC VIET NAM" ra màn hình LCD
Code:

#include <16F877A.h>
#include <def_877A.h>
#fuses NOWDT,NOLVP,NOPROTECT,HS,PUT
#use delay(clock=20000000)
#include <lcd_lib.c>
void main()
{
trisb=0x00;
trisd=0x00;
lcd_init();
while(1)
{
lcd_putcmd(0x01);
lcd_putcmd(0x0c);
lcd_putchar("PIC VIET NAM");
delay_ms(500);
}
}

BT2: đọc giá trị thanh ghi porta

Code:

#include <16F877A.h>
#include <def_877A.h>
#fuses NOWDT,NOLVP,NOPROTECT,HS,PUT
#use delay(clock=20000000)
#include <lcd_lib.c>
int8 a;
void main()
{
trisb=0x00;
trisd=0x00;
trisa=0x00;
lcd_init();
while(1)
{
//porta=10;
lcd_putcmd(0x01);
lcd_putcmd(0x0c);
a=portd;// gan gia tri thanh ghi portd vào a
printf(lcd_putchar,"%d",a);// doc gia tri thanh ghi portd lên man hinh LCD
delay_ms(500);
}
}

BT3: đọc giá trị ADC của AN0 lên LCD
Code:

#include <16F877A.h>
#include <def_877A.h>
#fuses NOWDT,NOLVP,NOPROTECT,HS,PUT
#device *=16 adc=8
#use delay(clock=20000000)
#include <lcd_lib.c>
int8 data;
void main()
{
trisb=0x00;
trisd=0x00;
trisa=0x00;
lcd_init();
setup_ADC_ports(AN0_AN1_AN3);
setup_ADC(adc_clock_internal);
set_ADC_channel(0);
delay_us(10);
while(1)
{
data=read_adc();
lcd_putcmd(0x01);
lcd_putcmd(0x0c);
printf(lcd_putchar,"%u",data);
delay_ms(500);
}
}


lambaotrung 24-03-2011 04:07 PM

Thuyet voi cam on anh nhieu....

lambaotrung 24-03-2011 04:15 PM

Anh oi cho em them 1 điều là mình kết nói các chân của pic và lcd như thế nào.... Ko có hình ảnh và củng ko có thầy chỉ nưa. Anh giúp em cái này....
Vơi lại em thấy cái doan core kia kết nói.....
Driver pic & lcd khá là phúc tạp hơn....

VA 1 CÂU HỎI NỬA LÀ.

VI KẾT NÓI NHƯ TRÊN THEO KEI TRIS_B, TRIS_D NHƯ CỦA ANH EM KO KIỂM TRA DC GIA CHI CỦA PIN RB0.

MÀ MACH EM LDE6DEP6E6M1 CÀN DỌC TÍNH HIỆU ( H_TO_L) TỪ 1 CHÂN CỦA 1 PORT NHƯ VẬY MÌNH KHAI BÁO NHƯ THẾ NÀO

VD:
//RE0 LÀ CHÂN KHÔNG CỦA PORT E.
IF(RE0 = 0)
{
a++
}

NHƯ VẬY LÀ TƯƠNG ĐƯƠNG GÁN 1 CHÂN CỦA PORT THÀNH 1 CÁI TÊN MÀ MÌNH ĐỊNH TRƯỚC NHƯ " RE0, CHAN01,...."

VÀ TƯƠNG TƯ NHƯ THẾ... KHÁC BAO CHO CÁC PORT KHÁC NHƯ THỂ NÀO..


Như thế chất là năng cao hơn àh... Giúp em cai nua nhe...
HI CAM ƠN. ANH

stupid11 27-03-2011 11:46 PM

Hiển thị chữ "HELLO WORLD"

#include <16f877a.h>
#fuses nowdt,noprotect,nolvp,put,hs
#use delaY(clock=4000000)

#byte portb=0x6
#byte porte=0x9

#bit e=0x9.0
#bit rs=0x9.1
#bit rw=0x9.2

int i;
char mang[]="HELLO WORLD";

void lenh()
{
rs=0;rw=0;e=1;e=0;
delay_ms(5);
}
void xuat()
{
e=1;rs=0;rw=0;e=0;
delay_ms(5);
}

void khoitao()
{
portb=0x1;lenh(); //xoa LCD
portb=0x38;lenh(); //hien thi 2 dong
portb=0x0e;lenh(); //bat hien thi
portb=0x02;lenh(); //dua con tro ve dau dong//
}

void main()
{
set_tris_b(0);
set_tris_e(0);
khoitao();
for(i=0;i<15;i++)
{
portb=mang[i];
xuat();
delay_ms(5);
}
while(1)
{}
}

stupid11 28-03-2011 12:04 AM

//Đo nhiệt đô hiển thị lên LCD và cảnh báo ở ngưỡng 50 oC//
//Phần cứng như sau:
porte:chân điều khiển
portb:xuất data
RA0:ngõ vào analog(từ LM35)
RA1:xuất cảnh báo

#include <16f877a.h>
#fuses nowdt,noprotect,nolvp,put,hs
#use delay(clock=4000000)

#byte portb=0x6
#byte porte=0x9

#bit e=0x9.0
#bit rs=0x9.1
#bit rw=0x9.2

int i,x;
char mang[]="nhiet do :";

void lenh()
{
rs=0;rw=0;e=1;e=0;
delay_ms(5);
}
void xuat()
{
e=1;rs=0;rw=0;e=0;
delay_ms(5);
}

void khoitao()
{
portb=0x1;lenh(); //xoa LCD
portb=0x38;lenh(); //hien thi 2 dong
portb=0x0e;lenh(); //bat hien thi
portb=0x02;lenh(); //dua con tro ve dau dong//
}

void doc_ADC()
{
setup_ADC(ADC_clock_internal);
stup_ports(AN0);
set_channel(0);
delay_ms(1);
}

void main()
{
set_tris_a(0b01);
set_tris_b(0);
set_tris_e(0);
khoitao();
for(i=0;i<12;i++)
{
portb=mang[i];
xuat();
delay_ms(5);
}
while(1)
{
doc_ADC();
X=read_ADC();
X=X*2.049 //ADC 10bit & LM35//
portb=0x89;lenh();//dua con tro LCD toi vi trí sau chu nhiet do:
//ban nen xem lai lenh nay..ko biet co dung vi tri ko nua~.

portb=x;xuat();
//canh bao//
if(x>50)
{
RA1=1 //
}
else
{
RA1=0;//
}
}}


Trong LCD có ký hiệu "oC" bạn chỉ việc

portb=0b00101110;xuat(); //bạn tham khảo thêm bảng mã LCD//

Chúc bạn thành công.

lambaotrung 28-03-2011 09:16 PM

cam on bạn nhưng mà vẫn thấy sao sao...

kiểm tra giá trị của 1 chân bit trong 1 pỏt vẫn chưa giải quyết dc.

lambaotrung 28-03-2011 10:02 PM

bạn ởi bạn có tài liệu gì về kết nối. LCD và PIC ko về các hàm các lệnh, su khoi tao.
viet nhu thề nào...

nếu bạn có tài liệu gì về lập trình cho PIC.

mình dang làm bai tập

kiểm tra pin của 1 port ( vd: porte chân số 0 )

ví du của chương trình.
// kiem tra giá trị điện áp tháp ở chuân 0 của porte
e0= chân 0 của portE
int a;

void main()
{
set_tris_e(0x01);
set_tris_d(0x00);
if( e0 == 0)
{
a++;
output_d(a);
}
}

stupid11 28-03-2011 10:51 PM

2 Attachment(s)
-Bạn đọc thêm mấy tài liệu này..còn LCD thì bạn vào trang www.hocavr.com/index.php/app/textlcd người ta chỉ cũng khá chi tiết đó...giao tiếp 4 bit.8bit luôn.
-còn câu hỏi của bạn mình cũng ko hiểu cho lắm..có phải bạn muốn kiểm tra chân nào đó ở mức '1' hay '0' phải không

vd:chân a0=0x5.0

if(a0==0)
{
thực hiện 1...
}
else
{
thực hiện 2...
}
đại khái là thế...hoặc bạn cũng có thể dùng lệnh bit_test(x,i) cũng được..Trong đó x là thanh ghi,còn i là thứ tự bit trong thanh ghi.

vd:kiểm tra chân RB3 ở mức cao:

if(bit_test(0X5,3))
{
}
.....

hay kiểm tra chân RA4 ở mức thấp

if( ! bit_test(0x5,4)) //bạn chú ý " ! " tức là mức thấp
{
}
.....
-Còn cách khởi tạo LCD thì để hôm nào lục lại mấy cái folder đã,,lâu rồi ko đụng đến..có gì mình gửi mail cho.Chúc bạn may mắn.

stupid11 28-03-2011 11:34 PM

1 Attachment(s)
Đây là file mô phỏng LCD hiện chữ 'HELLO WORLD' bạn lưu ý:khi mô phỏng mà ko có thạch anh ngoài thì khai báo là #fuses xt //thì PIC sẽ chạy thạch anh nội.

-còn nếu rảnh thì gắn thạch anh ngoài (mất nhiều thời gian) thì khai báo #fuses hs
-Nếu ko chạy ko hiểu lí do vì sao ko chạy đâu.Rất nhỏ nhưng cần phải lưu ý.
-bạn tải file mô phỏng trên mạng cần chú ý chỗ này.

lambaotrung 29-03-2011 11:03 AM

bạn ởi mình thực hiện lệnh tét 1 chân trong 1 port như bạn chỉ ko dc.
#include <def_877A.h>
#fuses NOWDT,NOLVP,NOPROTECT,HS,PUT
#use delay(clock=20000000)
#byte portd = 0x06
#byte porte= 0x09
#use fast_io(a)
#use fast_io(b)
#use fast_io(d)

void main()
{
set_tris_a(0xff);
set_tris_b(0x00);
set_tris_d(0x00);
while(1)
{
if(! bit_test(0x5.1))
{output_d(0x01);
}
}
}

chương trình ccs pic c dịch thành công nhưng khi chạy mô phỏng thì nó out ra trị ra port D luôn ko kiểm tra dc..
giup mình chổ này nhe.

có gì gữi qua mail: lambaotrungdt@gmail.com
fone: 01284279279

stupid11 29-03-2011 04:13 PM

Xin lỗi mấy bạn nha.Hình như mình up nhầm file mô phỏng.để tối về rồi up lại.sorry sorry

lambaotrung 29-03-2011 04:14 PM

plc
 
thay la la

lambaotrung 29-03-2011 05:06 PM

bạn stupid11 bạn có thể giải thich kỹ hơn 1 tý về các:
void lenh()
void xuat()

và bạn co thể chi ra mình muốn di chuyễn con trỏ và xuất giá trị theo vị trí con trỏ như thế nào ko.

vả lại bạn ởi mình muốn kết nối lcd theo kiểu 8bit.

vài gửi giá trị của 1 thanh ghi đó lên lcd ( chú ý: là ko dùng thu viện)
như thế mình mới đầu mình khai báo làm sao... hé. mong bạn giúp cho.

lambaotrung 29-03-2011 05:49 PM

1 Attachment(s)
các bác giúp mình giải quyết mạch đếm sản phẩm này giúp mình
// ấn vào chân RAO ( 0x05,0)
{
a++; // thanh ghi a = a + 1;
}
hiên thi lên LCD

nhưng lúc này lcd hiện thi phi phải là phép cộng 1. hiết chả hiểu.

#include <16F877A.h>
#include <def_877A.h>
#fuses NOWDT,NOLVP,NOPROTECT,HS,PUT
#use delay(clock=20000000)
#include <lcd_lib.c>
#byte porta = 0x05
int a=0;
void main()
{
trisb=0x00;
trisd=0x00;
lcd_init();


while(2)
{
lcd_putcmd(0x01);
lcd_putcmd(0x0c);
delay_ms(500);
portd=a;
while(1)
{
if(!bit_test(porta,0))
{
a++;
a=portd;
printf(lcd_putchar,"%d",a);
delay_ms(100);
}
}
}
}



nhưng mà củ thể là em muốn đếm đấy
ấn 1 cái thanh ghi a ( #byte a = 0x20)
a++;
hiện thị a lên lcd;
delay_ms(100);
quay về kiểm tra
rổi lại hiển thị.


Múi giờ GMT. Hiện tại là 04:08 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