Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Скролиране на меню CCS
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=7692
Страница 1 от 1

Автор:  amdatlon [ Нед Мар 28, 2010 8:28 pm ]
Заглавие:  Скролиране на меню CCS

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

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

Автор:  valioman [ Пон Мар 29, 2010 8:50 am ]
Заглавие: 

Най елементарното е да си структурираш менютата в масив .Пишеш си функция която да изобразява примерно само 4 елемента от масива в зависимост от началния индекс , другото е чистене и чертане на дисплея :)

Автор:  amdatlon [ Пон Мар 29, 2010 8:00 pm ]
Заглавие: 

Да и аз така опитвам , просто затруднението идва от изобразяването на менюто .
Триене, чертаене , координати .... :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 | Прегледано 1047 пъти ]

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/