PDA

View Full Version : code LCD?


ElecTel
14-02-2011, 03:11 AM
các anh cho em hỏi đoạn code em viết hiển thị cho LCD như này đã đúng chưa?
em muốn tạo ra 1 phím nhấn tăng count với 1 phím nhấn giảm count sau đó hiển thị count lên lcd

Void push_key()
{
int count;
if(B1==0) //nut o chan B1 duoc nhan
{
delay_ms(150); //delay qua xung nhieu
while(B1==1) //cho den khi tha
{;}
count++; //dem so lan bam nut
}
else if(B2==0) //nut o chan b2 duoc nhan
{
delay_ms(150);
while(B2==1)
{;}
count--; //dem so lan bam nut
}
if(count<0)
count=0;
else if(count>99)
count=99
return count;
}
void menu_control()
{
lcd_init();
lcd_gotoxy(9,1); // cot 9 hang 1
lcd_putc("Menu controler");
lcd_gotoxy(1,2);
lcd_putc("K=");
lcd_gotoxy(3,2);
lcd_putc(count); // cho này em viết vậy nó có hiển thị số count đếm được ko ?
}

hoc_picpicpic
14-02-2011, 11:04 AM
các anh cho em hỏi đoạn code em viết hiển thị cho LCD như này đã đúng chưa?
em muốn tạo ra 1 phím nhấn tăng count với 1 phím nhấn giảm count sau đó hiển thị count lên lcd

Void push_key()
{
int count;
if(B1==0) //nut o chan B1 duoc nhan
{
delay_ms(150); //delay qua xung nhieu
while(B1==1) //cho den khi tha
{;}
count++; //dem so lan bam nut
}
else if(B2==0) //nut o chan b2 duoc nhan
{
delay_ms(150);
while(B2==1)
{;}
count--; //dem so lan bam nut
}
if(count<0)
count=0;
else if(count>99)
count=99
return count;
}
void menu_control()
{
lcd_init();
lcd_gotoxy(9,1); // cot 9 hang 1
lcd_putc("Menu controler");
lcd_gotoxy(1,2);
lcd_putc("K=");
lcd_gotoxy(3,2);
lcd_putc(count); // cho này em viết vậy nó có hiển thị số count đếm được ko ?
}

thứ nhất: biến count bạn fai cho nó là biến toàn cục
thứ 2 là:if(B1==1) & if(B2==1) không phải là if(B1==0) & if(B2==0)

ElecTel
14-02-2011, 02:33 PM
nhưng mà theo em nghỉ thì khi nút nhấn được thiết kết nối với GND thì khi nhấn nút đóng mạch thì điện áp ở chân vdk =0 chứ

hoc_picpicpic
14-02-2011, 03:33 PM
ở trên mình nghĩ bạn thiết kế là phín đc nhấn thì vdk đọc là 1,nếu thiết kế vdk đoc là 0 thì thay while(B1==0) và while(B2==0) ,bạn lập trình cho if và while giống nhau la đc

tdm
15-02-2011, 11:26 AM
các anh cho em hỏi đoạn code em viết hiển thị cho LCD như này đã đúng chưa?
em muốn tạo ra 1 phím nhấn tăng count với 1 phím nhấn giảm count sau đó hiển thị count lên lcd

Void push_key()
{
int count;
if(B1==0) //nut o chan B1 duoc nhan
{
delay_ms(150); //delay qua xung nhieu
while(B1==1) //cho den khi tha
{;}
count++; //dem so lan bam nut
}
else if(B2==0) //nut o chan b2 duoc nhan
{
delay_ms(150);
while(B2==1)
{;}
count--; //dem so lan bam nut
}
if(count<0)
count=0;
else if(count>99)
count=99
return count;
}
void menu_control()
{
lcd_init();
lcd_gotoxy(9,1); // cot 9 hang 1
lcd_putc("Menu controler");
lcd_gotoxy(1,2);
lcd_putc("K=");
lcd_gotoxy(3,2);
lcd_putc(count); // cho này em viết vậy nó có hiển thị số count đếm được ko ?
}
tôi gửi cho bạn đoạn code hoàn chỉnh để bạn tham khảo.

#include <16F877A.h>
#device *=16 adc=10
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4000000)
#include <lcd.c>
#define LCD_DATA_PORT getenv("SFR:PORTD")
#define LCD_ENABLE_PIN PIN_D0 ////
#define LCD_RS_PIN PIN_D1 ////
#define LCD_RW_PIN PIN_D2
#define LCD_DATA4 PIN_D4 ////
#define LCD_DATA5 PIN_D5 ////
#define LCD_DATA6 PIN_D6 ////
#define LCD_DATA7 PIN_D7 ////
#byte portB =0x06 ////
#bit B1= portB.1 ////
#bit B2= portB.2 ////
void push_key(void);
main()
{
set_tris_b(0b00000110);
port_b_pullups(true);
set_tris_c(0b00000000);
lcd_init();
lcd_gotoxy(1,1); // cot 1 hang 1
lcd_putc("Menu controler");
lcd_gotoxy(1,2);
lcd_putc("K=");
while(1)
{
push_key();
}
}
void push_key()
{
int count;
if(B1==0) //nut o chan B1 duoc nhan
{
delay_ms(10); //delay qua xung nhieu
while(B1==0) //cho den khi tha
{;}
count++; //dem so lan bam nut

lcd_gotoxy(3,2);
lcd_putc(" ");
lcd_gotoxy(3,2);
Printf(LCD_putc,"%u",count); // hiển thị số count đếm lên LCD
delay_ms(10); //delay qua xung nhieu
}



else if(B2==0) //nut o chan b2 duoc nhan
{
delay_ms(10);
while(B2==0)
{;}
count--; //dem so lan bam nut
lcd_gotoxy(3,2);
lcd_putc(" ");//
lcd_gotoxy(3,2);
Printf(LCD_putc,"%u",count); // hiển thị số count đếm lên LCD
delay_ms(10); //delay qua xung nhieu
}
else
{
}
}

ElecTel
16-02-2011, 08:01 PM
cảm ơn tdm ! thực ra mình viết chương trình chỉnh PID hiển thị lên với các số liệu PID được nhập vào.tạo 1 menu gồm P;I;D Có 4 phím điều khiển(up,down,cancel,enter) nhưng mà bí quá mình chỉ làm được thế này thôi

signed int 8 count=0;
Void push_key()
{
if(B1==0) //nut o chan B1 duoc nhan
{
delay_ms(150); //delay qua xung nhieu
while(B1==0) //cho den khi tha
{;}
count++; //dem so lan bam nut
}
else if(B2==0) //nut o chan b2 duoc nhan
{
delay_ms(150);
while(B2==0)
{;}
count--; //dem so lan bam nut
}
if(count<0)
count=0;
else if(count>99)
count=99
return count;
}
void menu_control()
{
lcd_init();
lcd_gotoxy(9,1); // cot 9 hang 1
lcd_putc("Menu controler");
lcd_gotoxy(1,2);
lcd_putc("K=");
lcd_gotoxy(3,2);
lcd_putc(count);
lcd_gotoxy(7,2);
lcd_putc("I=");
lcd_gotoxy(9,2);
lcd_putc(count);
lcd_gotoxy(13,2);
lcd_putc("D=");
lcd_gotoxy(14,2);
lcd_putc(count);

Mình xem lại đoạn code của mình thì thấy nó ko ổn ngay từ bước hiển thị ban đầu ,chắc chắn chỉ hiển thị "k=0 i=0 d=0" làm sao để tạo được 1 menu k;i;d và bắt đầu đièu khiển(tăng/giảm) từng menu 1 được???

tdm
17-02-2011, 08:58 AM
cảm ơn tdm ! thực ra mình viết chương trình chỉnh PID hiển thị lên với các số liệu PID được nhập vào.tạo 1 menu gồm P;I;D Có 4 phím điều khiển(up,down,cancel,enter) nhưng mà bí quá mình chỉ làm được thế này thôi

signed int 8 count=0;
Void push_key()
{
if(B1==0) //nut o chan B1 duoc nhan
{
delay_ms(150); //delay qua xung nhieu
while(B1==0) //cho den khi tha
{;}
count++; //dem so lan bam nut
}
else if(B2==0) //nut o chan b2 duoc nhan
{
delay_ms(150);
while(B2==0)
{;}
count--; //dem so lan bam nut
}
if(count<0)
count=0;
else if(count>99)
count=99
return count;
}
void menu_control()
{
lcd_init();
lcd_gotoxy(9,1); // cot 9 hang 1
lcd_putc("Menu controler");
lcd_gotoxy(1,2);
lcd_putc("K=");
lcd_gotoxy(3,2);
lcd_putc(count);
lcd_gotoxy(7,2);
lcd_putc("I=");
lcd_gotoxy(9,2);
lcd_putc(count);
lcd_gotoxy(13,2);
lcd_putc("D=");
lcd_gotoxy(14,2);
lcd_putc(count);Mình xem lại đoạn code của mình thì thấy nó ko ổn ngay từ bước hiển thị ban đầu ,chắc chắn chỉ hiển thị "k=0 i=0 d=0" làm sao để tạo được 1 menu k;i;d và bắt đầu đièu khiển(tăng/giảm) từng menu 1 được???
dùng thêm một nút nhấn để lựa chọn k,i,d.
sau mỗi lần cập nhập giá trị lưu vào eeprom.

ElecTel
18-02-2011, 11:21 AM
rất cảm ơn tdm ! chúc bạn và gia đình dồi dào sức khỏe và tràn đầy hạnh phúc! nhờ bạn mà mình đã viết được cái chương trình đầu tiên trong đời!!!!!!

ElecTel
18-02-2011, 09:06 PM
bạn ơi sao mình biên dịch cái chương trình của bạn thành file hex được rồi ! mà khi mô phỏng trên protues chẳng thấy xuất hiện gì cả,chỉ thấy cái LCD sáng lên vậy, mấy chân LCD thì nhấp nháy loạn xạ?????
#include <16F877A.h>
#device *=16 adc=10
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4000000)
#include <lcd.c>
#define LCD_DATA_PORT getenv("SFR:PORTD")
#define LCD_ENABLE_PIN PIN_D0 ////
#define LCD_RS_PIN PIN_D1 ////
#define LCD_RW_PIN PIN_D2
#define LCD_DATA4 PIN_D4 ////
#define LCD_DATA5 PIN_D5 ////
#define LCD_DATA6 PIN_D6 ////
#define LCD_DATA7 PIN_D7 ////
#byte portB =0x06 ////
#bit B1= portB.1 ////
#bit B2= portB.2 ////
void push_key(void);
main()
{
set_tris_b(0b00000110);
port_b_pullups(true);
set_tris_c(0b00000000);
lcd_init();
lcd_gotoxy(1,1); // cot 1 hang 1
lcd_putc("Menu controler");
lcd_gotoxy(1,2);
lcd_putc("K=");
while(1)
{
push_key();
}
}
void push_key()
{
int count;
if(B1==0) //nut o chan B1 duoc nhan
{
delay_ms(10); //delay qua xung nhieu
while(B1==0) //cho den khi tha
{;}
count++; //dem so lan bam nut

lcd_gotoxy(3,2);
lcd_putc(" ");
lcd_gotoxy(3,2);
Printf(LCD_putc,"%u",count); // hiển thị số count đếm lên LCD
delay_ms(10); //delay qua xung nhieu
}



else if(B2==0) //nut o chan b2 duoc nhan
{
delay_ms(10);
while(B2==0)
{;}
count--; //dem so lan bam nut
lcd_gotoxy(3,2);
lcd_putc(" ");//
lcd_gotoxy(3,2);
Printf(LCD_putc,"%u",count); // hiển thị số count đếm lên LCD
delay_ms(10); //delay qua xung nhieu
}
else
{
}
}

tdm
20-02-2011, 12:31 AM
bạn ơi sao mình biên dịch cái chương trình của bạn thành file hex được rồi ! mà khi mô phỏng trên protues chẳng thấy xuất hiện gì cả,chỉ thấy cái LCD sáng lên vậy, mấy chân LCD thì nhấp nháy loạn xạ?????
#include <16F877A.h>
#device *=16 adc=10
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4000000)
#include <lcd.c>
#define LCD_DATA_PORT getenv("SFR:PORTD")
#define LCD_ENABLE_PIN PIN_D0 ////
#define LCD_RS_PIN PIN_D1 ////
#define LCD_RW_PIN PIN_D2
#define LCD_DATA4 PIN_D4 ////
#define LCD_DATA5 PIN_D5 ////
#define LCD_DATA6 PIN_D6 ////
#define LCD_DATA7 PIN_D7 ////
#byte portB =0x06 ////
#bit B1= portB.1 ////
#bit B2= portB.2 ////
void push_key(void);
main()
{
set_tris_b(0b00000110);
port_b_pullups(true);
set_tris_c(0b00000000);
lcd_init();
lcd_gotoxy(1,1); // cot 1 hang 1
lcd_putc("Menu controler");
lcd_gotoxy(1,2);
lcd_putc("K=");
while(1)
{
push_key();
}
}
void push_key()
{
int count;
if(B1==0) //nut o chan B1 duoc nhan
{
delay_ms(10); //delay qua xung nhieu
while(B1==0) //cho den khi tha
{;}
count++; //dem so lan bam nut

lcd_gotoxy(3,2);
lcd_putc(" ");
lcd_gotoxy(3,2);
Printf(LCD_putc,"%u",count); // hiển thị số count đếm lên LCD
delay_ms(10); //delay qua xung nhieu
}



else if(B2==0) //nut o chan b2 duoc nhan
{
delay_ms(10);
while(B2==0)
{;}
count--; //dem so lan bam nut
lcd_gotoxy(3,2);
lcd_putc(" ");//
lcd_gotoxy(3,2);
Printf(LCD_putc,"%u",count); // hiển thị số count đếm lên LCD
delay_ms(10); //delay qua xung nhieu
}
else
{
}
}
vẫn mô phỏng bình thường:

ElecTel
21-02-2011, 09:40 AM
mình đã làm theo cách của bạn viết ra cái này .biên dịch ok nhưng vdk nó không chạy ko biết vì sao??? nản luôn!
#include <16F877A.h>
#device *=16 adc=10
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4000000)
#include <lcd.c>
#define LCD_DATA_PORT getenv("SFR:PORTD")
#define LCD_ENABLE_PIN PIN_D0 ////
#define LCD_RS_PIN PIN_D1 ////
#define LCD_RW_PIN PIN_D2
#define LCD_DATA4 PIN_D4 ////
#define LCD_DATA5 PIN_D5 ////
#define LCD_DATA6 PIN_D6 ////
#define LCD_DATA7 PIN_D7 ////
#byte portA =0x05 ////
#bit A1= portA.1 ////
#bit A2= portA.2
#bit A3= portA.3
signed int count,i,d,k;
int up()
{
if(A1==0)
{
delay_ms(100);
while(A1==0)
continue;
delay_ms(10);
return 0;
}
}
int down()
{
if(A2==0)
{
delay_ms(150);
while(A2==0)
continue;
delay_ms(10);
return 0;
}
}
void push_key() ////
{
if(up()==0)
{
++count; //dem so lan bam nut
if(count>99)count=99;
};
if(down()==0) //nut o chan B2 duoc nhan
{
--count; //dem so lan bam nut
if(count<0)count=0;
};
printf(lcd_putc,"%u",count);
delay_ms(10);
}

int chose()
{
if(A3==0)
{
delay_ms(100);
while(A3==0)
continue;
delay_ms(10);
return 0;
}

}

void main()
{

set_tris_a(0b00001110);
lcd_init();
lcd_gotoxy(9,1); // cot 9 hang 1
lcd_putc("Menu controler");
lcd_gotoxy(1,2);
lcd_putc("K=");
lcd_gotoxy(3,2);
if(k==0)lcd_putc("0"); // hien gia tri trong lan truoc
else printf(lcd_putc,"%i",k);
lcd_gotoxy(7,2);
lcd_putc("I=");
lcd_gotoxy(9,2);
if(i==0)lcd_putc("0");
else printf(lcd_putc,"%i",i);
lcd_gotoxy(13,2);
lcd_putc("D=");
lcd_gotoxy(14,2);
if(d==0)lcd_putc("0");
else printf(lcd_putc,"%i",i);// hien thi so khai man hinh LCD
lcd_gotoxy(3,2);
//lcd_send_byte(0,0x0A);
lcd_send_byte(0,0x0E); //con tro nhap nhay
while(up()==0||down()==0)
push_key();
if(chose()==0)
{
write_eeprom(0x01,count); //luu gia tri vao eeprom
k=read_eeprom(0x01); //
lcd_gotoxy(9,2);
lcd_send_byte(0,0x0E); //nhap nhay con tro
while(up()==0||down()==0) //chinh gia tri
push_key();
if(chose()==0)
{
write_eeprom(0x02,count); //chuong trinh su dung 3 vong
i=read_eeprom(0x02); // lap while de lua chon menu
lcd_gotoxy(14,2);
lcd_send_byte(0,0x0E);
while(up()==0||down()==0);
push_key();
if(chose()==0)
{
write_eeprom(0x03,count);
d=read_eeprom(0x03);
lcd_gotoxy(3,2);
lcd_send_byte(0,0x0E);
}
}
}
}

tdm
21-02-2011, 01:16 PM
mình đã làm theo cách của bạn viết ra cái này .biên dịch ok nhưng vdk nó không chạy ko biết vì sao??? nản luôn!
#include <16F877A.h>
#device *=16 adc=10
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4000000)
#include <lcd.c>
#define LCD_DATA_PORT getenv("SFR:PORTD")
#define LCD_ENABLE_PIN PIN_D0 ////
#define LCD_RS_PIN PIN_D1 ////
#define LCD_RW_PIN PIN_D2
#define LCD_DATA4 PIN_D4 ////
#define LCD_DATA5 PIN_D5 ////
#define LCD_DATA6 PIN_D6 ////
#define LCD_DATA7 PIN_D7 ////
#byte portA =0x05 ////
#bit A1= portA.1 ////
#bit A2= portA.2
#bit A3= portA.3
signed int count,i,d,k;
int up()
{
if(A1==0)
{
delay_ms(100);
while(A1==0)
continue;
delay_ms(10);
return 0;
}
}
int down()
{
if(A2==0)
{
delay_ms(150);
while(A2==0)
continue;
delay_ms(10);
return 0;
}
}
void push_key() ////
{
if(up()==0)
{
++count; //dem so lan bam nut
if(count>99)count=99;
};
if(down()==0) //nut o chan B2 duoc nhan
{
--count; //dem so lan bam nut
if(count<0)count=0;
};
printf(lcd_putc,"%u",count);
delay_ms(10);
}

int chose()
{
if(A3==0)
{
delay_ms(100);
while(A3==0)
continue;
delay_ms(10);
return 0;
}

}

void main()
{

set_tris_a(0b00001110);
lcd_init();
lcd_gotoxy(9,1); // cot 9 hang 1
lcd_putc("Menu controler");
lcd_gotoxy(1,2);
lcd_putc("K=");
lcd_gotoxy(3,2);
if(k==0)lcd_putc("0"); // hien gia tri trong lan truoc
else printf(lcd_putc,"%i",k);
lcd_gotoxy(7,2);
lcd_putc("I=");
lcd_gotoxy(9,2);
if(i==0)lcd_putc("0");
else printf(lcd_putc,"%i",i);
lcd_gotoxy(13,2);
lcd_putc("D=");
lcd_gotoxy(14,2);
if(d==0)lcd_putc("0");
else printf(lcd_putc,"%i",i);// hien thi so khai man hinh LCD
lcd_gotoxy(3,2);
//lcd_send_byte(0,0x0A);
lcd_send_byte(0,0x0E); //con tro nhap nhay
while(up()==0||down()==0)
push_key();
if(chose()==0)
{
write_eeprom(0x01,count); //luu gia tri vao eeprom
k=read_eeprom(0x01); //
lcd_gotoxy(9,2);
lcd_send_byte(0,0x0E); //nhap nhay con tro
while(up()==0||down()==0) //chinh gia tri
push_key();
if(chose()==0)
{
write_eeprom(0x02,count); //chuong trinh su dung 3 vong
i=read_eeprom(0x02); // lap while de lua chon menu
lcd_gotoxy(14,2);
lcd_send_byte(0,0x0E);
while(up()==0||down()==0);
push_key();
if(chose()==0)
{
write_eeprom(0x03,count);
d=read_eeprom(0x03);
lcd_gotoxy(3,2);
lcd_send_byte(0,0x0E);
}
}
}
}
///////////////////////////
Một vài gợi ý cho bạn:

#include <16F877A.h>
#device *=16 adc=10
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4000000)
#include <lcd.c>
#define LCD_DATA_PORT getenv("SFR:PORTD")
#define LCD_ENABLE_PIN PIN_D0 ////
#define LCD_RS_PIN PIN_D1 ////
#define LCD_RW_PIN PIN_D2
#define LCD_DATA4 PIN_D4 ////
#define LCD_DATA5 PIN_D5 ////
#define LCD_DATA6 PIN_D6 ////
#define LCD_DATA7 PIN_D7 ////
#byte portB =0x06 ////
#bit B1= portB.1 ////
#bit B2= portB.2 ////
#bit B3= portB.3
int8 K,I,D,chon=0;
void push_key(void);
main()
{
set_tris_b(0b00001110);
port_b_pullups(true);
set_tris_c(0b00000000);
lcd_init();
lcd_gotoxy(1,1); // cot 1 hang 1
lcd_putc("Menu controler");
lcd_gotoxy(1,2);
lcd_putc("K=");
while(1)
{
push_key();
}
}
void push_key()
{
int count;
if(B1==0) //nut o chan B1 duoc nhan[tăng]
{
delay_ms(10); //delay qua xung nhieu
while(B1==0) //cho den khi tha
{;}
// tại đây so sánh biến chọn[dùng switch]
// nếu chon=1 tăng K,rồi xuất ra LCD
// nếu chon=2 tăng I,rồi xuất ra LCD
// nếu chon=3 tăng D,rồi xuất ra LCD
count++; //dem so lan bam nut

lcd_gotoxy(3,2);
lcd_putc(" ");
lcd_gotoxy(3,2);
Printf(LCD_putc,"%u",count); // hiển thị số count đếm lên LCD
delay_ms(10); //delay qua xung nhieu
}



else if(B2==0) //nut o chan b2 duoc nhan[giảm]
{
delay_ms(10);
while(B2==0)
{;}
// tại đây so sánh biến chọn
// nếu chon=1 giảm K,rồi xuất ra LCD
// nếu chon=2 giảm I,rồi xuất ra LCD
// nếu chon=3 giảm D,rồi xuất ra LCD
count--; //dem so lan bam nut
lcd_gotoxy(3,2);
lcd_putc(" ");//
lcd_gotoxy(3,2);
Printf(LCD_putc,"%u",count); // hiển thị số count đếm lên LCD
delay_ms(10); //delay qua xung nhieu
}
else if(B3==0) //nut o chan b3 duoc nhan[chọn K,I,D]
{
delay_ms(10);
while(B3==0)
{;}
chon++;
if(chon>=4)
{
chon=0;
}
delay_ms(10);
}
else
{
}

ElecTel
21-02-2011, 01:28 PM
bạn ơi sao mình copi code của bạn để biên dịch ra file hex được rồi mà khi mô phỏng trên protuer nó chẳng ra gì cả??? ko biết protues co bị gì ko mình sử dụng v7.6 SP4???

#include <16F877A.h>
#device *=16 adc=10
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4000000)
#include <lcd.c>
#define LCD_DATA_PORT getenv("SFR:PORTD")
#define LCD_ENABLE_PIN PIN_D0 ////
#define LCD_RS_PIN PIN_D1 ////
#define LCD_RW_PIN PIN_D2
#define LCD_DATA4 PIN_D4 ////
#define LCD_DATA5 PIN_D5 ////
#define LCD_DATA6 PIN_D6 ////
#define LCD_DATA7 PIN_D7 ////
#byte portB =0x06 ////
#bit B1= portB.1 ////
#bit B2= portB.2 ////
void push_key(void);
main()
{
set_tris_b(0b00000110);
port_b_pullups(true);
set_tris_c(0b00000000);
lcd_init();
lcd_gotoxy(1,1); // cot 1 hang 1
lcd_putc("Menu controler");
lcd_gotoxy(1,2);
lcd_putc("K=");
while(1)
{
push_key();
}
}
void push_key()
{
int count;
if(B1==0) //nut o chan B1 duoc nhan
{
delay_ms(10); //delay qua xung nhieu
while(B1==0) //cho den khi tha
{;}
count++; //dem so lan bam nut

lcd_gotoxy(3,2);
lcd_putc(" ");
lcd_gotoxy(3,2);
Printf(LCD_putc,"%u",count); // hiển thị số count đếm lên LCD
delay_ms(10); //delay qua xung nhieu
}



else if(B2==0) //nut o chan b2 duoc nhan
{
delay_ms(10);
while(B2==0)
{;}
count--; //dem so lan bam nut
lcd_gotoxy(3,2);
lcd_putc(" ");//
lcd_gotoxy(3,2);
Printf(LCD_putc,"%u",count); // hiển thị số count đếm lên LCD
delay_ms(10); //delay qua xung nhieu
}
else
{
}
}

tdm
21-02-2011, 01:37 PM
bạn ơi sao mình copi code của bạn để biên dịch ra file hex được rồi mà khi mô phỏng trên protuer nó chẳng ra gì cả??? ko biết protues co bị gì ko mình sử dụng v7.6 SP4???

#include <16F877A.h>
#device *=16 adc=10
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4000000)
#include <lcd.c>
#define LCD_DATA_PORT getenv("SFR:PORTD")
#define LCD_ENABLE_PIN PIN_D0 ////
#define LCD_RS_PIN PIN_D1 ////
#define LCD_RW_PIN PIN_D2
#define LCD_DATA4 PIN_D4 ////
#define LCD_DATA5 PIN_D5 ////
#define LCD_DATA6 PIN_D6 ////
#define LCD_DATA7 PIN_D7 ////
#byte portB =0x06 ////
#bit B1= portB.1 ////
#bit B2= portB.2 ////
void push_key(void);
main()
{
set_tris_b(0b00000110);
port_b_pullups(true);
set_tris_c(0b00000000);
lcd_init();
lcd_gotoxy(1,1); // cot 1 hang 1
lcd_putc("Menu controler");
lcd_gotoxy(1,2);
lcd_putc("K=");
while(1)
{
push_key();
}
}
void push_key()
{
int count;
if(B1==0) //nut o chan B1 duoc nhan
{
delay_ms(10); //delay qua xung nhieu
while(B1==0) //cho den khi tha
{;}
count++; //dem so lan bam nut

lcd_gotoxy(3,2);
lcd_putc(" ");
lcd_gotoxy(3,2);
Printf(LCD_putc,"%u",count); // hiển thị số count đếm lên LCD
delay_ms(10); //delay qua xung nhieu
}



else if(B2==0) //nut o chan b2 duoc nhan
{
delay_ms(10);
while(B2==0)
{;}
count--; //dem so lan bam nut
lcd_gotoxy(3,2);
lcd_putc(" ");//
lcd_gotoxy(3,2);
Printf(LCD_putc,"%u",count); // hiển thị số count đếm lên LCD
delay_ms(10); //delay qua xung nhieu
}
else
{
}
}
tôi dùng proteus 7.6 ps0
bạn dùng ccs c phiên bản bao nhiêu.
file tôi gửi kèm có cả code,hex,sơ đồ.
trên proteus bạn có lạp file HEX cho Pic 16f877a không vậy.

ElecTel
21-02-2011, 01:53 PM
mình dich ra file hex bình thường luôn mà
mình thấy trên file mô phỏng của bạn có cái linh kiện này HD44870
mình mô phỏng trên protues nó ra cái cảnh báo này :
[HD44780]Attempted to read after writing a single nibble ( lúc chạy mô phỏng nó xuất hiện ra]
mình gắn thiếu cái HD44780 đó à???
?????

tdm
21-02-2011, 02:03 PM
mình dich ra file hex bình thường luôn mà
mình thấy trên file mô phỏng của bạn có cái linh kiện này HD44870
mình mô phỏng trên protues nó ra cái cảnh báo này :
[HD44780]Attempted to read after writing a single nibble ( lúc chạy mô phỏng nó xuất hiện ra]
mình gắn thiếu cái HD44780 đó à???
?????
[HD44780] con này thừa không ảnh hưởng gì.
bạn dùng file tôi gửi kèm nó có chạy được không.[nếu không chạy bạn có thể
thử bằng proteus phiên bản khác xem sao]

ElecTel
21-02-2011, 06:53 PM
protues mô phỏng cái chương trình bạn vẫn tốt!
Mình copy cái đoạn mã của bạn rồi dịch ra file hex nạp vào chương trình mô phỏng của bạn thì bị lỗi ko hiển thị được gì cả! có lẻ trình dịch bị lỗi chăng?? mình sử dụng CCS 4.114

tdm
21-02-2011, 08:47 PM
protues mô phỏng cái chương trình bạn vẫn tốt!
Mình copy cái đoạn mã của bạn rồi dịch ra file hex nạp vào chương trình mô phỏng của bạn thì bị lỗi ko hiển thị được gì cả! có lẻ trình dịch bị lỗi chăng?? mình sử dụng CCS 4.114
tôi đang dùng ccs c 4.104. bạn thử xem file lcd.c của ccs c 4.114 có giống như sau không:

///////////////////////////////////////////////////////////////////////////////
//// LCD.C ////
//// Driver for common LCD modules ////
//// ////
//// lcd_init() Must be called before any other function. ////
//// ////
//// lcd_putc(c) Will display c on the next position of the LCD. ////
//// The following have special meaning: ////
//// \f Clear display ////
//// \n Go to start of second line ////
//// \b Move back one position ////
//// ////
//// lcd_gotoxy(x,y) Set write position on LCD (upper left is 1,1) ////
//// ////
//// lcd_getc(x,y) Returns character at position x,y on LCD ////
//// ////
//// CONFIGURATION ////
//// The LCD can be configured in one of two ways: a.) port access or ////
//// b.) pin access. Port access requires the entire 7 bit interface ////
//// connected to one GPIO port, and the data bits (D4:D7 of the LCD) ////
//// connected to sequential pins on the GPIO. Pin access ////
//// has no requirements, all 7 bits of the control interface can ////
//// can be connected to any GPIO using several ports. ////
//// ////
//// To use port access, #define LCD_DATA_PORT to the SFR location of ////
//// of the GPIO port that holds the interface, -AND- edit LCD_PIN_MAP ////
//// of this file to configure the pin order. If you are using a ////
//// baseline PIC (PCB), then LCD_OUTPUT_MAP and LCD_INPUT_MAP also must ////
//// be defined. ////
//// ////
//// Example of port access: ////
//// #define LCD_DATA_PORT getenv("SFR:PORTD") ////
//// ////
//// To use pin access, the following pins must be defined: ////
//// LCD_ENABLE_PIN ////
//// LCD_RS_PIN ////
//// LCD_RW_PIN ////
//// LCD_DATA4 ////
//// LCD_DATA5 ////
//// LCD_DATA6 ////
//// LCD_DATA7 ////
//// ////
//// Example of pin access: ////
//// #define LCD_ENABLE_PIN PIN_D0 ////
//// #define LCD_RS_PIN PIN_D1 ////
//// #define LCD_RW_PIN PIN_D2 ////
//// #define LCD_DATA4 PIN_D4 ////
//// #define LCD_DATA5 PIN_D5 ////
//// #define LCD_DATA6 PIN_D6 ////
//// #define LCD_DATA7 PIN_D7 ////
//// ////
///////////////////////////////////////////////////////////////////////////////
//// (C) Copyright 1996,2009 Custom Computer Services ////
//// This source code may only be used by licensed users of the CCS C ////
//// compiler. This source code may only be distributed to other ////
//// licensed users of the CCS C compiler. No other use, reproduction ////
//// or distribution is permitted without written permission. ////
//// Derivative programs created using this software in object code ////
//// form are not restricted in any way. ////
///////////////////////////////////////////////////////////////////////////

// define the pinout.
// only required if port access is being used.
typedef struct
{ // This structure is overlayed
BOOLEAN enable; // on to an I/O port to gain
BOOLEAN rs; // access to the LCD pins.
BOOLEAN rw; // The bits are allocated from
BOOLEAN unused; // low order up. ENABLE will
int data : 4; // be LSB pin of that port.
#if defined(__PCD__) // The port used will be LCD_DATA_PORT.
int reserved: 8;
#endif
} LCD_PIN_MAP;

// this is to improve compatability with previous LCD drivers that accepted
// a define labeled 'use_portb_lcd' that configured the LCD onto port B.
#if ((defined(use_portb_lcd)) && (use_portb_lcd==TRUE))
#define LCD_DATA_PORT getenv("SFR:PORTB")
#endif

#if defined(__PCB__)
// these definitions only need to be modified for baseline PICs.
// all other PICs use LCD_PIN_MAP or individual LCD_xxx pin definitions.
/* EN, RS, RW, UNUSED, DATA */
const LCD_PIN_MAP LCD_OUTPUT_MAP = {0, 0, 0, 0, 0};
const LCD_PIN_MAP LCD_INPUT_MAP = {0, 0, 0, 0, 0xF};
#endif

////////////////////// END CONFIGURATION ///////////////////////////////////

#ifndef LCD_ENABLE_PIN
#define lcd_output_enable(x) lcdlat.enable=x
#define lcd_enable_tris() lcdtris.enable=0
#else
#define lcd_output_enable(x) output_bit(LCD_ENABLE_PIN, x)
#define lcd_enable_tris() output_drive(LCD_ENABLE_PIN)
#endif

#ifndef LCD_RS_PIN
#define lcd_output_rs(x) lcdlat.rs=x
#define lcd_rs_tris() lcdtris.rs=0
#else
#define lcd_output_rs(x) output_bit(LCD_RS_PIN, x)
#define lcd_rs_tris() output_drive(LCD_RS_PIN)
#endif

#ifndef LCD_RW_PIN
#define lcd_output_rw(x) lcdlat.rw=x
#define lcd_rw_tris() lcdtris.rw=0
#else
#define lcd_output_rw(x) output_bit(LCD_RW_PIN, x)
#define lcd_rw_tris() output_drive(LCD_RW_PIN)
#endif

// original version of this library incorrectly labeled LCD_DATA0 as LCD_DATA4,
// LCD_DATA1 as LCD_DATA5, and so on. this block of code makes the driver
// compatible with any code written for the original library
#if (defined(LCD_DATA0) && defined(LCD_DATA1) && defined(LCD_DATA2) && defined(LCD_DATA3) && !defined(LCD_DATA4) && !defined(LCD_DATA5) && !defined(LCD_DATA6) && !defined(LCD_DATA7))
#define LCD_DATA4 LCD_DATA0
#define LCD_DATA5 LCD_DATA1
#define LCD_DATA6 LCD_DATA2
#define LCD_DATA7 LCD_DATA3
#endif

#ifndef LCD_DATA4
#ifndef LCD_DATA_PORT
#if defined(__PCB__)
#define LCD_DATA_PORT 0x06 //portb
#define set_tris_lcd(x) set_tris_b(x)
#else
#if defined(PIN_D0)
#define LCD_DATA_PORT getenv("SFR:PORTD") //portd
#else
#define LCD_DATA_PORT getenv("SFR:PORTB") //portb
#endif
#endif
#endif

#if defined(__PCB__)
LCD_PIN_MAP lcd, lcdlat;
#byte lcd = LCD_DATA_PORT
#byte lcdlat = LCD_DATA_PORT
#elif defined(__PCM__)
LCD_PIN_MAP lcd, lcdlat, lcdtris;
#byte lcd = LCD_DATA_PORT
#byte lcdlat = LCD_DATA_PORT
#byte lcdtris = LCD_DATA_PORT+0x80
#elif defined(__PCH__)
LCD_PIN_MAP lcd, lcdlat, lcdtris;
#byte lcd = LCD_DATA_PORT
#byte lcdlat = LCD_DATA_PORT+9
#byte lcdtris = LCD_DATA_PORT+0x12
#elif defined(__PCD__)
LCD_PIN_MAP lcd, lcdlat, lcdtris;
#word lcd = LCD_DATA_PORT
#word lcdlat = LCD_DATA_PORT+2
#word lcdtris = LCD_DATA_PORT-0x02
#endif
#endif //LCD_DATA4 not defined

#ifndef LCD_TYPE
#define LCD_TYPE 2 // 0=5x7, 1=5x10, 2=2 lines
#endif

#ifndef LCD_LINE_TWO
#define LCD_LINE_TWO 0x40 // LCD RAM address for the second line
#endif

BYTE const LCD_INIT_STRING[4] = {0x20 | (LCD_TYPE << 2), 0xc, 1, 6};
// These bytes need to be sent to the LCD
// to start it up.

BYTE lcd_read_nibble(void);

BYTE lcd_read_byte(void)
{
BYTE low,high;

#if defined(__PCB__)
set_tris_lcd(LCD_INPUT_MAP);
#else
#if (defined(LCD_DATA4) && defined(LCD_DATA5) && defined(LCD_DATA6) && defined(LCD_DATA7))
output_float(LCD_DATA4);
output_float(LCD_DATA5);
output_float(LCD_DATA6);
output_float(LCD_DATA7);
#else
lcdtris.data = 0xF;
#endif
#endif

lcd_output_rw(1);
delay_cycles(1);
lcd_output_enable(1);
delay_cycles(1);
high = lcd_read_nibble();

lcd_output_enable(0);
delay_cycles(1);
lcd_output_enable(1);
delay_us(1);
low = lcd_read_nibble();

lcd_output_enable(0);

#if defined(__PCB__)
set_tris_lcd(LCD_INPUT_MAP);
#else
#if (defined(LCD_DATA4) && defined(LCD_DATA5) && defined(LCD_DATA6) && defined(LCD_DATA7))
output_drive(LCD_DATA4);
output_drive(LCD_DATA5);
output_drive(LCD_DATA6);
output_drive(LCD_DATA7);
#else
lcdtris.data = 0x0;
#endif
#endif

return( (high<<4) | low);
}

BYTE lcd_read_nibble(void)
{
#if (defined(LCD_DATA4) && defined(LCD_DATA5) && defined(LCD_DATA6) && defined(LCD_DATA7))
BYTE n = 0x00;

/* Read the data port */
n |= input(LCD_DATA4);
n |= input(LCD_DATA5) << 1;
n |= input(LCD_DATA6) << 2;
n |= input(LCD_DATA7) << 3;

return(n);
#else
return(lcd.data);
#endif
}

void lcd_send_nibble(BYTE n)
{
#if (defined(LCD_DATA4) && defined(LCD_DATA5) && defined(LCD_DATA6) && defined(LCD_DATA7))
/* Write to the data port */
output_bit(LCD_DATA4, bit_test(n, 0));
output_bit(LCD_DATA5, bit_test(n, 1));
output_bit(LCD_DATA6, bit_test(n, 2));
output_bit(LCD_DATA7, bit_test(n, 3));
#else
lcdlat.data = n;
#endif

delay_cycles(1);
lcd_output_enable(1);
delay_us(2);
lcd_output_enable(0);
}

void lcd_send_byte(BYTE address, BYTE n)
{
lcd_output_rs(0);
while ( bit_test(lcd_read_byte(),7) ) ;
lcd_output_rs(address);
delay_cycles(1);
lcd_output_rw(0);
delay_cycles(1);
lcd_output_enable(0);
lcd_send_nibble(n >> 4);
lcd_send_nibble(n & 0xf);
}

void lcd_init(void)
{
BYTE i;

#if defined(__PCB__)
set_tris_lcd(LCD_OUTPUT_MAP);
#else
#if (defined(LCD_DATA4) && defined(LCD_DATA5) && defined(LCD_DATA6) && defined(LCD_DATA7))
output_drive(LCD_DATA4);
output_drive(LCD_DATA5);
output_drive(LCD_DATA6);
output_drive(LCD_DATA7);
#else
lcdtris.data = 0x0;
#endif
lcd_enable_tris();
lcd_rs_tris();
lcd_rw_tris();
#endif

lcd_output_rs(0);
lcd_output_rw(0);
lcd_output_enable(0);

delay_ms(15);
for(i=1;i<=3;++i)
{
lcd_send_nibble(3);
delay_ms(5);
}

lcd_send_nibble(2);
for(i=0;i<=3;++i)
lcd_send_byte(0,LCD_INIT_STRING[i]);
}

void lcd_gotoxy(BYTE x, BYTE y)
{
BYTE address;

if(y!=1)
address=LCD_LINE_TWO;
else
address=0;

address+=x-1;
lcd_send_byte(0,0x80|address);
}

void lcd_putc(char c)
{
switch (c)
{
case '\f' : lcd_send_byte(0,1);
delay_ms(2);
break;

case '\n' : lcd_gotoxy(1,2); break;

case '\b' : lcd_send_byte(0,0x10); break;

default : lcd_send_byte(1,c); break;
}
}

char lcd_getc(BYTE x, BYTE y)
{
char value;

lcd_gotoxy(x,y);
while ( bit_test(lcd_read_byte(),7) ); // wait until busy flag is low
lcd_output_rs(1);
value = lcd_read_byte();
lcd_output_rs(0);

return(value);
}

ElecTel
22-02-2011, 12:23 AM
mình làm được rồi ! !!!!!
cái file lcd trong bản CCS4.114 đó bị lỗi.....không biết nói gì hơn! Cảm ơn bạn.! nhờ những người nhiệt tình như bạn nên những tên gà như mình mới có cơ hội mở mang tầm mắt.....xin chân thành cảm ơn!!!