Отговори на тема  [ 3 мнения ] 
Скролиране на меню CCS 
Автор Съобщение
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Чет Мар 19, 2009 8:33 pm
Мнения: 804
Мнение Скролиране на меню CCS
Здравейте ,
Може ли някой да даде насоки или примерен код на скролиращо вертикално
меню за CCS .
Дисплея е 128х64 KS0108 .
Идеята ми е меню подобно на по старите GSM-и , примерно на дисплея се показват първите 4 позиции от менюто . При Up / Down маркер, който инвертира фона и текста когато е в/у някоя от позициите . Затруднението ми е когато трябва да се придвижи менюто с един ред на горе за да се покажат последователно и скритите редове , 5, 6, 7 .... N-ти.

Ако е само с 4 реда няма проблем , криво ляво съм го наравил със структура , но ако е с повече не знам как точно да процедирам .
ПИК-а е 18F458
Благодаря предварително :)


Нед Мар 28, 2010 8:28 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 17, 2005 5:07 pm
Мнения: 813
Местоположение: Сливен
Мнение 
Най елементарното е да си структурираш менютата в масив .Пишеш си функция която да изобразява примерно само 4 елемента от масива в зависимост от началния индекс , другото е чистене и чертане на дисплея :)


Пон Мар 29, 2010 8:50 am
Профил ICQ
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Чет Мар 19, 2009 8:33 pm
Мнения: 804
Мнение 
Да и аз така опитвам , просто затруднението идва от изобразяването на менюто .
Триене, чертаене , координати .... :wink:
Не че няма да го скалъпя , но ако има нещо стандартно , да не откривам топлата вода отново
:)


Edit:

Както и да е . Оправих се :)
Доста е нескопосано , но ми върши работа за сега. Пускам го тук , ако някой начинаещ като мен реши да се мъчи м дано му е от полза малко !



Код:

// **************  Броя на Редовете в меню SETUP  *******************
#Define MaxRows   14  // Броя на Редовете в меню SETUP
#Define RowPerPage 4  // Броя на редовете на една страница

...........
..........

//Дефиниране Типа на менюто - Запис
TypeDef Struct  {
int8 Index;
Char Name[20];
Char FullName[14];
int16 value;
int1 Select;
}MenuRecord;

MenuRecord MenuSetup[MaxRows];

..................
...................
..................


int 
     
    MenuRowFocus,     //Номер на реда който да се фокусира
    PrevMenuRowFocus,  //Номер на реда който е бил  фокусиран
    FirstMenuRow,     //Индекса на 1-вия ред от Сетъп Менюто
    LastMenuRow,       //Индекса на последния ред от Сетъп Менюто


int8     MenuPosX=20
         ,MenuPosY=1;



// Фокусира маркера в/у позиция от менюто(1-4,1-4, "DataToMark","DataToClear")
Void SetMenuRowFocus(int RowFocused,int PrevRowFocused,/*int IndexMenu ,*/char DataToMark[15],char DataToClear[15]/*MenuRecord *MenuTemp*/)
{
 
   char Message[30];
   
      if(PrevRowFocused!=0)
        {
       
         glcd_rect(MenuPosX+12,MenuPosY +(PrevRowFocused )*13-1,MenuPosX+90,MenuPosY+8+(PrevRowFocused)*13,On,0);
       
         sprintf ( Message ,DataToClear);
         glcd_text57(MenuPosX+14,MenuPosY+(PrevRowFocused)*13,Message,1,1);
        }
       
       
       //Маркиране на реда от менюто
       glcd_rect( MenuPosX+12,MenuPosY +(RowFocused)*13-1,MenuPosX+90,MenuPosY+8+(RowFocused)*13,On,1);
       
       sprintf ( Message , DataToMark);
       glcd_text57(MenuPosX+14,MenuPosY+(RowFocused)*13 ,Message,1,0);
       
       displayInt16(MenuPosX+92,MenuPosY+(RowFocused)*13,0,MenuSetup[RowFocused-1].value,1);
 
}


// Изписва менюто на екрана по зададени координати
Void DisplaySetupMenu(int8 First_Next_Clear) // First_Next_Clear - Определя как се чертае менюто - за 1 път, следващ път , или се трие
{
   char Message[30];
   int8 i,j ;
   int1 FillColor=1;
   
   
     
          If (First_Next_Clear==1)  // Изчертаване за 1-ви  път
          {
           // Изчертаване на Менюто
           glcd_fillScreen(off);
           sprintf ( Message, "- S E T U P -");
           glcd_text57(MenuPosX+4,MenuPosY-1,Message,1,1);
           glcd_line(0,MenuPosY+9,128,MenuPosY+9,1);
          }
         
    If (First_Next_Clear==3 )
     {
       FillColor=0;  //За изтриване на менюто
     
     }
     else
       {FillColor=1;} //За четраене  на менюто
       
       i=0;
   
        For(j =FirstMenuRow-1 ;j< LastMenuRow  ;j++)
           {
           
             {
             
           
                sprintf ( Message, "%u", MenuSetup[j].Index);
                glcd_text57(MenuPosX-5,MenuPosY+(i+1)*13,Message,1,FillColor);
           
                sprintf ( Message , ".");
                glcd_text57(MenuPosX+7,MenuPosY+(i+1)*13,Message,1,FillColor);
           
                sprintf ( Message , MenuSetup[j].Name);
                glcd_text57(MenuPosX+14,MenuPosY+(i+1)*13,Message,1,FillColor);
             
               i++;
     
               }
           }
       
           

}


// ОПИТ  Стартиране на менюто за настройки
Void SetupMenu()
{
char Message[30];

           //SetMenuItems() ;
           glcd_fillScreen(off);
           sprintf ( Message, "- SETUP MENU -");
           glcd_text57(MenuPosX+10,MenuPosY,Message,1,1);
           glcd_line(0,MenuPosY+9,128,MenuPosY+9,1);
         
         
           PrevMenuRowFocus=1;
           FirstMenuRow=1;
           LastMenuRow=RowPerPage;
           DisplaySetupMenu( 1 ); // (1)-Първо Изчетраване на основното меню
           
           MenuRowFocus=1;          //(1-4,1-4, "mark","Clear")
           SetMenuRowFocus(MenuRowFocus,0,MenuSetup[MenuRowFocus-1].Name,MenuSetup[PrevMenuRowFocus-1].Name);
           
         
While( MenuSetup[MaxRows-1].Select==False)
    {  //  При отворено меню  промена позицията на маркера
       
        /**************** Повишаване номера на реда DOWN ************/
        if( DOWNButton==0 )
     
                         {   
                             
                             MenuRowFocus++;
                           
                            if(MenuRowFocus > MaxRows) //Понижава номера на маркера
                               {
                                  DisplaySetupMenu( 3 );// ( 3 ) Изтриване на предишното меню
                                   
                                  FirstMenuRow=1;
                                  LastMenuRow=RowPerPage;
                                 
                                  MenuRowFocus=1;
                                 
                                  DisplaySetupMenu( 2 );//( 2 ) Четраене на новото с един ред по на долу
                                 
                                  SetMenuRowFocus(MenuRowFocus, RowPerPage,MenuSetup[MenuRowFocus-1].Name,MenuSetup[LastMenuRow-1].Name);
                                  PrevMenuRowFocus=MenuRowFocus;
                                 
                               } 
                            else
                            {
                              if( MenuRowFocus > LastMenuRow && LastMenuRow <= MaxRows ) //Ако фокуса премине след последния ред на страницата
                                 {
                             
                                 DisplaySetupMenu( 3 );// ( 3 ) Изтриване на предишното меню
                                 LastMenuRow=MenuRowFocus; 
                                 
                                 FirstMenuRow =(LastMenuRow-RowPerPage+1);
                                 DisplaySetupMenu( 2 );//( 2 ) Четраене на новото с един ред по на долу
                                 
                               
                               
                                SetMenuRowFocus(RowPerPage,0,MenuSetup[MenuRowFocus-1].Name,MenuSetup[PrevMenuRowFocus-1].Name);
                                PrevMenuRowFocus=MenuRowFocus;
                                }
                             else
                              {
                               
                                SetMenuRowFocus(MenuRowFocus-FirstMenuRow+1  ,MenuRowFocus-FirstMenuRow  ,MenuSetup[MenuRowFocus-1].Name,MenuSetup[PrevMenuRowFocus-1].Name);
                                PrevMenuRowFocus = MenuRowFocus;
                              }
                          }
                         }
                         
                         
                         
           /**************** Понижаване номера на реда UP ************/
                      if( UPButton==0 )
     
                          { 
                           
                             MenuRowFocus--;
                             
                          if(MenuRowFocus < 1  ) //Понижава номера на маркера
                               { 
                                 
                                  DisplaySetupMenu( 3 );// ( 3 ) Изтриване на предишното меню
                                  LastMenuRow=MaxRows;
                                  FirstMenuRow =(LastMenuRow-RowPerPage+1);
                                  MenuRowFocus=MaxRows;
                                //  PrevMenuRowFocus=1;
                                  DisplaySetupMenu( 2 );//( 2 ) Четраене на новото с един ред по на горе
                         
                                  SetMenuRowFocus(RowPerPage,PrevMenuRowFocus,MenuSetup[MenuRowFocus-1].Name,MenuSetup[FirstMenuRow-1].Name);
                                  PrevMenuRowFocus = MenuRowFocus;
                               }
                          else   
                           
                            if( MenuRowFocus < FirstMenuRow && MenuRowFocus >=1 ) //Ако фокуса премине преди първия ред на страницата
                               {
                                 DisplaySetupMenu( 3 );// ( 3 ) Изтриване на предишното меню
                               
                                 FirstMenuRow =MenuRowFocus;
                                 LastMenuRow=FirstMenuRow+RowPerPage-1;
                                 DisplaySetupMenu( 2 );//( 2 ) Четраене на новото с един ред по на  горе
                                 
                               
                                 SetMenuRowFocus(1 ,0,MenuSetup[MenuRowFocus-1].Name,MenuSetup[PrevMenuRowFocus-1].Name);
                                 PrevMenuRowFocus=MenuRowFocus;
                              }
                            else
                             
                             
                             if( MenuRowFocus >= FirstMenuRow &&  MenuRowFocus <= LastMenuRow ) //Ако фокуса е м/у 1 и последен ред на страницата
                              {
                               
                                SetMenuRowFocus(  (MenuRowFocus-FirstMenuRow+1 ),(PrevMenuRowFocus-FirstMenuRow+1),MenuSetup[MenuRowFocus-1].Name,MenuSetup[PrevMenuRowFocus-1].Name);
                                PrevMenuRowFocus = MenuRowFocus;
                             }
                             
                          }
                         
                         
                         
                  if(  MENUButton==0 )// OK Бутон за менюто - -Select
     
                          {     
                             MenuSetup[MenuRowFocus-1].Select=True;
                            //MenuRowSelected=MenuRowFocus;
                             If(MenuSetup[MaxRows-1].Select==True )
                                {
                                 MenuSetup[MaxRows-1].Select=False; //Нулира EXIT-a
                               
                                  Break;
                                }
                               
                               else  // Ако е избрана позиция от менюто
                                   { 
                                   
                                       MenuSetup[MenuRowFocus-1].value=NewValue(Функция за промяна на стойносста );
                                       Delay_ms(150); 
                                     
                                   }
                               
                               
     
     
     
     
     
     
     
     
           
                          }     
    }
}

       


Прикачени файлове:
1.JPG
1.JPG [ 20.13 KiB | Прегледано 1043 пъти ]
Пон Мар 29, 2010 8:00 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 3 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 2 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни