표준 텍스트 LCD 메뉴 시스템


10

텍스트 LCD에 대한 C의 간단한 메뉴 시스템에 대한 패턴이 있습니까? 간단한 텍스트 LCD 메뉴를 처리하기 위해 코드를 많이 작성하고 있습니다.

대부분의 시스템에는 주 메뉴와 일부 하위 메뉴가 있으며 선택하면 최소 및 최대 값으로 매개 변수를 설정할 수 있습니다.

이상적으로이 메뉴 시스템은 enter, cancel, up 및 down과 같은 4 개의 간단한 키로 탐색 할 수 있습니다.

내 응용 프로그램에서는 2 줄 x 16 문자 텍스트 LCD를 사용하고 있지만 이상적인 솔루션을 모든 NxM 디스플레이에 적용 할 수 있어야합니다.


전자 디자인과 관련이 없습니다! 질문이 마감됩니다.
레온 헬러

5
그들이 임베디드 시스템에 적용된다면 인상 프로그래밍 질문을 받았다. 어쩌면 내가 잘못했다 ...
mjh2007

나도 비슷한 인상을 받았다. 그것에 대한 공식적인 메모가 있습니까?
AndrejaKo

FAQ에 따르면 매우 낮은 수준의 물건 만. 이 질문은 사용자 인터페이스에 관한 것입니다.
레온 헬러

3
+1 나도 관심이있을 것입니다 ... 나는 항상 손으로 양조했습니다. 콘솔 출력 또는 NxM 문자 디스플레이를 사용하고 있습니까? ... 답변이 없습니다 :) 여러 임베디드 2xN 디스플레이 시스템에서 Enter / Cancel을 결합한 두 개의 버튼 인터페이스를 구현했으며 링 버퍼 및 업 / 넥스트 및 다운 / 백이 필요 없습니다.
kenny

답변:


5

C에서 메뉴 시스템에 사용하는 패턴은 다음과 같습니다.

struct menuitem
{
  const char *name; // name to be rendered
  functionPointer handlerFunc; // handler for this leaf node (optionally NULL)
  struct menu *child; // pointer to child submenu (optionally NULL)
};

struct menu
{
  struct menu *parent; // pointer to parent menu
  struct **menuitem; // array of menu items, NULL terminated
};

그런 다음 menu각각 menuitems 및 child하위 메뉴에 대한 포인터를 포함하는 의 배열을 선언합니다 . 위와 아래는 현재 선택된 menuitems 배열을 통해 이동합니다 . 뒤로는 parent메뉴 로 이동 하고 앞으로 / 선택은 child하위 메뉴로 이동 하거나 handlerFunc리프 노드를 호출 합니다.

메뉴를 렌더링하려면 해당 항목을 반복해야합니다.

이 체계의 장점은 완전히 데이터 중심이며 메뉴 구조는 렌더러 및 핸들러 함수와 무관하게 ROM에서 정적으로 선언 될 수 있다는 것입니다.


2

토비의 대답은 아주 좋은 출발점입니다. 언급 된 구조는 메뉴가 정적 인 것으로 가정하고 메뉴를 탐색하기 만하면됩니다.

동적 메뉴 (예 : 온도, 시간 등의 특정 값 표시)를 원하는 경우 해당 메뉴를 생성 할 수 있어야합니다.

한 가지 방법은 문자열을 작성하는 함수를 등록하는 것입니다.

struct menuitem
{
  const char *name; // name to be rendered
  const char * (*builderFunc)( const char *name );  // callback to generate string, if not null.
  functionPointer handlerFunc; // handler for this leaf node (optionally NULL)
  struct menu *child; // pointer to child submenu (optionally NULL)
};
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.