PDA

View Full Version : LCD va HEx


tomato2711
27-04-2011, 01:26 AM
Nhờ các bác giúp e với!
Em viết chương trình quét phím hex hiển thị LCD, nhưng hiển thị bị lỗi, nhờ anh chỉnh sửa dùm em! Cám ơn các bác nhiều!
Trong file em gửi có file thư viện LCD 8 bit kết nối portD, phim hex kết nối portB và có dùng ngắt portb, nếu sai gì nhờ anh chỉnh lại dùm em! Trong file có sẳn file mạch mô phỏng protues lun để hiển thị!

tdm
27-04-2011, 12:37 PM
Nhờ các bác giúp e với!
Em viết chương trình quét phím hex hiển thị LCD, nhưng hiển thị bị lỗi, nhờ anh chỉnh sửa dùm em! Cám ơn các bác nhiều!
Trong file em gửi có file thư viện LCD 8 bit kết nối portD, phim hex kết nối portB và có dùng ngắt portb, nếu sai gì nhờ anh chỉnh lại dùm em! Trong file có sẳn file mạch mô phỏng protues lun để hiển thị!
while(true)
{

portb=1;
portb=2;
portb=4;
portb=8;
hienthi();
}
bạn viết thế này thì phím không nhấn nó cũng hiển thị ra lcd.

tomato2711
27-04-2011, 03:09 PM
while(true)
{

portb=1;
portb=2;
portb=4;
portb=8;
hienthi();
}
bạn viết thế này thì phím không nhấn nó cũng hiển thị ra lcd.

VẬY viết lại SAO?bạn chỉnh lại dùm mình đi!

tdm
27-04-2011, 04:45 PM
VẬY viết lại SAO?bạn chỉnh lại dùm mình đi!
code:

//************************************************** ***************************
// Author : nhh
// Date : 03/04/06
// Hardware: PIC16F877A
//************************************************** ***************************
#include <16F877A.h>
#include <defs_16F877A.h>
#include <lcd_lib.c>
#fuses NOWDT,PUT,XT,NOPROTECT
#use delay(clock=4000000)
#use fast_io(b)
#use fast_io(d)
void hienthi(void);
int a,i;
const unsigned char dig[]={"0123456789abcdef"};
// ma hoa digital duoi dang mang
// Chuong trinh ngat
#int_RB
void ngat_RB()
{
if((RBIF)&&(RBIE))
{
{
if(RB4&&RB0)
a=dig[0];
}
{
if(RB4&&RB1)
a=dig[4];
}
{
if(RB4&&RB2)
a=dig[8];
}
{
if(RB4&&RB3)
a=dig[12];
}
//.......
{
if(RB5&&RB0)
a=dig[1];
}
{
if(RB5&&RB1)
a=dig[5];
}
{
if(RB5&&RB2)
a=dig[9];
}
{
if(RB5&&RB3)
a=dig[13];
}
//........
{
if(RB6&&RB0)
a=dig[2];
}
{
if(RB6&&RB1)
a=dig[6];
}
{
if(RB6&&RB2)
a=dig[10];
}
{
if(RB6&&RB3)
a=dig[14];
}
//........
{
if(RB7&&RB0)
a=dig[3];
}
{
if(RB7&&RB1)
a=dig[7];
}
{
if(RB7&&RB2)
a=dig[11];
}
{
if(RB7&&RB3)
a=dig[15];
}
RBIF=0; //Xoa co ngat RB
}
hienthi();
while(bit_test(PORTB,4))
{
}
while(bit_test(PORTB,5))
{
}
while(bit_test(PORTB,6))
{
}
while(bit_test(PORTB,7))
{
}
delay_ms(1);//chong nay phim

}
// Chuong trinh chinh
main()
{
set_tris_b(0b11110000);
set_tris_d(0);
set_tris_e(0);
enable_interrupts(global);
enable_interrupts(int_RB);
ext_int_edge(H_to_L);
portb=0;
portc=0;
lcd_init();
lcd_putcmd(0x01);
printf(lcd_putchar,"gia tri phim:");
lcd_putcmd(0xc0);
while(true)
{
portb=1;
portb=2;
portb=4;
portb=8;

}
}

void hienthi()
{
lcd_putcmd(0xc0);
printf(lcd_putchar," ");
lcd_putcmd(0xc0);
lcd_putchar(a);// doc gia tri nut nhan lên man hinh LCD
}

tomato2711
27-04-2011, 10:45 PM
cảm ơn TDM nha ! có chổ chống nảy phím hơi khó hiểu!

tomato2711
27-04-2011, 11:35 PM
void hienthi()
{
lcd_putcmd(0xc0); //xóa
printf(lcd_putchar," "); //xóa
lcd_putcmd(0xc0); //xóa
lcd_putchar(a);// doc gia tri nut nhan lên man hinh LCD
}

Em vừa xóa thử 3 dòng trong hienthi của tdm, thì LCD hiển thị nút nhấn nhanh hơn, nên ko bit2 3 dòng có tác dụng gì? (biết là có 1 lệnh ép con trỏ về đầu dòng)
Em sửa lại code hiển thị để LCD hiển thị 11 số,
void hienthi()
{

lcd_putchar(a);// doc gia tri nut nhan lên man hinh LCD
i=i+1;
if (i>12)
{
i=0;
lcd_putcmd(0x01);
printf(lcd_putchar,"gia tri phim:");
lcd_putcmd(0xc0);
}
}
nhưng ko hiểu sao:
1/ số đầu tiên lại ko hiển thị ngay ô đầu dòng, mà hiển thị ô kế bên (khi nhập lần 2 mới đc đầu dỏng)
2/ phím nhấn có lúc lại hiển thị số double( khi nhấn 1 lần nhưng lại hiển thị liên tục 2 số, thỉnh thoảng bị )

tdm
28-04-2011, 02:22 PM
void hienthi()
{
lcd_putcmd(0xc0); //xóa
printf(lcd_putchar," "); //xóa
lcd_putcmd(0xc0); //xóa
lcd_putchar(a);// doc gia tri nut nhan lên man hinh LCD
}

Em vừa xóa thử 3 dòng trong hienthi của tdm, thì LCD hiển thị nút nhấn nhanh hơn, nên ko bit2 3 dòng có tác dụng gì? (biết là có 1 lệnh ép con trỏ về đầu dòng)
Em sửa lại code hiển thị để LCD hiển thị 11 số,
void hienthi()
{

lcd_putchar(a);// doc gia tri nut nhan lên man hinh LCD
i=i+1;
if (i>12)
{
i=0;
lcd_putcmd(0x01);
printf(lcd_putchar,"gia tri phim:");
lcd_putcmd(0xc0);
}
}
nhưng ko hiểu sao:
1/ số đầu tiên lại ko hiển thị ngay ô đầu dòng, mà hiển thị ô kế bên (khi nhập lần 2 mới đc đầu dỏng)
2/ phím nhấn có lúc lại hiển thị số double( khi nhấn 1 lần nhưng lại hiển thị liên tục 2 số, thỉnh thoảng bị )
int a,i=0x00;//gán i=0x00 ngay tại đầu ct sẽ hết lỗi (1)
lỗi (2):
viết lại như sau:
while(bit_test(PORTB,4))
{
}
delay_ms(10);//chong nay phim
while(bit_test(PORTB,5))
{
}
delay_ms(10);//chong nay phim
while(bit_test(PORTB,6))
{
}
delay_ms(10);//chong nay phim
while(bit_test(PORTB,7))
{
}
delay_ms(10);//chong nay phim
chèn thêm lệnh delay_ms(10) sau mỗi lần thoát khỏi while

tomato2711
28-04-2011, 02:28 PM
int a,i=0x00;//gán i=0x00 ngay tại đầu ct sẽ hết lỗi (1)
lỗi (2):
viết lại như sau:
while(bit_test(PORTB,4))
{
}
delay_ms(10);//chong nay phim
while(bit_test(PORTB,5))
{
}
delay_ms(10);//chong nay phim
while(bit_test(PORTB,6))
{
}
delay_ms(10);//chong nay phim
while(bit_test(PORTB,7))
{
}
delay_ms(10);//chong nay phim
chèn thêm lệnh delay_ms(10) sau mỗi lần thoát khỏi while

oh yeah! cám ơn anh tdm rất nhìu, bít thêm chút ít nữa. Cám ơn anh đã chỉ giáo

tomato2711
28-04-2011, 02:41 PM
à, em muốn hỏi thêm tí, vậy nếu em muốn truyền thêm i2c để lưu vào epprom ngoài (24c256) thì sẽ gọi trong phần hienthi phai ko? và nếu em lưu vào con 24c256 thì làm sao để biết là nó đã lưu vào rồi hay chưa? vì nếu con savle là con pic thì minh ktra đc, còn con này thì e potay

yahoo em: nhoc_tomato2711@yahoo.com

tdm
28-04-2011, 04:28 PM
à, em muốn hỏi thêm tí, vậy nếu em muốn truyền thêm i2c để lưu vào epprom ngoài (24c256) thì sẽ gọi trong phần hienthi phai ko? và nếu em lưu vào con 24c256 thì làm sao để biết là nó đã lưu vào rồi hay chưa? vì nếu con savle là con pic thì minh ktra đc, còn con này thì e potay

yahoo em: nhoc_tomato2711@yahoo.com
ghi vào eeprom rồi đọc lại kiểm tra.
nếu giá tri đọc được bằng giá trị ghi vào thì ghi đã ok

tomato2711
28-04-2011, 04:46 PM
ghi vào eeprom rồi đọc lại kiểm tra.
nếu giá tri đọc được bằng giá trị ghi vào thì ghi đã ok

hi, để em viết thử, có gì nhờ anh chỉnh tiếp dùm em. Thank anh nhiều. Anh có yahoo ko để em tiện liên lạc

tomato2711
29-04-2011, 12:05 AM
cho em hỏi tiếp, con 24c256 em xem datasheet nhưng ko thấy dãy địa chỉ của nó, nên nếu mình ghi thì nó sẽ lưu từ đâu? nếu muốn liên tục, mỗi lần 10byte , vậy khi đọc lại thì mình đâu bít địa chỉ để lấy ra?

tdm
29-04-2011, 09:48 AM
cho em hỏi tiếp, con 24c256 em xem datasheet nhưng ko thấy dãy địa chỉ của nó, nên nếu mình ghi thì nó sẽ lưu từ đâu? nếu muốn liên tục, mỗi lần 10byte , vậy khi đọc lại thì mình đâu bít địa chỉ để lấy ra?
con 24c256 là eeprom 32k.
d/c nằm trong khoảng từ 0.......32768.
ghi 10 byte:
dia_chi=0x0000;
for(dem=0;dem<=10;dem++)
{
data=num[dem];
write_ext_eeprom(dia_chi, data);
dia_chi++;
}
đoc:
dia_chi=0x0000;
for(dem=0;dem<=10;dem++)
{
data=read_ext_eeprom(dia_chi);
putc(data);//đưa dữ liệu lên máy tính kiểm tra
dia_chi++;
}

tomato2711
29-04-2011, 10:05 AM
con 24c256 là eeprom 32k.
d/c nằm trong khoảng từ 0.......32768.
ghi 10 byte:
dia_chi=0x0000;
for(dem=0;dem<=10;dem++)
{
data=num[dem];
write_ext_eeprom(dia_chi, data);
dia_chi++;
}
đoc:
dia_chi=0x0000;
for(dem=0;dem<=10;dem++)
{
data=read_ext_eeprom(dia_chi);
putc(data);//đưa dữ liệu lên máy tính kiểm tra
dia_chi++;
}

Cám ơn anh nhiều, để em nghiên cứu tiếp! Rất cảm ơn anh! ^^

tomato2711
30-04-2011, 11:56 PM
Em đã viết đc truyền i2c cơ bản và đọc lại được, nhưng khi ráp vào mạch lcd trên, thì nó lưu nhưng khi đọc lại thì nó hiển thị lên LCD bị lỗi.
Yêu cầu hiện tại của em là:

Nhấn số điện thoại lên LCD, sau đó lưu vào eeprom 24c256, sau đó kiểm tra lại số đã lưu bằng cách đọc lại và hiển thị lại LCD

LỖI em bị là:
1/ Khi nhấn phím thứ nhất, LCD hiển thị bình thường, nhưng khi nhấn phím thứ 2, LCD lại hiển thị số thứ 1, lỗi này thường xuyên bị. Em đã delay chống nảy phím lên 50ms nhưng vẫn ko có kết quả. =.=
2/ Khi nhấn lưu số, thì sau khi lưu xong thì xóa số trên LCD để hiển thị số điện thoại thứ 2, nhưng nó ko xóa mà hiển thị sai thêm =.=

3/ Đọc lại dữ liệu hiển thị trong LCD thì nó lại hiển thị 10 ô đen và 1 số cuối. cái này em ko bít sửa lun.
Nhờ anh chỉnh lại dùm em
p/s: các file thư viện và mô phỏng em để chung trong file đình kèm
Cám ơn anh đã giúp em mấy ngày nay!

tdm
01-05-2011, 09:57 PM
Em đã viết đc truyền i2c cơ bản và đọc lại được, nhưng khi ráp vào mạch lcd trên, thì nó lưu nhưng khi đọc lại thì nó hiển thị lên LCD bị lỗi.
Yêu cầu hiện tại của em là:

Nhấn số điện thoại lên LCD, sau đó lưu vào eeprom 24c256, sau đó kiểm tra lại số đã lưu bằng cách đọc lại và hiển thị lại LCD

LỖI em bị là:
1/ Khi nhấn phím thứ nhất, LCD hiển thị bình thường, nhưng khi nhấn phím thứ 2, LCD lại hiển thị số thứ 1, lỗi này thường xuyên bị. Em đã delay chống nảy phím lên 50ms nhưng vẫn ko có kết quả. =.=
2/ Khi nhấn lưu số, thì sau khi lưu xong thì xóa số trên LCD để hiển thị số điện thoại thứ 2, nhưng nó ko xóa mà hiển thị sai thêm =.=

3/ Đọc lại dữ liệu hiển thị trong LCD thì nó lại hiển thị 10 ô đen và 1 số cuối. cái này em ko bít sửa lun.
Nhờ anh chỉnh lại dùm em
p/s: các file thư viện và mô phỏng em để chung trong file đình kèm
Cám ơn anh đã giúp em mấy ngày nay!
bài eeprom trước chỉ là cách đoc và ghi eeprom.
còn ứng dụng vào bài của em phải viết cách khác.

tomato2711
01-05-2011, 11:12 PM
bài eeprom trước chỉ là cách đoc và ghi eeprom.
còn ứng dụng vào bài của em phải viết cách khác.

vâng, để em viết lại thử, có gì nhờ anh anh sửa lại dùm em!

tomato2711
01-05-2011, 11:21 PM
à, em không hiểu ở chổ mình lưu 10 số trên lcd vào eeprom. Khi nhấn 10 số, mình lưu vào 1 thanh ghi đệm, sau đó lưu vào eeprom phải ko anh? Nhưng ko hiểu lưu liên tục như thế nào?