PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > PIC - Thiết kế và Ứng dụng

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

PIC - Thiết kế và Ứng dụng Ý tưởng cho các sản phẩm sử dụng PIC/dsPIC và các sản phẩm của Microchip

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 06-01-2010, 06:02 PM   #1
slowlove
Đệ tử 1 túi
 
Tham gia ngày: Mar 2006
Bài gửi: 15
:
Lightbulb Ứng dụng 16F877A tạo nhiều menu trên LCD 16x2

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/2o...6/Menu_LCD.rar

thay đổi nội dung bởi: slowlove, 04-07-2015 lúc 11:22 PM.
slowlove vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 06-01-2010, 11:44 PM   #2
slowlove
Đệ tử 1 túi
 
Tham gia ngày: Mar 2006
Bài gửi: 15
:
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ỉ....???
slowlove vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 07-01-2010, 08:41 AM   #3
nguyenhuytuong
Nhập môn đệ tử
 
Tham gia ngày: Dec 2009
Bài gửi: 10
:
Bạn có thể up code lên để mọi người tham khảo được ko?
nguyenhuytuong vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 07-01-2010, 10:28 AM   #4
slowlove
Đệ tử 1 túi
 
Tham gia ngày: Mar 2006
Bài gửi: 15
:
Post

Đâ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..
=========================================
Code:
#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_quetphim;break;
            case 5:stop_quetphim,backup=phim,contro(1,9),start_quetphim;break;
            case 6:stop_quetphim,backup=phim,contro(2,1),start_quetphim;break;
            case 8:stop_quetphim,backup=phim,contro(2,9),start_quetphim;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,contro(2,2),start_quetphim;break; 
      case 5:stop_quetphim,backup_chon=phim,chon_play=1,contro(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,contro(2,2),start_quetphim;break; 
                  case 5:stop_quetphim,backup_chon=phim,chon_reset=1,contro(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;
}
/*--------------------------*/

thay đổi nội dung bởi: slowlove, 07-01-2010 lúc 10:34 AM.
slowlove vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 04-04-2010, 10:10 AM   #5
carino289
Nhập môn đệ tử
 
Tham gia ngày: Mar 2010
Bài gửi: 1
:
Talking

bạn nào có cái menu.c không cho tớ với.

thay đổi nội dung bởi: carino289, 04-04-2010 lúc 10:21 AM.
carino289 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 07-01-2010, 08:00 PM   #6
slowlove
Đệ tử 1 túi
 
Tham gia ngày: Mar 2006
Bài gửi: 15
:
Đã >100 ng đọc mà ko thấy ai có ý kiến j hết là sao vậy ta...??

thay đổi nội dung bởi: slowlove, 08-01-2010 lúc 09:51 PM.
slowlove vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 30-01-2010, 02:59 AM   #7
slowlove
Đệ tử 1 túi
 
Tham gia ngày: Mar 2006
Bài gửi: 15
:
đã 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à....!!!
slowlove vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 10-03-2010, 07:59 AM   #8
piano76
Nhập môn đệ tử
 
Tham gia ngày: Mar 2010
Bài gửi: 2
:
e thấy khó wa sao ma cho ý kiến được
piano76 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 10-03-2010, 08:01 AM   #9
piano76
Nhập môn đệ tử
 
Tham gia ngày: Mar 2010
Bài gửi: 2
:
a o dau zay.e voi a lam thử
piano76 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 15-03-2010, 01:19 PM   #10
slowlove
Đệ tử 1 túi
 
Tham gia ngày: Mar 2006
Bài gửi: 15
:
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...
slowlove vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 15-03-2010, 02:18 PM   #11
cskiller
Đệ tử 4 túi
 
Tham gia ngày: Aug 2008
Bài gửi: 89
:
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
__________________
Quang báo RG/RGB 6/8/12/16 bits màu
Phone No: 0905.034.086
Email: lmquyen@gmail.com
cskiller vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 15-03-2010, 07:18 PM   #12
pk178
Đệ tử 5 túi
 
Tham gia ngày: Jan 2009
Bài gửi: 100
:
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 !
pk178 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 25-11-2011, 02:35 PM   #13
trangthancb
Nhập môn đệ tử
 
Tham gia ngày: Apr 2011
Bài gửi: 5
:
hi@ cảm ơn bạn đã share code nhé.
^_^
trangthancb vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 04:01 PM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam