关闭

[Linux项目实践] 物联网单板测试之任务三:OLED菜单控制LED

1100人阅读 评论(0) 收藏 举报

完成单板代码

/*任务3:通过OLED菜单显示选项控制LED*/

步骤:

3.1、分析代码上下文可知,这是一个在OLED显示的菜单中通过LED选项来进行LED灯的控制

3.2、代码不会写,怎么办?参考上下文其他选项的写法,譬如speaker

3.3LED测试函数:void LED_Test(void){}

3.3.1、构造一个子菜单:Menu_TypeDef menu;    

typedef struct

{

  uint16_t max_numb;

  uint16_t numb;

  char  *title;

  char *item[32];

} Menu_TypeDef;

3.3.2、设置子菜单选项的相关属性:

  menu.max_numb = 2;            //the max menu items is 2

  menu.numb = 1;                //the first menu item is 1

  menu.title = "LED Test";          //the menu title

  menu.item[0] = "1.Turn on LED";   //the first menu item

  menu.item[1] = "2.Turn off LED";  //the second menu item

3.3.3、通过OLED显示子菜单的内容:Dis_Menu(menu); 

void Dis_Menu(Menu_TypeDef menu)

{

  uint16_t page, row, i;

  page = (menu.numb-1) / 6;    //each 6 items for a page

  i = (page+1) * 6;                     //the total item can be showed on the OLED

  if(i < menu.max_numb)          

    row = 5;

  else

    row = (menu.max_numb-1) % 6;

  //show the title:LED Test  pg 1, and yellow color

  OLED_ClearScreen();      

  OLED_DisStrLine(0, 0, (uint8_t *)menu.title);  //show the content

  OLED_DisChar(0, 6*17, 0, 'P');

  OLED_DisChar(0, 6*18, 0, 'g');

  OLED_DisChar(0, 6*19, 0, ' ');

  OLED_DisChar(0, 6*20, 0, 0x30+1+page);

  //show the menu items, and blue color

  for(i=0; i<=row; i++)

  {

    if(menu.numb == (page*6 + i + 1))

  OLED_DisStrLine(2+ i, 1, (uint8_t *)menu.item[page*6+i]);

else

  OLED_DisStrLine(2+ i, 0, (uint8_t *)menu.item[page*6+i]);

  }

}

  

3.3.4、操作菜单选项

定义按键的上下操作、选择操作以及ESC的退出操作

  while(menu.numb)

  {

    key = KEY_Read();

    switch(key)

{

  case KEY_UP:             //key up

    if(menu.numb > 1)

  menu.numb --;

else

  menu.numb = menu.max_numb;  //if the menu.numb=1,and you give a key up select, then you will arrive the max_numb

Dis_Menu(menu);

break;

  case KEY_DOWN:     

if(menu.numb < menu.max_numb)

  menu.numb ++;

else

  menu.numb = 1;

Dis_Menu(menu);

break;

  case KEY_SEL:

    switch(menu.numb)

{

  case 1:     

GPIOSetValue(PORT3, 0, 0); // Turn on the LED1,change by terry

GPIOSetValue(PORT3, 1, 0);      // Turn on the LED2

break;

  case 2:

         GPIOSetValue(PORT3, 0, 1); // Turn off the LED1     

GPIOSetValue(PORT3, 1, 1);          // Turn off the LED2

break;

  default:

     break;

}

    break;

  

  case KEY_ESC:          

         menu.numb = 0;

     break;

  default:

  break; 

}

if((key!=KEY_NONE) && (menu.numb!=0))

{

  delay_ms(250);

}

  }

3.4、完整代码如下:经编译烧录,可以实现菜单控制LED功能

void LED_Test(void)

{

  Menu_TypeDef menu;    //set a menu

  uint16_t key;         //init a key

  

  menu.max_numb = 2;        //the max menu items is 2

  menu.numb = 1;                //the first menu item is 1

  menu.title = "LED Test";    //the menu title

  menu.item[0] = "1.Turn on LED";   //the first menu item

  menu.item[1] = "2.Turn off LED";  //the second menu item

  Dis_Menu(menu);       //display the menu content

  delay_ms(250);   //give a delay time

  

  while(menu.numb)

  {

    key = KEY_Read();

    switch(key)

{

  case KEY_UP:             //key up

    if(menu.numb > 1)

  menu.numb --;

else

  menu.numb = menu.max_numb;  //if the menu.numb=1,and you give a key up select, then you will arrive the max_numb

Dis_Menu(menu);

break;

  case KEY_DOWN:     

if(menu.numb < menu.max_numb)

  menu.numb ++;

else

  menu.numb = 1;

Dis_Menu(menu);

break;

  case KEY_SEL:

    switch(menu.numb)

{

  case 1:     

GPIOSetValue(PORT3, 0, 0); // Turn on the LED1,change by terry

GPIOSetValue(PORT3, 1, 0);      // Turn on the LED2

break;

  case 2:

         GPIOSetValue(PORT3, 0, 1); // Turn off the LED1     

GPIOSetValue(PORT3, 1, 1);          // Turn off the LED2

break;

  default:

     break;

}

    break;

  

  case KEY_ESC:          

         menu.numb = 0;

     break;

  default:

     break; 

}

if((key!=KEY_NONE) && (menu.numb!=0))

{

  delay_ms(250);

}

  }

}

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:46119次
    • 积分:692
    • 等级:
    • 排名:千里之外
    • 原创:25篇
    • 转载:0篇
    • 译文:0篇
    • 评论:3条
    文章分类
    文章存档
    最新评论