PDA

View Full Version : Ứng dụng 16F877A tạo nhiều menu LCD 16x2


slowlove
06-01-2010, 06:02 PM
e có làm 1 project tạo 1 menu trên LCD1602.Vấn đề đau đầu là khi số lượng menu tăng lên rất nhiều thì vấn đề điều khiển cũng gặp nhiều khó khăn cho người sử dụng...

trong project này e có tham khảo cách chọn menu của máy tính casio..thấy cũng khá hay.E đã cho thêm 1 con trỏ vào cho thêm sinh động và trực quan...tránh đc vc phải sử dụng thêm 4 phím để làm phím di chuyển con trỏ

ttrong 1 màn hình của LCD mình có định nghĩa 4 menu nhỏ đc gọi là 1 trang(page).Khi cần nhiều menu thì ta tạo ra nhiều trang =>số menu có đc là (page x 4).Để chọn menu nào thì ấn số tương ứng trên bàn phím...
ấn phím # thì k0 có tác dụng(bị block).Để chuyển page thì dùng phím 0 và phím =
để chọn chức năng tương ứng với menu ấn phím On/C
ở phần menu page cuối có phần option,có nhớ setting của người sử dụng lưu lúc trước và không hỏi lại mỗi khi chạy.ko bị mất khi mất nguồn.

cái này e chưa làm thử mà chỉ mô phỏng trên proteus thôi...mọi người xem rồi cho e ý kiến ...làm sao để thiết kế 1 menu với nhiều nhánh nhỏ bên trong mà ko bị loạn lên...??????

download mạch ở đây:
http://www.mediafire.com/?kdzjdtlgzjm
full code ở đây:
http://www.mediafire.com/download/2o11jrxif20rha6/Menu_LCD.rar

slowlove
06-01-2010, 11:44 PM
sao e ko up cái file rar lên 4fum đc nhỉ...đành up lên MF.
sao chưa thấy bác nào cho ý kiến nhỉ....???

nguyenhuytuong
07-01-2010, 08:41 AM
Bạn có thể up code lên để mọi người tham khảo được ko?

slowlove
07-01-2010, 10:28 AM
Đây là code chính của trương trình...ko đính kèm đc file nên các bạn xem tạm vì code quá dài...:D
ngoài ra thư viện cho LCD mình để life riêng,các chương trình trong menu mình cũng để riêng..
=========================================
#include <16F877A.h>
#device *=16 adc=10
#use delay(clock=20M)
#define lcd_4bit
#include <lcd_lib.c>
#include <menu_list.c>
#include <2416.c>
#fuses NOWDT,HS,NOPUT,NOPROTECT,NODEBUG,NOBROWNOUT,NOLVP, NOCPD,NOWRT
#priority int_timer2,int_timer0
/*******************************/
#bit OE = 0x08.7
/*----------*/
#bit c0 = 0x07.0
#bit c1 = 0x07.1
#bit c2 = 0x07.2
#bit c3 = 0x07.3
#bit c4 = 0x07.4
#bit c5 = 0x07.5
#bit c6 = 0x07.6
#bit c7 = 0x07.7
/*--------------*/
#byte portB=0x06
#byte portC=0x07
#byte portD=0x08
/*---------Dinh nghia Marco------------*/
#define kiemtra (c4+(c5<<1)+(c6<<2)+(c7<<3))
#define start_quetphim enable_interrupts(int_timer2)
#define stop_quetphim disable_interrupts(int_timer2)
/*---------------------------------------------*/
unsigned int1 chon_play;
unsigned int8 a,b;
unsigned int8 phim,chon_ct,chon_page,backup;
unsigned int8 data;
const unsigned char msg_ask[]={" YES 1 NO 2 "};
/*-----------------------------------------------------------------*/
/*----------------------cac chuong trinh con-----------------------*/
/*-----------------------------------------------------------------*/
void muiten(void){data=0x7e;display();}
void eraser(void){data=' ';display();}
/*----------------------*/
void contro(unsigned int8 dong,cot){
moveto(dong,cot);muiten();
delay_ms(20);
moveto(dong,cot);eraser();
delay_ms(20);
}
/*-----Loi Chao------*/
void wellcome(void){
const unsigned char msg1[]={"BAN QUYEN SP CUA"};
const unsigned char msg2[]={"Slowlove-(29/06)"};
for(a=0;msg1[a]!='\0';++a){data=msg1[a];display();}
moveto(2,1);
for(a=0;msg2[a]!='\0';++a){data=msg2[a];display();}
delay_ms(800);
}
/*------------------*/
void cau_hoi_xac_nhan(void){
const unsigned char msg1[]={"Co muon chay CT?"};
clear();
for(a=0;msg1[a]!='\0';++a){data=msg1[a];display();}
moveto(2,1);
for(a=0;msg_ask[a]!='\0';++a){data=msg_ask[a];display();}
}
/*------------------*/
void thong_bao_complete(void){
const unsigned char msg[]={"Complete !"};
clear();moveto(1,4);
for(a=0;msg[a]!='\0';++a){data=msg[a];display();} //Complete
delay_ms(200);
}
void thong_bao_resetpage(void){
const unsigned char msg1[]={"GO \"BEGIN_PAGE\" ?"};
clear();
for(a=0;msg1[a]!='\0';++a){data=msg1[a];display();}
moveto(2,1);
for(a=0;msg_ask[a]!='\0';++a){data=msg_ask[a];display();}
}
/*----------------------------------------------------------------------------*/
/*-----------------------------Chuong trinh chinh-----------------------------*/
/*----------------------------------------------------------------------------*/
#include <program.c>
void main(void){
setup_timer_0(rtcc_internal|rtcc_div_256);
setup_timer_2(t2_div_by_16,255,8);
enable_interrupts(int_timer0);
disable_interrupts(int_timer2);
enable_interrupts(global);
/*---------Cac lenh khoi tao ban dau-------*/
setup_adc_ports(no_analogs);
set_tris_a(0);
set_tris_c(0xf0);
set_tris_d(0x00);
portC=portD=0;
OE=0;
/*--------Cac lenh hien thi ban dau--------*/
khoitao(1,0);
cursor(1,0,0);
wellcome();
/*****************phan xu li chinh cua chuong trinh*********************/
while(true){
clear();
while(true)
{
start_quetphim;
menu_display(chon_page);
while((phim==0)||(phim==1)||(phim==2));
phim=4;
while(true)
{
if((phim==1)||(phim==2))break;
switch(phim){
case 0:goto thuc_hien_chuong_trinh;
case 4:stop_quetphim,backup=phim,contro(1,1),start_quet phim;break;
case 5:stop_quetphim,backup=phim,contro(1,9),start_quet phim;break;
case 6:stop_quetphim,backup=phim,contro(2,1),start_quet phim;break;
case 8:stop_quetphim,backup=phim,contro(2,9),start_quet phim;break;
default:stop_quetphim,phim=backup;}
}
stop_quetphim;
if(phim==2)++chon_page;
if((phim==1)&&(chon_page>0))--chon_page;
if(chon_page==8)chon_page=0;
}
/*-----------------------------------------------------------------------------*/
thuc_hien_chuong_trinh:
if(chon_page<7&&read_eeprom(1))
{
unsigned int8 backup_chon;
cau_hoi_xac_nhan();
while(phim==0);
stop_quetphim;
backup_chon=4;
while(true)
{
if(phim==0)break;
switch(phim){
case 4:stop_quetphim,backup_chon=phim,chon_play=0,contr o(2,2),start_quetphim;break;
case 5:stop_quetphim,backup_chon=phim,chon_play=1,contr o(2,9),start_quetphim;break;
default:stop_quetphim,phim=backup_chon;}
}
}
stop_quetphim;
if(chon_play==0||read_eeprom(1)==0||chon_page==7)
{
switch(backup)
{
case 4:chon_ct=(chon_page<<2)+1;break;
case 5:chon_ct=(chon_page<<2)+2;break;
case 6:chon_ct=(chon_page<<2)+3;break;
case 8:chon_ct=(chon_page<<2)+4;break;
}
chay_chuongtrinh(chon_ct);
thong_bao_complete(); //complete
if(chon_page>0&&chon_page<7&&read_eeprom(0))
{
unsigned int8 backup_chon;
unsigned int1 chon_reset;
thong_bao_resetpage();
start_quetphim;
while(phim==0);
backup_chon=4;
while(true)
{
if(phim==0)break;
switch(phim){
case 4:stop_quetphim,backup_chon=phim,chon_reset=0,cont ro(2,2),start_quetphim;break;
case 5:stop_quetphim,backup_chon=phim,chon_reset=1,cont ro(2,9),start_quetphim;break;
default:stop_quetphim,phim=backup_chon;}
}
stop_quetphim;
if(chon_reset==0)chon_page=0;
}
}
}
}
/*-----------------------------------------------------------------*/
/*------------Cac chuong trinh con phuc vu ngat timer--------------*/
/*-----------------------------------------------------------------*/
#int_ext
void ext(void){}
/*--------------------------*/
#int_timer0
void chose(void){
static unsigned int8 x,value0;
++value0;
if(value0==10){
output_a(3<<x++);
if(bit_test(x,3))x=0;
value0=0;
}
}
/*--------------------------*/
#int_timer1
void timer1(void){}
/*--------------------------*/
#int_timer2
void quet(void){
portC=1;
switch(kiemtra){
case 1:phim=12;break;
case 2:phim=13;break;
case 4:phim=14;break;
case 8:phim=15;break;
default:phim=16;}
portC=2;
switch(kiemtra){
case 1:phim=8;break;
case 2:phim=9;break;
case 4:phim=10;break;
case 8:phim=11;break;}
portC=4;
switch(kiemtra){
case 1:phim=4;break;
case 2:phim=5;break;
case 4:phim=6;break;
case 8:phim=7;break;}
portC=8;
switch(kiemtra){
case 1:phim=0;break;
case 2:phim=1;break;
case 4:phim=2;break;
case 8:phim=3;break;}
portC=0;
}
/*--------------------------*/

slowlove
07-01-2010, 08:00 PM
Đã >100 ng đọc mà ko thấy ai có ý kiến j hết là sao vậy ta...??

slowlove
30-01-2010, 02:59 AM
đã 250 ng đọc mà ko có ai có ý kiến là sao thế???
mọi ng đi đâu hết rùi...có mạch có code rồi mà....!!!

piano76
10-03-2010, 07:59 AM
e thấy khó wa sao ma cho ý kiến được

piano76
10-03-2010, 08:01 AM
a o dau zay.e voi a lam thử

slowlove
15-03-2010, 01:19 PM
Nick yahoo của mình là love_classicalguitar..
bạn nào cần nghiên cứa hc phát triển ứng dụng của mình thì liên hệ ...mình sẽ gửi bản full cho...
mình mới nghiên cứu hoàn chỉnh hệ thống hiển thj này thôi...con chưa biết làm j với nó...
hiện tại chương trình đã có 40 menu bao gồm 4 options có nhớ...
các chương trình đc thêm vào sau này mà ko làm ảnh hưởng tới chương trình lớn...

cskiller
15-03-2010, 02:18 PM
Nói chung tinh thần học hỏi, chia sẽ của bạn rất tốt. Tuy nhiên hiện thực menu trên LCD như thế này hơi khó đọc hiểu với các bạn ở mức độ 'bình dân' để có thể sử dụng lại code này. Cách hiện thức khác hiệu quả hơn là sử dụng danh sách con trỏ hàm, dễ dàng cho phép mở rộng cũng như đồng nhất các tính chất của sub menu. Kết hợp với sử dụng stack, các sub menu gọi sau thêm vào stack luôn là con, do đó nó nằm ở top và được xủ lý trước(hiển thị các sub menu con hoặc chọn lựa thực thi), khi thoát nó bị đẩy khỏi stack và sub menu cha của nó trước đó lạitrở thành top và tiếp tục quá trình, lặp cho đến khi stack trống nghĩa là về root.

Regards

pk178
15-03-2010, 07:18 PM
Chào bạn !!!

Mình cũng đã từng phải lập trình để tạo menu kiểu này. Thuật toán của mình như sau :

+ Phím menu nối vào 1 chân ngắt, của vxl, khi nào ấn menu -> xuất hiện ngắt -> bạn đặt 1 cờ tương ứng, giả sử lần đầu tiên xuất hiện ngắt, bạn đặt cờ có giá trị là 1, lần thứ 2 xuất hiện ngắt, bạn đặt cờ có giá trị là 2.

+ Chương trình chính sẽ liên tục kiểm tra trạng thái của cờ này để đưa ra chương trình con tương ứng với giá trị của cờ.

Cách làm trên có ưu điểm là nếu sau này bạn muốn mở rộng thêm các chức năng của chương trình như thêm các menu chẳng hạn, thì chỉ việc đặt thêm 1 cờ và 1 chương trình con tương ứng, chương trình cũ ko bị ảnh hưởng => dễ dàng cho việc nâng cấp firmware !

Hơn nữa chương trình trong ngắt như vậy sẽ ko quá dài, bạn ko bị gặp phải lỗi tràn stack (trước mình đã phải khổ sở với lỗi này)

Nói thật là mình cũng ko có đủ kiên nhẫn để đọc chương trình của bạn, hihi, mình nghĩ các bạn khác cũng thế nên ít người phản hồi lại cho bạn. Hơn nữa, bạn nên đưa thuật toán ra cho mọi người thảo luận thôi, chứ post cả code lên mạng thế kia thì đôi khi có những tình huống ko hay lắm hihi.

Thân ái !

carino289
04-04-2010, 10:10 AM
bạn nào có cái menu.c không cho tớ với.

trangthancb
25-11-2011, 02:35 PM
hi@ cảm ơn bạn đã share code nhé.
^_^