Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Многоуровневое меню на LCD
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > PIC
manial
Добрый день. В рамках учебного проекта нам предложили сделать карту управления шаговым мотором. Предполагается 3 разных сценария его работы, с разными параметрами ускорения, торможения и линейной скорости. Интерфейс карты должен иметь LCD экран с наклеенной на нем сенсорной резистивной пластинкой (не знаю как оно по русски называется =) ), в общем мало бюджетный тактильный экран. В качестве меню управления предлагается разделить его на 4 зоны, 3 зоны для выбора режима и одна для возвращения на уровень выше. В программировании я не очень и проблема в том что я никак не могу понять как организовать такое многоуровневое меню. Вот фрагмент программы :

Код
int measure() // Определения зоны нажатия, возвращает координаты X Y
{
while(1)    {    
   output_high(DRIVE_X); output_low(DRIVE_Y); // Activation mesure en X
   set_adc_channel(1);// Multiplexeur sur entree AN1 (READ_X).
   delay_ms(50);// Il faut stabiliser la tension...
   NX = Read_ADC(); // Mesure position X
   output_high(DRIVE_Y); output_low(DRIVE_X); // Activation mesure en Y
   set_adc_channel(2);// Multiplexeur sur entree AN1 (READ_X).
   delay_ms(50);// Il faut stabiliser la tension...
   NY = Read_ADC(); // Mesure position X
   return NX,NY;
   }
}

void detect()
{

   int n=0;

   do {


      measure();

      while(NX<128 && NY<128 && NX!=0 && NY!=0)
      {
         measure();
         n=3;

      }
      while(NX>128 && NY<128 && NX!=0 && NY!=0)
      {
         measure();
         n=4;

      }
      while(NX>128 && NY>128 && NX!=0 && NY!=0)
      {
         measure();
         n=2;

      }
      while(NX<128 && NY>128 && NX!=0 && NY!=0)
      {
         measure();
         n=1;

      }


      switch(n)
      {
         case 1:
         effacement_ecran();
         sprintf(texte,"Case 1");  Print_texte(0,0);
         break;

         case 2:
         effacement_ecran();
         sprintf(texte,"Case 2");  Print_texte(0,0);

         break;
         case 3:
         effacement_ecran();
         sprintf(texte,"Case 3");  Print_texte(0,0);

         break;
         case 4:
         effacement_ecran();
         sprintf(texte,"Retour");  Print_texte(0,0);

         break;
         default:      
          break;
      }
      
      n=0;
      }
      while (1);
}
zltigo
1. Забыть про поиск чернил для третьего класса меню "для pic18f2550"
2. Воспользоваться поиском по форуму, поскольку тема избитая.
3. На форуме есть раздел для начинающих.
rezident
Во-первых, разбейте задачу на несколько уровней абстракции и каждый уровень реализуйте независимо друг от друга. Используйте метод конечных автоматов. Например, "железячный" уровень, т.н. HAL (Hardware Application Layer): а) измерение с помощью АЦП, б) вывод изображения из буфера на дисплей. "Драйверный" уровень: а) определение координат, б) формирование управляющих скан-кодов, в) формирование изображения/меню в буфере. "Пользовательско-интерфейсный" уровень: а) навигация по меню, б) выполнение пре- и пост-функций выбранного пункта меню. Ну и т.п.
Во-вторых, избавьтесь от конкретных цифр в программе. В крайнем случае замените их символическими именами с помощью дефайнов. Завтра вам задачу изменят и попросят шесть зон реализовать. Вы что, будете все цифирьки по всему тексту программы искать и заменять их вручную?
Danis
Цитата(manial @ Feb 7 2011, 00:34) *
В программировании я не очень и проблема в том что я никак не могу понять как организовать такое многоуровневое меню. Вот фрагмент программы :


Вы хотите, чтобы Вам объяснили, что делает Ваш приведенный код?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.