PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Cơ bản về vi điều khiển và PIC (http://www.picvietnam.com/forum/forumdisplay.php?f=8)
-   -   Xin giúp đỡ e lập trình hiển thị lcd (http://www.picvietnam.com/forum/showthread.php?t=5961)

melody010 18-03-2010 10:37 AM

Xin giúp đỡ e lập trình hiển thị lcd
 
- MỚI TẬP TÀNH NÊN CHƯA RÀNH LẮM, MONG ĐƯỢC CÁC A GIÚP ĐỠ NHIỆT TÌNH VỚI

CHẢ LÀ E LẬP TRÌNH GIAO TIẾP DÙNG NGẮT RB0, DÙNG 4 NÚT BẤM: TĂNG, GIẢM, QUAY THUẬN, QUAY NGỊCH

-KHI BẤM THUẬN THÌ LCD HIỆN: QUAY THUẬN GIÁ TRỊ: X (BIẾN) => ĐÃ LÀM ĐƯỢC

-KHI BẤM NGỊCH LCD HIỆN: QUAY NGHỊCH GIÁ TRỊ: X (BIẾN) => ĐÃ LÀM ĐƯỢC

- VẤN ĐỀ LÀ KHI E BẤM TĂNG HOẶC GIẢM THÌ BIẾN X PHẢI THAY ĐỔI NHƯ LÀ: QUAY THUẬN GIÁ TRỊ: 1 HAY 2 , 3, 4, 5. E ĐANG BÓ TAY PHẦN NÀY.

E ĐÃ CÓ TÌM HIỂU QUA LÀ MUỐN HIỆN THỊ LCD THÌ PHẢI ĐƯA MÃ ASCII VÀO LCD. NHƯNG KO BIẾT CHUYỂN GIÁ TRỊ LƯU TRONG BIẾN X THÀNH MÃ ASCII RỒI CÂU LỆNH VIẾT NHƯ THẾ NÀO CẢ.

MONG CÁC A VIẾT HỘ E ĐOẠN CODE CHỖ TĂNG GIẢM HIỆN LCD VỚI, E XIN CẢM ƠN RẤT NHÌU.

E GỬI CODE VÀ MÔ PHỎNG PROTUES ĐỂ CÁC A XEM HỘ.

PHẦN RB6 RB7 IN ĐẬM E KO BIẾT VIẾT THẾ NÀO.


#include <16F877A.h>
#include <DEFS_16F877A.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#define RS RB3
#define RW RB2
#define E RB1
#define LCD PORTD
#use fast_io(b)
#byte portb=0x06
#byte intcon=0x000B
int x=0;
/*Ham yeu cau goi lenh dieu khien LCD*/
void comnwrt(void)
{
RS = 0;
RW = 0;
E = 1;
E = 0;
delay_ms(1);
}
/*Ham yeu cau goi du lieu hien thi len LCD*/
void datawrt(void)
{
RS = 1;
RW = 0;
E = 1;
E = 0;
delay_ms(1);
}
// Chuong trinh ngat
#int_RB
void ngat_RB()
{

if((RBIF)&&(RBIE))
{
//Kiem tra sw1

{ if(RB4==0)
{
LCD = 0x01; // Xoa man hinh hien thi
comnwrt();
delay_ms(10);
LCD = 0x83; // Vi tri hang 1,cot 3
comnwrt();
delay_ms(1);
LCD = 'Q'; // Xuat dong chu "QUAY THUAN" ra LCD
datawrt();
LCD = 'U';
datawrt();
LCD = 'A';
datawrt();
LCD = 'Y';
datawrt();
LCD = ' ';
datawrt();
LCD = 'T';
datawrt();
LCD = 'H';
datawrt();
LCD = 'U';
datawrt();
LCD = 'A';
datawrt();
LCD = 'N';
datawrt();
LCD = 0xC0; // Vi tri hang 2,cot 0
comnwrt();
LCD = 'G'; // Xuat dong chu "GIA TRI:" ra LCD
datawrt();
LCD = 'I';
datawrt();
LCD = 'A';
datawrt();
LCD = ' ';
datawrt();
LCD = 'T';
datawrt();
LCD = 'R';
datawrt();
LCD = 'I';
datawrt();
LCD = ':';
datawrt();
}
}
//Kiem tra sw2
{
if(RB5==0)
{
LCD = 0x01; // Xoa man hinh hien thi
comnwrt();
delay_ms(10);
LCD = 0x83; // Vi tri hang 1,cot 3
comnwrt();
delay_ms(1);
LCD = 'Q'; // Xuat dong chu "QUAY NGICH" ra LCD
datawrt();
LCD = 'U';
datawrt();
LCD = 'A';
datawrt();
LCD = 'Y';
datawrt();
LCD = ' ';
datawrt();
LCD = 'N';
datawrt();
LCD = 'G';
datawrt();
LCD = 'I';
datawrt();
LCD = 'C';
datawrt();
LCD = 'H';
datawrt();
LCD = 0xC0; // Vi tri hang 2,cot 0
comnwrt();
LCD = 'G'; // Xuat dong chu "GIA TRI:" ra LCD
datawrt();
LCD = 'I';
datawrt();
LCD = 'A';
datawrt();
LCD = ' ';
datawrt();
LCD = 'T';
datawrt();
LCD = 'R';
datawrt();
LCD = 'I';
datawrt();
LCD = ':';
datawrt();
}
}
//Kiem tra sw3
{
if(RB6==0)
{
++x;
LCD = 0x01; // Xoa man hinh hien thi
comnwrt();
LCD = 0xC8; // Vi tri hang 2,cot 8
comnwrt();
delay_ms(100);
LCD='x';
datawrt();
delay_ms(100);
}
}
//Kiem tra sw4
{
if(RB7==0)
{

}

}
RBIF=0; //Xoa co ngat RB
}
}

/*Ham main*/
void main(void)
{
set_tris_B(0b11110000);
set_tris_D(0);
enable_interrupts(global); // Cho phep ngat toan cuc
enable_interrupts(int_RB); // Cho phep ngat RB
ext_int_edge(H_to_L); // Ngat khi co xung cao xuong thap
delay_ms(100); // Tao tre 100ms cho LCD khoi dong

LCD = 0x38; // Hai hang, ma tran dot 5*7, 8 bit interface
comnwrt();
LCD = 0x0C; // Bat hien thi, tat con tro
comnwrt();

LCD = 0x82; // Vi tri hang 1,cot 3
comnwrt();
LCD = 'C'; // Xuat dong chu "CHUONG TRINH" ra LCD
datawrt();
LCD = 'H';
datawrt();
LCD = 'U';
datawrt();
LCD = 'O';
datawrt();
LCD = 'N';
datawrt();
LCD = 'G';
datawrt();
LCD = ' ';
datawrt();
LCD = 'T';
datawrt();
LCD = 'R';
datawrt();
LCD = 'I';
datawrt();
LCD = 'N';
datawrt();
LCD = 'H';
datawrt();
LCD = 0xC4; // Vi tri hang 2,cot 5
comnwrt();
LCD = 'S'; // Xuat dong chu "SAN SANG" ra LCD
datawrt();
LCD = 'A';
datawrt();
LCD = 'N';
datawrt();
LCD = ' ';
datawrt();
LCD = 'S';
datawrt();
LCD = 'A';
datawrt();
LCD = 'N';
datawrt();
LCD = 'G';
datawrt();
While(true)
{
}
}

melody010 18-03-2010 01:29 PM

Cần giúp đỡ
 
Ko ai giúp e sao ? E sắp nộp đồ án rồi. Hu hu hu.

ngocthanh07 18-03-2010 02:00 PM

Trích:

Nguyên văn bởi melody010 (Post 34198)
- VẤN ĐỀ LÀ KHI E BẤM TĂNG HOẶC GIẢM THÌ BIẾN X PHẢI THAY ĐỔI NHƯ LÀ: QUAY THUẬN GIÁ TRỊ: 1 HAY 2 , 3, 4, 5. E ĐANG BÓ TAY PHẦN NÀY.

E ĐÃ CÓ TÌM HIỂU QUA LÀ MUỐN HIỆN THỊ LCD THÌ PHẢI ĐƯA MÃ ASCII VÀO LCD. NHƯNG KO BIẾT CHUYỂN GIÁ TRỊ LƯU TRONG BIẾN X THÀNH MÃ ASCII RỒI CÂU LỆNH VIẾT NHƯ THẾ NÀO CẢ.

Mình có cách rất là bình dân thế này:

Bạn xem mã ASCII của chữ số 1 là bao nhiêu, ví dụ xem ở chỗ này
http://www.asciitable.com/

Như vậy chữ '0', '1' có thứ tự là 48, 49,
Chữ 'A' có thứ tự là 65. Có nghĩa lệnh
LCD = 'A';
của bạn tương đương LCD = 65;

LCD = '0' tuơng đuơng LCD = 48;
vậy muốn xuất giá trị x, x = 0..9 thì
==> LCD = x+ 48 ;
Cách này mình đoán thôi, bạn thử xem đuợc không. Không đuợc thì cho mình xin lỗi.

minhngocyb 09-10-2011 02:50 AM

Trích:

Nguyên văn bởi ngocthanh07 (Post 34202)
Mình có cách rất là bình dân thế này:

Bạn xem mã ASCII của chữ số 1 là bao nhiêu, ví dụ xem ở chỗ này
http://www.asciitable.com/

Như vậy chữ '0', '1' có thứ tự là 48, 49,
Chữ 'A' có thứ tự là 65. Có nghĩa lệnh
LCD = 'A';
của bạn tương đương LCD = 65;

LCD = '0' tuơng đuơng LCD = 48;
vậy muốn xuất giá trị x, x = 0..9 thì
==> LCD = x+ 48 ;
Cách này mình đoán thôi, bạn thử xem đuợc không. Không đuợc thì cho mình xin lỗi.

Đúng rồi bạn ạ, nhưng mình nhớ còn phải khai báo thế nào để lấy mã ASCII nữa thì phải. . . có bờ rào nào vào giúp cái nào. .

ngochuyenk44 16-11-2012 12:35 AM

mình tưởng là muốn xuất ra từ "quay thuan" hay "quay nguoc" thì minh có thể lập trình cả cum từ và xuất ra luôn bằng lệnh
printf(lcd_putc," quay thuan");
hoặc
printf(lcd_putc," quay ngươc");
sao lại phải xuất lệnh từng chữ cái vậy ah??
nhân tiện cho e hỏi là sao lúc em lập trình cho hiển thị ra LCD 16x2 thì luôn bị mất chữ ở cột 1 hàng 1 vậy????em toàn phải để dấu "cách" ở đó thui

toancdt 16-11-2012 10:05 PM

Trích:

Nguyên văn bởi ngochuyenk44 (Post 79419)
mình tưởng là muốn xuất ra từ "quay thuan" hay "quay nguoc" thì minh có thể lập trình cả cum từ và xuất ra luôn bằng lệnh
printf(lcd_putc," quay thuan");
hoặc
printf(lcd_putc," quay ngươc");
sao lại phải xuất lệnh từng chữ cái vậy ah??
nhân tiện cho e hỏi là sao lúc em lập trình cho hiển thị ra LCD 16x2 thì luôn bị mất chữ ở cột 1 hàng 1 vậy????em toàn phải để dấu "cách" ở đó thui

bạn post code lên mới biết được lỗi chỗ nào chứ


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