Thông báo

Collapse
No announcement yet.

Tạo LCD Menu như thế nào?

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Tạo LCD Menu như thế nào?

    Hôm trước có việc em phải làm một menu đa cấp hiển thị trên LCD 2x16. Nó làm em suy nghĩ cũng nhiều. Download và in hẳn cái chương trình LCD Menu viết cho PIC của bác minhtuan04 ra giấy để ngồi nghiên cứu. Em cũng nghiên cứu các source code mẫu ở trên nhiều trang web nước ngoài. Em nhận thấy tất cả đều rất cồng kềnh và phải khai báo khá nhiều hàm phụ trợ cho chương trình menu này.

    Em mới "phát minh" ra một cách rất đơn giản. Menu có thể có rất nhiều cấp, rất nhiều nhánh mà chỉ phải khai báo cái menu ban đầu trong bộ nhớ flash, còn trong chương trình chính gần như không sử dụng bất kỳ hàm phụ trợ nào (chẳng hạn các hàm kiểm tra menu có menu con không, nếu không có thì thực thi hàm nào đó, nếu có thì bung menu cấp nhỏ hơn...). Nếu các bác có nhu cầu thì cho em biết em sẽ làm một cái tutorial nho nhỏ về vấn đề này.
    Last edited by namqn; 08-08-2008, 02:28. Lý do: Unicode tổ hợp -> Unicode
    Email: - Mobil: tạm thời ngừng liên lạc 1 thời gian
    Giới thiệu website kiếm tiền trực tuyến & tăng thứ hạng website.

  • #2
    Nguyên văn bởi nghaiha Xem bài viết
    Nếu các bác có nhu cầu thì cho em biết em sẽ làm một cái tutorial nho nhỏ về vấn đề này.


    Còn gì bằng nữa anh Hà nhỉ, nếu source code không thì đọc mệt chết đi, đằng này tutorial thì quá đã rồi còn gì, cám ơn anh trước nha
    Diễn đàn Vi điều khiển:

    Comment


    • #3
      Dưới đây là một dạng MENU LCD nè, bạn tham khảo nhé:
      Code:
      #define  MAXID	13
      code char *MENU[]={		//KHAI BAO PHAN HIEN THI
      "0.UPDATE & EXIT",			//Thoat khoi menu
      "1.COUNTER START",			//gia tri bat dau		SS voi End de chon: Up/Down
      "2.COUNTER END",			//gia tri cuoi cung
      "3.COUNTER STEP",			//buoc nhay 
      "4.COUNTER SET",			//buoc nhay 
      "5.IJP COLUME",			//Cap nhat vao cot
      "6.TARGET DELAY",			//Thoi gian tre giua truyen dlieu va xuat tin hieu in
      "7.TEST SEND",
      //"7.SEND MODE",		//OnLine / OffLine : neu OffLine mode thi phai send Online truoc
      					//					 sau do send dlieu, va tiep theo la send offline
      "8.PULSE/COUNT",			//Pulse / 1m (step)
      "9.ENCODER MODE",		//Up/Down or Up Only
      "A.SAVE PARAM",			//Mac dinh se duoc luu vao msg0
      "B.LOAD PARAM",			//Goi lai cac thiet lap truoc
      "C.RESET ALL",
      };
      
      code void *CMD[]={	//KHAI BAO TEN HAM TUONG UNG VOI MENU TREN
      	f_Exit,
      	f_Start,
      	f_End,
      	f_Step,
      	f_Set,
      	f_Colume,
      	f_Delay,
      	f_Snd,
      	f_Pulse,
      	f_Enc,
      	f_Save,
      	f_Load,
      //	f_Finish,			//Auto update
      	f_Reset
      };
      
      char	DoCmd(char CmdId);
      
      char	MenuCmd(void){
      	char id;
      	char k;
      	char Rew;
      	char For;
      	id=0;
      	For=1;		//Next +
      	Rew=MAXID-1;	//Next -
      
      	Lcd_clear_line(LINE1);
      	Lcd_clear_line(LINE2);
      	Lcd_print_string(LINE1+1,MENU[id]);
      	Lcd_set_cursor(LINE1);
      	Lcd_print_char('>');
      	Lcd_print_string(LINE2+1,MENU[For]);
      
      	while(1){
      
      //		CheckPulse();
      //		CheckOutput();	//Output to IJP
      
      		if(keypressed()){		// NEU CO PHIM DUOC NHAN	
      			k=getchar();		// DOC PHIM VAO
      
      			if(k==27)	return -1;	// ESC
      	
      			if(k=='+'){			// DI CHUYEN TRONG MENU
      				Rew=id;
      				id=For;
      				if(For<MAXID-1) For++;
      				else	For=0;
      			}
      			if(k=='-'){			// DI CHUYEN TRONG MENU
      				For=id;
      				id=Rew;
      				if(Rew>0)	Rew--;
      				else	Rew=MAXID-1;
      			}
      
      			if(k=='\n'){		//NEU NHAN ENTER
      				if(MENU[id][0]=='0'){
      					//Nap thong so hien tai vao param[0]
      					//De khi tat may, mo may lai tham so se tro lai			
      					//**Neu cup dien khi dang lap trinh thi khi khoi dong lai
      					//**he thong se nap thong so param[0] vao may gay loi .. .
      					f_Finish();	
      					return 0;	//exit
      				}
      				else DoCmd(id);		// GOI HAM CON TUONG UNG VOI MENU ID HIEN TAI
      
      			} //endif(k=='\n')
      			Lcd_clear_line(LINE1);
      			Lcd_clear_line(LINE2);
      			Lcd_print_string(LINE1+1,MENU[id]);		// HIEN THI MENU HIEN TAI O DONG 1
      			Lcd_set_cursor(LINE1);
      			Lcd_print_char('>');
      			Lcd_print_string(LINE2+1,MENU[For]);	// MENU TIEP THEO O DONG 2
      		}//endif(keypressed)
      	}//endwhile(1)
      }
      
      char	DoCmd(char CmdId){				// GOI HAM TUONG UNG KHI ENTER VAO MENU
      	(*(void(*)(void))(CMD[CmdId]))();
      	return CmdId;
      }
      //-------------------
      
      void f_Start(){		//;gia tri dem bat dau		
      	param[0].Start=LcdGetNum("START:0-99999999",param[0].Start,0,99999999);
      }
      
      void f_End(){		//;gia tri ket thuc(if End<Sart -> Cnt Down)
      	param[0].End=LcdGetNum("END:0-99999999",param[0].End,0,99999999);
      }
      
      void f_Step(){		//;buoc dem
      	param[0].Step=LcdGetNum("STEP:1-99",param[0].Step,1,99);
      }
      
      void f_Set(){		//Set lai so dem
      	if(SetCurFlag==0) CurTmp=Current;
      	CurTmp=LcdGetNum("COUNTER SET",CurTmp,param[0].Start,param[0].End);
      	SetCurFlag=1;	//Co cap nhat khi thoat khoi menu
      }
      
      void f_Colume(){	//;Cot xuat ra may in
      	param[0].Colume=LcdGetNum("COLUME:1-24",param[0].Colume,1,24);
      }
      void f_Delay(){		//;Thoi gian Delay tin hieu in sau khi goi noi dung
      	param[0].Delay=LcdGetNum("DELAY:(0-9999)ms",param[0].Delay,0,9999);
      }
      void f_Pulse(){		//;So xung ung voi 1 m
      	param[0].Pulse=LcdGetNum("PULSE:1-99999999",param[0].Pulse,1,99999999);
      }
      void f_Enc(){		//;Che do Encode: Up/Down or Up Only
      	code char *SEL[]={
      		"Up/Down","Up Only"
      	};	
      	param[0].UpDown=LcdSelect("ENCODER MODE",param[0].UpDown,SEL,1);
      }
      /*
      void f_Snd(){		//;Mode:OnLine
      	code char *SEL[]={
      		"OffLine","OnLine"
      	};
      	param[0].Send=LcdSelect("SEND MODE:",param[0].Send,SEL,1);	
      }
      */
      void f_Snd(){		
      	Outputinproc=1;		//bat bau truyen
      	tx("RECEIVE OK");
      	Outputinproc=0;		//da truyen xong
      }
      
      void f_Save(){		//;Luu thiet lap
      	char	msg;
      	msg=LcdGetNum("SAVE PARAM:(1-4)",1,1,4);	
      	memcpy(&param[msg],&param[0],18);	//size of PARAM
      }
      void f_Load(){		//;Goi lai thiet lap
      	char	msg;
      	msg=LcdGetNum("LOAD PARAM:(1-4)",1,1,4);	
      	memcpy(&param[0],&param[msg],18);	//size of PARAM	
      }
      void f_Finish(){	//;Ket thuc va thay doi cac gia tri da thiet lap
      
      	Start=param[0].Start;
      	End=param[0].End;
      	Step=param[0].Step;
      	Colume=param[0].Colume;
      	Delay=param[0].Delay;
      	Pulse=param[0].Pulse;
      	UpDown=(param[0].UpDown);		//=0:Up/Down 1:Up Only
      	Send=(param[0].Send);			//0:Offline 1:Online
      
      	if(SetCurFlag){
      		Current=CurTmp;
      		SetCurFlag=0;
      	}
      
      	CntMode=1;						//printer cnt mode : up
      	if(Start>End){
      		CntMode=0;		// down
      	}
      }
      
      void f_Reset(void){
      	Current=Start;
      	CurPulse=0;
      }
      
      void f_Exit(){		//;Thoat khong thay doi gia tri dang chay
      
      }
      Last edited by namqn; 08-08-2008, 02:27. Lý do: định dạng code để tránh xuất hiện emoticons

      Comment


      • #4
        Nguyên văn bởi digicom Xem bài viết
        Dưới đây là một dạng MENU LCD nè, bạn tham khảo nhé:
        Đúng rồi đấy bác, khai báo các con trỏ trỏ đến các hàm là một ý kiến rất hay. Chỉ còn một chút nữa để khai báo được menu đa cấp, một menu có số lượng nhánh con bất kỳ.
        Email: - Mobil: tạm thời ngừng liên lạc 1 thời gian
        Giới thiệu website kiếm tiền trực tuyến & tăng thứ hạng website.

        Comment


        • #5
          Nguyên văn bởi minhtuan04 Xem bài viết


          Còn gì bằng nữa anh Hà nhỉ, nếu source code không thì đọc mệt chết đi, đằng này tutorial thì quá đã rồi còn gì, cám ơn anh trước nha
          Đã nói source code đơn giản mà đọc là hiểu thôi. Chứ còn viết tutorial, rồi trình bày như cái của em thì cũng phải lâu lâu chứ.

          Ủa, mà tưởng em chỉ xài PIC thôi mà?
          Email: - Mobil: tạm thời ngừng liên lạc 1 thời gian
          Giới thiệu website kiếm tiền trực tuyến & tăng thứ hạng website.

          Comment


          • #6
            Bạn nghaiha thêm phần MENU con cho moi người tham khảo đi

            Comment


            • #7
              Kiểu menu LCD này tớ cũng hay gặp lắm và hay mất thời gian nữa. Nó còn gọi là trang mẹ, trang con, trang cháu, trang... Khi mới xây dựng chương trình thì thường dàn trải ra, sẽ rất dài, nhiều khi lặp lại trong các lần gọi khác nhau. Nếu khéo sắp xếp thì trong nhiều ch.trình có thể giảm được 7 phần bộ nhớ FLASH dành cho nó. Tớ cũng hay dùng mảng [] thông qua con trỏ, có lúc các mảng phải lổng vào nhau 2, 3 cấp mới tới dữ liệu mong muốn.
              Đi kèm mới menu là phím nhấn tương ứng (lên, xuống, chọn, thoát,...); là hàm đc gọi tương ứng; là dữ liệu thay đổi tương ứng. Lắm lúc rối tung cả lên...
              Dùng AT89xxx mà lập trình có xây dựng menu LCD thì quả là "phê", đặc biệt là dùng ASM
              !e

              Comment


              • #8
                Nguyên văn bởi zemen Xem bài viết
                Kiểu menu LCD này tớ cũng hay gặp lắm và hay mất thời gian nữa. Nó còn gọi là trang mẹ, trang con, trang cháu, trang... Khi mới xây dựng chương trình thì thường dàn trải ra, sẽ rất dài, nhiều khi lặp lại trong các lần gọi khác nhau. Nếu khéo sắp xếp thì trong nhiều ch.trình có thể giảm được 7 phần bộ nhớ FLASH dành cho nó. Tớ cũng hay dùng mảng [] thông qua con trỏ, có lúc các mảng phải lổng vào nhau 2, 3 cấp mới tới dữ liệu mong muốn.
                Đi kèm mới menu là phím nhấn tương ứng (lên, xuống, chọn, thoát,...); là hàm đc gọi tương ứng; là dữ liệu thay đổi tương ứng. Lắm lúc rối tung cả lên...
                Dùng AT89xxx mà lập trình có xây dựng menu LCD thì quả là "phê", đặc biệt là dùng ASM
                Dù có khó nhưng đến lúc cần thì cũng phải làm. Có khó mới có vinh quang, làm được rồi mới thấy sướng. Digicom nghĩ rằng với ý kiến đóng góp của nhiều người thì cũng sẽ tìm được những giải pháp tốt hơn. Các bạn nào có kinh nghiệm nhờ đóng góp tiếp đề tài này nhé.

                Comment


                • #9
                  Nó khó ở đây là ý tưởng sắp xếp lại các menu. Ngày xưa bọn em đã viết menu bằng pascal trên màn hình dos từ khoảng năm 95 (năm em học lớp 10). Hồi đó cũng đã biết đau đầu về chuyện menu rẽ nhánh thì xử lý thế nào.

                  Ý tưởng trong cái LCD Menu này khá đơn giản nhưng hiệu quả. Các bác chờ em giải quyết xong cái Tutorial cũ của em đã nhé.
                  Email: - Mobil: tạm thời ngừng liên lạc 1 thời gian
                  Giới thiệu website kiếm tiền trực tuyến & tăng thứ hạng website.

                  Comment


                  • #10
                    Các bác này!
                    Em đã kêu gọi anh em cùng nghiên cứu hoàn thành vài mô hình menu để dùng cho đỡ đau đầu
                    http://dientuvietnam.net/forums/showthread.php?t=15651
                    vậy mà anh em chằng cho ý kiến, lại bàn riêng ở đây...
                    Chương trình em đang làm thì xây dựng mô hình và giải thuật khá nhanh, nhưng lập trình cụ thể thì rối quá, liên tục gặp vòng lặp, đã thế lại liên quan đến sự kiện bàn phím. Cũng có thể do mình làm hơi nông dân.
                    Mình phải xây dựng được một khung hoàn chỉnh để có thể gắpnhúng nó vào chương trình ứng dụng thì làm mới hiệu quả được. Chứ lần nào cũng đau đầu thì...
                    Cảm ơn sự giúp đỡ của minhtuan04 bên luồng Giải thuật lập trình menu!

                    Comment


                    • #11
                      Vậy em sẽ cố gắng đưa thử một chương trình mẫu để các bác tham khảo nhé. Gọi là version 0.1. Chúng ta sẽ phát triển dần để có một Menu hoàn thiện. Mục tiêu của chúng ta là làm cách nào để khai báo ít nhất, khi chạy chương trình tốn RAM ít nhất, khi thay đổi thêm thắt menu thì số dòng trong source code phải thay đổi là ít nhất và quan trọng nhất là số nhánh của menu con phải là không hạn chế đúng không?

                      Bác nào cho em một cây menu tiêu biểu đi nào. Chú ý LCD Menu 2 dòng x 16 ký tự nhé.
                      Email: - Mobil: tạm thời ngừng liên lạc 1 thời gian
                      Giới thiệu website kiếm tiền trực tuyến & tăng thứ hạng website.

                      Comment


                      • #12
                        Nguyên văn bởi KnowMore Xem bài viết
                        Mình phải xây dựng được một khung hoàn chỉnh để có thể gắpnhúng nó vào chương trình ứng dụng thì làm mới hiệu quả được. Chứ lần nào cũng đau đầu thì...
                        Cảm ơn sự giúp đỡ của minhtuan04 bên luồng Giải thuật lập trình menu!
                        Cố gắng làm sao cho đơn giản nhất nhưng để đạt được sự gắp nhúng giống như ăn lẩu như bác nói thì cũng còn phải cố gắng nhiều. À hay là phát triển kiểu như viết một application, trong đó khai báo các menu. Rồi application này sinh code LCD Menu AVR cho mình nhỉ?

                        Nhưng như vậy vẫn bị hạn chế là khi thay đổi menu thì cũng lích kích nhỉ?
                        Email: - Mobil: tạm thời ngừng liên lạc 1 thời gian
                        Giới thiệu website kiếm tiền trực tuyến & tăng thứ hạng website.

                        Comment


                        • #13
                          Em đề xuất một menu có tinh thần ăn uống như thế này làm cây menu tiêu biểu. Có ai có ý kiến gì không nhỉ?
                          Attached Files
                          Email: - Mobil: tạm thời ngừng liên lạc 1 thời gian
                          Giới thiệu website kiếm tiền trực tuyến & tăng thứ hạng website.

                          Comment


                          • #14
                            Nguyên văn bởi nghaiha Xem bài viết
                            Em đề xuất một menu có tinh thần ăn uống như thế này làm cây menu tiêu biểu. Có ai có ý kiến gì không nhỉ?
                            Đó đó! Bác làm cây như vậy là giải quyết được một lớp bài toán to tướng rồi đó!
                            Nếu chúng ta hoàn thiện được một khung menu cho cây chuẩn thế này thì có thể đưa hầu hết các bài toán vào nồi rồi . Bác thay số nút con trong cây 1..6 thành 1..n đi. Theo em cái này làm hay nhất là dùng mảng để lưu thông tin các nút con. Tại mỗi nút sẽ có 2 lựa chọn là duyệt tiếp hoặc là thực thi (thực ra cũng chỉ là thực thi duyệt hay thực thi ứng dụng thôi). Em nhớ không nhầm thì bác minhtuan04 đã làm giải pháp này rồi, bác mô tả lại phương pháp cho anh em nhé! Em suy nghĩ một lúc rồi sẽ post ý kiến lên.
                            Anh em ta cùng đưa ra và bàn về phương pháp, ai thấy thông rồi, đủ rau củ quả và gia vị, thì tự chế nồi nẩu riêng. Sau đó đưa ra để anh em phản biện. Nếu không có ai thêm mắm bớt muối, bổ xung gia vị thì coi như nồi nẩu đó dễ nhúng và tiết kiệm điện. Hì... . Anh em ta sẽ cùng và thưởng kẹo! OK? Hề hề... em phấn đấu vì kẹo mút Hải Hà đây!

                            Comment


                            • #15
                              Nhưng làm một cây hoàn chỉnh cho Menu thì chương trình phì ra hơn lớn đó, vì mỗi Node dùng đến 3 con trỏ hoặc hơn nữa để trỏ đến: 1. Trỏ đến Menu cha 2. Menu Con 3. Menu cùng cấp trước 4. Menu cùng cấp sau, 5. Trỏ đến hàm thực thi, 6. Trỏ đến String hiển thị (Caption)...

                              Comment

                              Về tác giả

                              Collapse

                              nghaiha Tìm hiểu thêm về nghaiha

                              Bài viết mới nhất

                              Collapse

                              Đang tải...
                              X