概述
完成单板代码
/*任务3:通过OLED菜单显示选项控制LED灯*/
步骤:
3.1、分析代码上下文可知,这是一个在OLED显示的菜单中通过LED选项来进行LED灯的控制
3.2、代码不会写,怎么办?参考上下文其他选项的写法,譬如speaker
3.3、LED测试函数: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);
}
}
}
最后
以上就是灵巧蛋挞为你收集整理的[Linux项目实践] 物联网单板测试之任务三:OLED菜单控制LED的全部内容,希望文章能够帮你解决[Linux项目实践] 物联网单板测试之任务三:OLED菜单控制LED所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复