PDA

View Full Version : giúp mình về LCD va PIC 16f877


lambaotrung
21-03-2011, 02:38 PM
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
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

#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


#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

#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
-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
Đâ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
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
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ị.

stupid11
29-03-2011, 09:12 PM
Đây mới là file mô phỏng chữ 'HELLO WORLD''

stupid11
29-03-2011, 09:33 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.


-Trong LCD có 2 thanh ghi quan trọng đó là thanh ghi lệnh (IR) và thanh ghi dữ liệu DR
-Nếu ta muốn gửi 'lệnh' cho LCD thực thi,thì ta phải nối bus với thanh ghi IR
-Muốn xuất data lênh màn hình LCD thì nối với thanh ghi DR.

Để nối với thanh ghi IR hoặc DR thì ta chỉ việc điều khiển 3 chân E,RS,RW.

+nối với thanh ghi IR:
{
RS=0; //LCD hoạt động ở chế độ ghi,bus nối với thanh ghi IR
RW=0;//LCD hoạt động ở chế độ ghi
E=1;
E=0; //xung H_to_L
}

+nối với thanh ghi DR
{
E=1;
RS=1;
RW=0;
E=0;
}

-Còn bạn hỏi tại sao lại như vậy,thì mình cũng chẳng biết phải giải thích sao nũa..bởi vì "nó là như vậy ".Mà bạn cũng ko cần để ý đến 2 chương trình con void lenh(); void xuat(); làm gì.Cứ nhớ là muốn ra lệnh cho LCD thì void lenh(),còn muốn xuất ký tự ra LCD thì void xuat() thế thôi.

stupid11
29-03-2011, 09:53 PM
Sau đây là 1 số mã lệnh LCD mình biết,bạn nào biết thêm thì chia sẻ luôn:

mã HEX (0x..)

01:xóa LCD
02:trở về đầu hàng
06:ko dịch hiển thị
05:dịch hiển thị sang phải :,''dùng để chạy chữ trong LCD''
07:dịch hiển thị sang trái
08:tắt con trỏ,tắt hiển thị
0a:tắt hiển thị,bật con trỏ
0c:bật hiển thị tắt con trỏ
0e:bật hiển thị nhấp nháy con trỏ
10:dịch vị trí con trỏ sang trái
14:.................................phải
38:hiển thị 2 dòng LCD
c0:xuống hàng.
cách di chuyển con trỏ:

0x80 : con trỏ nằm ở góc sát màn hình bên trái,nếu muốn dịch đi thì mình tăng giá trị lên

vd:muốn con trỏ ở ô thứ 5 thì ra lệnh :

data=0x85;
lenh();

làm như vậy chữ bắt đầu của mình sẽ nằm ở ô thứ 5 thay vì ở ô đầu tiên.



Khởi tạo:
thường thì khi vào làm việc thì bạn sẽ cấu hình cho LCD như là xóa màn hình,bật hiền thị,cho hiển thị 2 dòng,...cái đó là tùy ở bạn.

stupid11
29-03-2011, 10:04 PM
Khi đã nắm nguyên lý hoạt động-và bảng mã của LCD thì bạn tha hồ tạo ra các hiệu ứng trên LCD,ví dụ ở đây mình cho chạy chữ trên LCD...

stupid11
29-03-2011, 10:18 PM
Gửi bạn lambaotrung có phải bạn muốn test kiểu này(mình có đính kèm file+code+mophong) hay ý của bạn là kiểm tra tích cực cạnh lên hay cạnh xuống..H_TO_L,hay L_TO_H...

lambaotrung
30-03-2011, 11:48 PM
cảm bạn rất nhiều. và cảm ơn các bác đã cùng chia se với mình... mình sẻ nghiên cứu... thank 100 phát.

tra loi ý của bạn stupid11 là
mình muốn kiểm trả giá trị 0 hay 1 của 1 chân trong 1 port. vì thế mình có thể làm các phím nhấn để khởi chạy 1 chuong trình cong bên tring PIC

////////////////
if( RA0 == 0)
{
core
}
////////////////

thank bạn nhiều.

stupid11
30-03-2011, 11:51 PM
sao ko thấy bác giúp em hết vậy... hic.

Bạn muốn giúp vấn đề gì.

stupid11
31-03-2011, 12:30 AM
-Ý bạn là khi nhấn phím thì sẽ thực thi 1 chương trình nào đó chứ gì...mình đã trình bày ở trong file TEST.RAR rồi mà.
-Còn đây là chương trình đếm SP hiển thị lên LCD.
-Mình cũng mới nghiên cứu PIC thôi,cũng chưa rành lắm đâu...Nhưng nếu trong phạm vi giúp bạn được thì mình sẽ giúp...nếu có gì sai sót bạn cứ chỉ dạy.,ko có vấn đề gì cả..mình lên picvietnam là để cùng giao lưu học hỏi mà.

stupid11
31-03-2011, 12:42 AM
cảm bạn rất nhiều. và cảm ơn các bác đã cùng chia se với mình... mình sẻ nghiên cứu... thank 100 phát.

tra loi ý của bạn stupid11 là
mình muốn kiểm trả giá trị 0 hay 1 của 1 chân trong 1 port. vì thế mình có thể làm các phím nhấn để khởi chạy 1 chuong trình cong bên tring PIC

////////////////
if( RA0 == 0)
{
core
}
////////////////

thank bạn nhiều.


Thưởng khi sử dụng phím nhấn thì phải chờ nhấn -nhả
vd:
if(RA0==0) //phím đã được nhấn//
{
do{}while(RA0==0);//chờ phím nhả ra //nếu phím chưa được buông thỉ ko làm gì cả//
a++; //tăng giá trị a lên 1 đv
}

nếu bạn chỉ sử dụng:
if(RA0==0)
{
a++;
}

với code như vậy thì 1 lần nhấn phím của bạn,,thì giá trị của a ko fai tăng lên 1 mà là 1 con số nào đó tùy thuộc vào thạch anh...(sẽ rất lớn)...tại vì khi bạn nhấn xuống và nhả ra tối thiểu phải mất vài chục ms.,thậm chí cả giây..như vậy a cứ tăng lên khi nào bạn nhả ra thì thôi.Chắc bạn đẫ hiểu rồi chứ

-1 gợi ý nữa,bạn có thể sử dụng ngắt.cái này thì đơn giản hơn..mình đã trình bày trong file DemSanPham_LCD.rar

khienpzo
31-03-2011, 02:33 AM
Bạn muốn giúp vấn đề gì.



Anh chỉ giáo cho em rõ thêm về một số đoạn code này với em chưa hiểu lắm

//char const ht[]={'0','1','2','3','4','5','6','7','8','9',' '};

// 0192: MOVF 26,W
0193: MOVWF 2D
0194: MOVLW 0A
0195: MOVWF 2E
0196: CALL 158
0197: MOVF 77,W
0198: MOVWF 28
.................... chuc=y/10;
0199: MOVF 26,W
019A: MOVWF 2D
019B: MOVLW 0A
019C: MOVWF 2E
019D: CALL 158
019E: MOVF 78,W
019F: MOVWF 27
.................... z=(x-y)*100;
01A0: CLRF 2E
01A1: MOVF 26,W
01A2: MOVWF 2D
01A3: CALL 050
01A4: BSF 03.1
01A5: MOVF 23,W
01A6: MOVWF 30
01A7: MOVF 22,W
01A8: MOVWF 2F
01A9: MOVF 21,W
01AA: MOVWF 2E
01AB: MOVF 20,W
01AC: MOVWF 2D
01AD: MOVF 7A,W
01AE: MOVWF 34
01AF: MOVF 79,W
01B0: MOVWF 33
01B1: MOVF 78,W
01B2: MOVWF 32
01B3: MOVF 77,W
01B4: MOVWF 31
*
02F5: MOVF 77,W
02F6: MOVWF 2D
02F7: MOVF 78,W
02F8: MOVWF 2E
02F9: MOVF 79,W
02FA: MOVWF 2F
02FB: MOVF 7A,W
02FC: MOVWF 30
02FD: MOVF 30,W
02FE: MOVWF 34
02FF: MOVF 2F,W
0300: MOVWF 33
0301: MOVF 2E,W
0302: MOVWF 32
0303: MOVF 2D,W
0304: MOVWF 31
0305: CLRF 38
0306: CLRF 37
0307: MOVLW 48
0308: MOVWF 36
0309: MOVLW 85
030A: MOVWF 35
*
037F: MOVF 7A,W
0380: MOVWF 30
0381: MOVF 79,W
0382: MOVWF 2F
0383: MOVF 78,W
0384: MOVWF 2E
0385: MOVF 77,W
0386: MOVWF 2D
0387: CALL 139
0388: MOVF 78,W
0389: MOVWF 2A
.................... le1=z/10;
038A: MOVF 2A,W
038B: MOVWF 2D
038C: MOVLW 0A
038D: MOVWF 2E
038E: CALL 158
038F: MOVF 78,W
0390: MOVWF 2B
.................... le2=z%10;
0391: MOVF 2A,W
0392: MOVWF 2D
0393: MOVLW 0A
0394: MOVWF 2E
0395: CALL 158
0396: MOVF 77,W
0397: MOVWF 2C
.................... portb=0x38;
0398: MOVLW 38
0399: MOVWF 06
.................... lenh();
039A: CALL 182
.................... portb=0x0e;
039B: MOVLW 0E
039C: MOVWF 06
.................... lenh();
039D: CALL 182
.................... portb=0x80;
039E: MOVLW 80
039F: MOVWF 06
.................... lenh();
03A0: CALL 182
.................... portb=0x0c;
03A1: MOVLW 0C
03A2: MOVWF 06
.................... lenh();
03A3: CALL 182
.................... for(i=0;i<9;i++)
03A4: CLRF 29
03A5: MOVF 29,W
03A6: SUBLW 08
03A7: BTFSS 03.0
03A8: GOTO 3B0
.................... {
.................... portb=ht1[i];
03A9: MOVF 29,W
03AA: CALL 013
03AB: MOVWF 78
03AC: MOVWF 06
.................... xuat();
03AD: CALL 18A
.................... }
03AE: INCF 29,F
03AF: GOTO 3A5
.................... portb=0x89;
03B0: MOVLW 89
03B1: MOVWF 06
.................... lenh();
03B2: CALL 182
.................... if(chuc==0)
03B3: MOVF 27,F
03B4: BTFSS 03.2
03B5: GOTO 3B8
.................... {chuc=10;}
03B6: MOVLW 0A
03B7: MOVWF 27
.................... chuc;
.................... portb=ht[chuc];
03B8: MOVF 27,W
03B9: CALL 004
03BA: MOVWF 78
03BB: MOVWF 06
.................... xuat();
03BC: CALL 18A
.................... portb=ht[dv];
03BD: MOVF 28,W
03BE: CALL 004
03BF: MOVWF 78
03C0: MOVWF 06
.................... xuat();
03C1: CALL 18A
.................... portb=0b00101110;
03C2: MOVLW 2E
03C3: MOVWF 06
.................... xuat();
03C4: CALL 18A
.................... portb=ht[le1];
03C5: MOVF 2B,W
03C6: CALL 004
03C7: MOVWF 78
03C8: MOVWF 06
.................... xuat();
03C9: CALL 18A
.................... portb=ht[le2];
03CA: MOVF 2C,W
03CB: CALL 004
03CC: MOVWF 78
03CD: MOVWF 06
.................... xuat();
03CE: CALL 18A
.................... portb=0b11011111;
03CF: MOVLW DF
03D0: MOVWF 06
.................... xuat();
03D1: CALL 18A
.................... portb=0b01000011;
03D2: MOVLW 43
03D3: MOVWF 06
.................... xuat();
03D4: CALL 18A
.................... portb=0xc0;
03D5: MOVLW C0
03D6: MOVWF 06
.................... lenh();
03D7: CALL 182
.................... for(i=0;i<14;i++)
03D8: CLRF 29
03D9: MOVF 29,W
03DA: SUBLW 0D
03DB: BTFSS 03.0
03DC: GOTO 3E4
.................... {
.................... portb=ht3[i];
03DD: MOVF 29,W
03DE: CALL 021
03DF: MOVWF 78
03E0: MOVWF 06
.................... xuat();
03E1: CALL 18A
.................... }
03E2: INCF 29,F
03E3: GOTO 3D9
.................... portb=0xc0;
03E4: MOVLW C0
03E5: MOVWF 06
.................... lenh();
03E6: CALL 182

stupid11
31-03-2011, 10:37 AM
Bạn dịch từ CCS sang ASM à..như vậy thì sao mà mình giải thích được..bạn đưa code CCS lên rồi anh em cùng giải quyết.
-Còn chương trình hiển thị nhiệt độ trên LCD mình đã test luôn trên phần cứng rồi..ko sai đâu bạn..

lambaotrung
31-03-2011, 02:31 PM
bác ởi như vậy mình 1 in 1 giá của 1 thanh ghi lên màn hình ở vi trí con trỏ mình muốn mình dùng lệnh gì bác hé.

có giá tri ở thenh ghi tên là thanh ghi " a "

muốn dưa lênh màn hình theo vị trị của con trỏ mình làm thế nào...

minh đã hiểu dc nhiều cảm ơn các bạn nhiều lám.........

stupid11
31-03-2011, 02:59 PM
bác ởi như vậy mình 1 in 1 giá của 1 thanh ghi lên màn hình ở vi trí con trỏ mình muốn mình dùng lệnh gì bác hé.

có giá tri ở thenh ghi tên là thanh ghi " a "

muốn dưa lênh màn hình theo vị trị của con trỏ mình làm thế nào...

Thì bạn chỉ việc:

portd=0x85; (vị trí ô thứ 5,chẳng hạn)//portd xuất data//
lenh();
portd=a; //đưa giá trị của thanh ghi 'a' lên LCD tại vị trí con trỏ ở ô số 5
xuat();

Rất đơn giản phải ko nào!!!!

lambaotrung
31-03-2011, 08:11 PM
vậy sâot vậy mà không biết nhìn thấy no phức tạp làm sao.....

nhưng rồi có cái gì đóa ko đùng bạn àh.
core của mình viết nè hiển tên thi bình thường nhưng hiện giá trị bằng số lên màn hình như có gì đóa ko bình thường.

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

#use fast_io(b)
#use fast_io(d)

#byte portb=0x6
#byte portd=0x8
#byte tinh=0x20

#bit rs = portb.0
#bit rw = portb.1
#bit e = portb.2
void lenh();
void xuat();
void khoitao();

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

void xuat()
{
e=1;
rs=1;
rw=0;
e=0;
delay_ms(5);
}
void khoitao()
{portd=0x01;
lenh();
portd=0x0e;
lenh();
portd=0x80;
lenh();
portd=0x38;
lenh();
}


void main()
{
int i;
int32 a;
const char ten [] = "nhau";
set_tris_b(0);
set_tris_d(0);
khoitao();
tinh=0;
delay_ms(20);
tinh++;

for(i=0;i<40;i++)
{
portd=0x80;
lenh();
portd=tinh;
xuat();
}
while(1)
{
portd=0x80;
lenh();
portd=0x18;
lenh();
delay_ms(20);
}
}

bạn nè giải thích dùm mình tai so mình phài viết như thế này dề làm gì.
////////////////////
for(i=0;i<40;i++)
{
core
}
//////////////////////////


//////////////////////////
while(1)
{
portd=0x80;
lenh();
portd=0x18;
lenh();
delay_ms(20);
}
//////////////////////////////

và hinh như đoạn core của minh thiếu cái gì vi giá trị của " a " là 1 com số nguyên là "100" con thang lcd no ko biết đó là số gì thì phải
nghiện cứu core trong mạch đếm sản phẩm co doan này ko hiểu

char const ht[]={'0','1','2','3','4','5','6','7','8','9',' '};

có phải doan này giúp hiển thị các số lên màn hình.

stupid11
31-03-2011, 09:23 PM
char const mang[]="STUPID11"

for(i=0;i<20;i++)
{
portd=mang[i];
xuat();
delay_ms(5);//khỏi cần delay nếu làm mạch thật.
}

viết như thế này tương đương với việc xuất ra từng ký tự,bạn có thể viết như sau:
portd="S";
xuat();
portd="T";
xuat();
portd="U";
xuat();
.
.
.
viết như trên sẽ lâu hơn rất nhiều....thay vì như vậy bạn khai báo 1 mảng rồi xuất từng ký tự trong mảng đó ra..cấu trúc "for" đó bạn.

-còn bạn viết:
while(1)
{
portd=0x80;
lenh();
portd=0x18;
lenh();
delay_ms(20);
}
//hình như code này bạn nhầm thì phải,bạn xem lại thử coi.


void main()
{
int i;
int32 a;
const char ten [] = "nhau";
set_tris_b(0);
set_tris_d(0);
khoitao();
tinh=0;
delay_ms(20);
tinh++;....
-Đoạn này có nghĩa là gì vậy hả bạn,có phải bạn muốn tự động tăng giá trị "tinh" lên hả.Bạn viết như vậy là ko được rồi..
-Với đoạn

for(i=0;i<40;i++)
{
portd=0x80;
lenh();
portd=tinh;
xuat();
}

Chỉ khi nào cần xuất 1 mảng thì mới sử dụng "for..".Còn ko thì chỉ đơn thuần xuất ra thôi.

-Cái nữa bạn khai báo biến tính làm gì #byte tinh=0x20; ko nhất thiết phải khai như vậy đâu..bạn chỉ khai báo đơn giản như sau là đủ

int tinh; //số nguyên 8bit
int16 tinh; //số nguyên 16bit
float tinh; //số thực 32 bit

còn nếu khai báo kiểu bạn thì nên khai báo #locate tinh=0x20;như vậy địa chỉ này sẽ ko sử dụng vào mục đích khác đc nua~

stupid11
31-03-2011, 09:32 PM
char const ht[]={'0','1','2','3','4','5','6','7','8','9',' '};

-khi thực hiện tính toán xong,kết quả trả về là 1 con số...mình sẽ tham chiếu giá trị tính toán được vào mảng này để được 1 kí tự =>xuất ra LCD.
vd:số dem=85;
chuc=dem/10;
dv=dem%10;
portb=ht[chuc]; //chuc="8"=> "ký tự" này được lấy trong mảng ht[]
xuat();
portb=ht[dv]; //dv="5"
xuat();
.
.
.


-tuy nhiên bạn cũng có thể xuất trực tiếp,khỏi cần tham chiếu vào mảng..(cái này mình chưa test mạch thật..nhưng proteus vẫn chạy bt)..

lambaotrung
31-03-2011, 09:57 PM
void main()
{
int8 i;
int32 a;
const char ten [] = " lam bao trung ";
set_tris_b(0);
set_tris_d(0);
khoitao();
for(i=0;i<40;i++)
{
portd=0x82;
lenh();
portd=ten[i];
xuat();
}
}

trở lại vấn đề xuất 1 chuổi ký tự ra màng hình ở vi trí 0x82 mà sao nó ko ra 1 chuổi mà nó nhảy từng chữ từng chữ 1 ko hiểu sao.

như the the trả lời của bạn thi mình xuất trực tiếp 1 số lên màng hình thi dùng như thế nào.... lệnh của mình sai chổ nào.... thank 100 phát nhé.

stupid11
31-03-2011, 10:06 PM
Bạn bỏ cái portd=0x82;
lenh();
ra khỏi vòng lặp for đi nhé.Nếu viết như bạn thì nhảy từng chữ là đúng rối

fai viết như sau:

portd=0x82;
lenh();
for(i=0;i<15;i++)
{
portd=ten[i];
xuat();
delay_ms(5);
}
100% chạy.. :D


-Thì mình nói rồi đấy thử viết chương trình hiển thị 1 số nào đó lên LCD đi..
vd:1234 chẳng hạn
bạn tính toán ra được 4 số nghin,tram,chuc,dv

sau đó chỉ việc

portd=nghin;
xuat()
portd=tram;
xuat()
.
.
cứ như thế thôi.

lambaotrung
31-03-2011, 10:43 PM
cảm ơn bạn đã viết dc và cơ bản đả thành công tỏng việc hiện thị ( chữ , số lên màn hình lCD )

mình se tiếp tục nghiêm cứu và học hỏi thêm....

xin chân thành cảm ở các tiền bối, các quý đồng đạo trong thời gian quan đã nhiệt tình chỉ giáo...

và rất cảm ơn bạn stupid11 ...! cảm ơn và cảm ơn..... chân thành cảm ơn. ko biết nói gì luôn như cảm ơn nhiều làm.

mail : lambaotrungdt@gmail.com
fone: 01284279279

bạn stupid11 có thể cho mình xin số fone ko.. bạn gữi vào mail nhé.

lambaotrung
31-03-2011, 11:24 PM
bạn ơi mình có vấn đề cần hỏi thêm

như vậy mình có giá trị cửa "tinh"

như vậy khi mình đếm đếm 1000 chẩn hạng

minh muốn nó ngưng lại thi phải làm sao...

core mình muốn việt co nội dùng là
có a = 1000
int32 tinh,a;

ấn 1 phím

dem++;
hien thi tinh lên LCD

if (dem>a)
{
core
}
else;

nhưng khi mình làm nhu thế này

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

#use fast_io(b)
#use fast_io(d)

#byte portb=0x6
#byte portd=0x8
#byte porta=0x5
#byte portc=0x07
#bit RA0 = porta.0

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


void lenh();
void xuat();
void khoitao();

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

void xuat()
{
e=1;
rs=1;
rw=0;
e=0;
delay_ms(5);
}
void khoitao()
{portd=0x01;
lenh();
portd=0x0e;
lenh();
portd=0x80;
lenh();
portd=0x38;
lenh();
delay_ms(5);
}


void main()
{
int32 i, dem,donvi,chuc,tram,nghin,chucnghin,a;
const char tenem[] = " lam bao trung ";
char const ht[]={'0','1','2','3','4','5','6','7','8','9',' '};

set_tris_b(0);
set_tris_d(0);
set_tris_c(0x0);
khoitao();
a=1000;
////////////////////////////////////////////////////////////////////////////////
while(1)
{
if(dem>a)
{
output_c(0xff);
}
else
output_c(0xf0);
}
////////////////////////////////////////////////////////////////////////////////////////////////////
while(2)
{
if (ra0==0)
{
do{}
while (ra0==0);
dem=dem+100;
}

}

chucnghin=dem/10000;
nghin=(dem%10000)/1000;
tram=(dem%1000)/100;
chuc=(dem%100)/10;
donvi=dem%10;
portd=0x0c;
lenh();

for(i=0;i<20;i++)
{
portd=0x82;
lenh();
portd=ht[chucnghin];
xuat();
portd=ht[nghin];
xuat();
portd=ht[tram];
xuat();
portd=ht[chuc];
xuat();
portd=ht[donvi];
xuat();
delay_ms(5);

portd=0xc0;
lenh();

for(i=0;i<30;i++)
{
portd=tenem[i];
xuat();
}

}
}
}


các bạn chú ý chổ

////////////////////

while(1)
{
if(dem>a)
{
output_c(0xff);
}
else
output_c(0xf0);

///////////////////////////////////
minh làm như thế thi nó ko hiển thi nửa......

khienpzo
31-03-2011, 11:50 PM
Anh stupid11 em dùng code lập trình của anh trong bài đo nhiệt độ đó . Mà khi em nạp chương trình sang PIC và kết nối thì không chạy anh ah ...... Nó nhảy liên tục ở chỗ hiển thị nhiệt độ đó . Anh xem lại dùm em với . Thanks anh đã giúp đỡ .có gì anh send sang mail của em or post lên diễn đàn khiendohuu@gmail.com

khienpzo
01-04-2011, 12:08 AM
Ah mà anh stupid11 chuyển hộ em data LCD sang port d 4 bit với em chuyển code sang mà nó chưa chạy nữa .........em chưa gói lại nên chưa gửi lên anh xem dùm em nha.thanks anh nhiều

hieu89tx
01-04-2011, 12:08 AM
các bác cho em hỏi:
em đang học viết chương trình đo nhiệt độ bằng lm35 từ con Pic18f67j60 slave rồi đưa thông tin nhiệt độ về con pic18f67j60 master qua modul EUSART ,sau đó hiển thị ra LCD va lên máy tính,
đây là đồ án của em,em sắp phải nộp rồi, bác nào biết hướng dẫn em với nha,em đang rất cần, em tìm trog diễn đàn không thấy chủ đề nào nói về EUSART
mong các bác giúp đỡ em
em lập trình bằng ccs

stupid11
01-04-2011, 12:12 AM
Ah mà anh stupid11 chuyển hộ em data LCD sang port d 4 bit với em chuyển code sang mà nó chưa chạy nữa .........em chưa gói lại nên chưa gửi lên anh xem dùm em nha.thanks anh nhiều

bạn đưa mail đây..mình gửi qua cho.

stupid11
01-04-2011, 12:25 AM
gửi khienpzo

Mình gửi vào mail rồi đấy

stupid11
01-04-2011, 12:26 AM
gui lambaotrung

Mình gửi vào mail rồi đấy...

khienpzo
01-04-2011, 07:39 PM
gửi khienpzo

Mình gửi vào mail rồi đấy

Anh stupid11 ah đó vẫn là LCD 8bit port B mà ........ tại phần cứng em bỏ 4 bit mất tiêu ah . không muốn test phải làm lại phần cứng ....................

tranvanhung88
02-04-2011, 02:13 AM
e có một bài tập ntn, e đang làm một đề là truyền một dòng chữ từ 1 con chíp sang một con khác (16f77a) và hiển thị trên LCD ,e chua biết xây dựng chương trình như thế nào, xin các a chi cho,nếu đươc xin qua email ahungnd@gmail.com

hieu89tx
02-04-2011, 06:50 PM
chưa ai làm đề tài này ah, ai bt giúp mình với nhe
liên hẹ voi mình qua mail : hieu89tx@gmail.com

honque104
05-04-2011, 04:36 PM
Chào mọi người, mình cũng đang có 1 vấn đề về LCD mà "loay hoay" lâu rùi vẫn chưa giải quyết đc mong mọi người giúp đỡ cho.
Mình đang dùng 1 bàn phím để nhập dữ liệu vào (ví dụ số 123) sau khi nhập vào thì dùng Pic để nhận biết, sau đó xuất lên LCD16x2 (hiện thị lên LCD mã NHỊ PHÂN). Mình tìm hiểu mãi mà vẫn chưa xuất lên LCD dc,mong mọi người chỉ giao cho
Thank mọi người trước.

docgiaclong
05-04-2011, 09:49 PM
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(0);

nếu em không muốn dùng 3 lênh trên thì em phải làm thế nào hả các anh

caovanhuong
06-04-2011, 09:29 PM
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(0);

nếu em không muốn dùng 3 lênh trên thì em phải làm thế nào hả các anh
buộc phải có 2 lệnh này bạn à.

docgiaclong
07-04-2011, 01:51 PM
mình tìm ra rồi ah
Thực ra không cần dùng 3 lệnh ấy vẫn làm được
bằng cách sau

#LOCATE ADCON0= 1FH
#LOCATE ADCON1= 9FH
VOID MAIN()
{ ADCON0=0XC5;
ADCON1=0X40;

trinh hoai vinh
22-04-2011, 11:20 PM
em can ma code de viet chuong trinh dem san pham dung bien hong ngoai va pic 16f:877a ai co giup em nha:vinh913@yahoo.com

tanbka
22-04-2011, 11:40 PM
em can ma code de viet chuong trinh dem san pham dung bien hong ngoai va pic 16f:877a ai co giup em nha:vinh913@yahoo.com
Bạn còn đang chưa làm được chỗ nào, chỗ nào gặp khó khăn hỏi thì mọi người mới giúp được chư, bạn hỏi thế này thì thuê anh em làm trọn gói cho xong.

alycuong
12-06-2011, 07:47 PM
Trong thư viện lcd.c có sẵn của CCS thì có các hàm bên dưới, e chỉ biết công dụng của 1 số, a nào biết chú thích giúp e các cái còn lại với.

void lcd_send_byte(BYTE address, BYTE n) ??? cai nay la gi ah?
void lcd_send_nibble(BYTE n) ??? cai nay la gi ah?
void lcd_init(void) //Khoi tao LCD
void lcd_gotoxy(BYTE x, BYTE y) // Di den vi tri cot , hang
void lcd_putc(char c) // Gui ki tu len LCD
char lcd_getc(BYTE x, BYTE y) // Nhan ki tu tu LCD

Cho e hỏi là với 1 thư viện khác thì có hàm void LCD_PutCmd ( unsigned int cX )

Ví dụ muốn nhấp nháy con trỏ thì viết : LCD_PutCmd(0x0f)

Nhưng với thư viện lcd.c

void lcd_send_byte(BYTE address, BYTE n)
void lcd_send_nibble(BYTE n)
void lcd_init(void)
void lcd_gotoxy(BYTE x, BYTE y)
void lcd_putc(char c)
char lcd_getc(BYTE x, BYTE y)

Với các lệnh trên e k biết làm sao để nhấp nháy con trỏ hết. A nào bít hướng dẫn gúp e. E cảm ơn nhiều lắm!

pdkxlily
05-07-2011, 10:03 AM
Bạn muốn giúp vấn đề gì.

biên dịch nó báo thế này là sao bạn "*error 18 "123(mani).c" Line 0(0,1): file can not be opend "

{
docADC(); // adc 10bit
x=read_ADC(); // cái này là đọc giá trị adc đúg ko à ??
x=x/2.049;
y=x;
hienthi(x);
}

cái chia 2.049 là giải thix kiểu này đúng ko các bác
adc 10bit 0-1023 ,mà V_ref = VCC=5V nên ADC_value=1 tương ứng 5/1024=4.887mV
Trong khi đó LM335
cho ra điện áp là 10mV/1K nên để giá trị ADC thay đổi 1 đơn vị thì nhiệt độ phải thay đổi là 2K => x= ADC_value*(4.887/10)

pdkxlily
05-07-2011, 10:39 AM
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.

#include <16F877A.h>
#include <def_877a.h>
#device *=16 adc=8
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)
#include <lcd_lib_4bit.c>


void convert_bcd(int8 x);
int8 t1,t2;
void main()
{



trisa = 0xFF;
trisb = 0x01;
trisd = 0x00;

LCD_init();
Printf(LCD_putchar,"Kenh 0,1:");
// Khoi tao cho ngat ngoai
enable_interrupts (INT_EXT);
ext_int_edge(H_TO_L);
enable_interrupts (GLOBAL);
// Khoi tao che do cho bo ADC
setup_adc_ports(AN0_AN1_AN3);
setup_adc(ADC_CLOCK_INTERNAL);
delay_us(10);
setup_adc_ports(AN0);



while(true)
{
set_ADC_channel(0);
t1 =(float)read_adc();
t1=t1/0.5102;
// convert_bcd((int8) t1);
LCD_putcmd(0xC0);
printf(LCD_putchar,"T0=%u",t1);
printf(LCD_putchar,"C");

set_ADC_channel(1);
t2=(float)read_adc();
t2=t2/0.5102;
LCD_putcmd(0xC7);
printf(LCD_putchar,"T1=%u",t2);
printf(LCD_putchar,"C");


}
}

mình làm lcd_4bit thì khúc xuất ra chữ độC ký tự đặc biệt thì mình làm sao bạn .thêm giúp mình với

danghien719
05-07-2011, 11:37 AM
kí tự đặc biệt là sao ?
đoạn nào ?
Như thế này là sao : printf(LCD_putchar,"T0=%u",t1);
hịc, tôi ko hiểu đc đoạn code này của bạn.

pdkxlily
05-07-2011, 09:34 PM
kí tự đặc biệt là sao ?
đoạn nào ?
Như thế này là sao : printf(LCD_putchar,"T0=%u",t1);
hịc, tôi ko hiểu đc đoạn code này của bạn.

của mình là đo nhiệt độ 2 kênh bạn ơi t1 là kênh 0 t2 là kênh 1
printf(LCD_putchar,"C");
thay vì có chữ C thì mình mún thêm ký tự độ cho chuẩn thôi mà

tdm
06-07-2011, 10:14 AM
của mình là đo nhiệt độ 2 kênh bạn ơi t1 là kênh 0 t2 là kênh 1
printf(LCD_putchar,"C");
thay vì có chữ C thì mình mún thêm ký tự độ cho chuẩn thôi mà
có phải bạn muốn hiển thị như thế này:

danghien719
06-07-2011, 10:31 AM
của mình là đo nhiệt độ 2 kênh bạn ơi t1 là kênh 0 t2 là kênh 1
printf(LCD_putchar,"C");
thay vì có chữ C thì mình mún thêm ký tự độ cho chuẩn thôi mà

Hì, bạn lại ko hiểu ý tôi rồi. "T0=%u" ư ? bạn có hiểu rõ cái này ko ? Tại sao bạn lại làm như thế này. Tôi hiểu ý bạn là : u = unsigned int8 hay là char hay là singed nhưng thế thì đã sao ?
LCD là ACSII mà. Hì, vậy muốn hiện ra LCD thì làm sao đây.
Rất đơn giản là phải chuyển number sang char. Hay nói chính xác là chuyển số mà adc đọc được ra kí tự mã ASCII. Thế là bạn ok rồi nhé.
Bạn đã hiểu khá rõ về sự làm việc của LCD rồi đấy.
Chúc bạn thành công.
P/M : Nếu bạn bó tay ko xây dựng đc Function thì pm cho tôi : Y!M : danghien_004
Thân.

tdm
06-07-2011, 10:59 AM
Hì, bạn lại ko hiểu ý tôi rồi. "T0=%u" ư ? bạn có hiểu rõ cái này ko ? Tại sao bạn lại làm như thế này. Tôi hiểu ý bạn là : u = unsigned int8 hay là char hay là singed nhưng thế thì đã sao ?
LCD là ACSII mà. Hì, vậy muốn hiện ra LCD thì làm sao đây.
Rất đơn giản là phải chuyển number sang char. Hay nói chính xác là chuyển số mà adc đọc được ra kí tự mã ASCII. Thế là bạn ok rồi nhé.
Bạn đã hiểu khá rõ về sự làm việc của LCD rồi đấy.
Chúc bạn thành công.
P/M : Nếu bạn bó tay ko xây dựng đc Function thì pm cho tôi : Y!M : danghien_004
Thân.
printf(LCD_putchar,"T1=%u",t2);
bạn đó viết như vậy là đúng rồi. nó tự động chuyển number sang kí tự mã ASCII.
%u:định dạng dữ liệu số nguyên không dấu 8bit

pdkxlily
06-07-2011, 12:04 PM
có phải bạn muốn hiển thị như thế này:http://www.picvietnam.com/forum/attachment.php?attachmentid=4459&stc=1&thumb=1&d=1309918472

đúng rồi đó bạn ý mình là mún nó ra ký tự trong bảng mã LCD đó
%u :số nguyên hex ko dấu ^^

tdm
06-07-2011, 02:06 PM
đúng rồi đó bạn ý mình là mún nó ra ký tự trong bảng mã LCD đó
%u :số nguyên hex ko dấu ^^
kí tự đó không nằm trong bảng mã LCD.bạn phải tự tạo dữ liệu rồi lưu vào vùng CGRAM của LCD và truy xuất nó ra.

pdkxlily
06-07-2011, 03:13 PM
bạn sent cho mình bài mô phỏng của bạn như trên hình đi . mình tham khảo phát

lambaotrung
30-03-2012, 12:30 AM
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

#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


#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

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


đa một năm trôi qua rồi khi đọc lại bài viết này vẫn còn muốn cảm ơn anh 1 lần nửa.

anh Hưởng này anh có thể giúp em về tập lệnh dịch hiển thị trên LCD dc ko. em đọc datasheet thì nó là lệnh 0x05 và 0x07, nhưng ko hiểu sao khi dùng lệnh này thì nó ko hiển thi.

void main()
{
lcd_init();
lcd_putcmd(0x80);
printf(lcd_putchar,"PICVIETNAM");
while(true)
{
lcd_putcmd(0x05)
delay_ms(500);
}
}

ko biết có phải lệnh 0x05 và 0x07 ko bác giúp em.

onlybad123
03-01-2013, 04:59 AM
có sơ đồ mạch cho bài tập 1 nói ở trên không cho mình với!
hoangvanloi1991@gmail.com
ai có gửi mail cho mình nha!!
thanks!