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

转自:http://blog.csdn.net/terry_yuan2011/article/details/7412728

完成单板代码

/*任务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);

}

  }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值