一個(gè)完整的嵌入式系統(tǒng),包括任務(wù)執(zhí)行部分和人機(jī)交互部分。在前四節(jié)中,我們已經(jīng)講解了LED、LCD和按鍵,用這三者就能夠?qū)崿F(xiàn)一個(gè)人機(jī)交互系統(tǒng),也即搭建整個(gè)嵌入式系統(tǒng)的框架。在后續(xù),只要將各個(gè)功能加入到這個(gè)交互系統(tǒng)中,即可完成整個(gè)嵌入式系統(tǒng)的設(shè)計(jì)。因此,盡管你什么都不會(huì),只會(huì)使用LED、LCD和按鍵,也至少能獲得省三或省二的獎(jiǎng)項(xiàng)。下面我們就以第十四屆省賽題為例,看看如何實(shí)現(xiàn)一個(gè)完善的交互系統(tǒng)。
首先我們來(lái)看第一個(gè)要求:按下B1切換界面:
結(jié)合第二節(jié):LCD顯示的內(nèi)容,只需要將切換界面處的判斷條件更換為key[0].single_flag == 1即可:
if (key[0].single_flag == 1)
{
LCD_Clear(Black); //每切換一次界面清一次屏
view++;
if (view > 2)
{
view = 0;
}
key[0].single_flag = 0; //標(biāo)志位清零(重要?。?}
再來(lái)看第二個(gè)要求:
B2的要求相對(duì)于B1來(lái)說(shuō),只是增加了不同界面的不同功能,其本質(zhì)是一樣的。注意,第二個(gè)小要求需要切換選擇參數(shù),這就需要一個(gè)標(biāo)志變量choose。每次重新進(jìn)入?yún)?shù)界面時(shí),默認(rèn)可調(diào)整的參數(shù)為R,只需要在切換界面時(shí)把choose重新賦值為'R'即可。
char choose = 'R';
if (key[1].single_flag == 1)
{
if (view == 0) //數(shù)據(jù)界面
{
/* 5s切換模式 */
if (M == 'H') M = 'L';
else M = 'H';
N++; //統(tǒng)計(jì)次數(shù)
}
else if (view == 1) //參數(shù)界面
{
if (choose == 'R') choose = 'K';
else choose = 'R';
}
key[1].single_flag = 0; //標(biāo)志位清零(重要?。?}
要求3:
結(jié)合要求2,當(dāng)choose=='R'時(shí),對(duì)R進(jìn)行++;當(dāng)choose=='K'時(shí),對(duì)K進(jìn)行++:
if (key[2].single_flag == 1 && view == 1) //參數(shù)界面
{
if (choose == 'R')
{
R++;
if (R > 10) R = 1;
}
else
{
K++;
if (K > 10) K = 1;
}
key[2].single_flag = 0; //標(biāo)志位清零(重要?。?}
要求4:
要求4的第1個(gè)要求與要求3類似,不再贅述。第2個(gè)要求要標(biāo)志是否處于鎖定狀態(tài),同樣需要一個(gè)標(biāo)志變量lock。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-697016.html
if (key[3].single_flag==1 && view==1) //參數(shù)界面
{
if (choose == 'R')
{
R--;
if (R < 1) R = 10;
}
else
{
K--;
if (K < 1) K = 10;
}
key[3].single_flag = 0; //標(biāo)志位清零(重要?。?}
bool lock = 0;
if (view==0 && lock==0) //數(shù)據(jù)界面,解鎖狀態(tài)
{
if (key[3].long_flag == 1) lock = 1;
key[3].long_flag = 0; //標(biāo)志位清零(重要!)
}
else if (view==0 && lock==1) //數(shù)據(jù)界面,鎖定狀態(tài)
{
if (key[3].single_flag == 1) lock = 0;
key[3].single_flag = 0; //標(biāo)志位清零(重要!)
}
將所有有關(guān)LED、LCD與按鍵的操作封裝成函數(shù),在主循環(huán)中調(diào)用,即可實(shí)現(xiàn)一個(gè)交互系統(tǒng)。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-697016.html
/* task.c */
#include "task.h"
uint8_t view = 0;
char choose = 'R';
bool lock = 0;
char M = 'L';
int P;
double V, MH, ML;
int R = 1;
int K = 1;
int N = 0;
char text[20];
void key_pro(void)
{
//B1
if (key[0].single_flag == 1)
{
LCD_Clear(Black);
view++;
choose = 'R';
if (view > 2)
{
view = 0;
}
key[0].single_flag = 0;
}
//B2
if (key[1].single_flag == 1)
{
if (view == 0)
{
/***************
5s切換模式
LED_Toggle(LD2);
HAL_Delay(100);
***************/
LED_Off(LD2);
if (M == 'H') M = 'L';
else M = 'H';
N++;
}
else if (view == 1)
{
if (choose == 'R') choose = 'K';
else choose = 'R';
}
key[1].single_flag = 0;
}
//B3
if (key[2].single_flag == 1 && view == 1)
{
if (choose == 'R')
{
R++;
if (R > 10) R = 1;
}
else
{
K++;
if (K > 10) K = 1;
}
key[2].single_flag = 0;
}
//B4
if (key[3].single_flag==1 && view==1)
{
if (choose == 'R')
{
R--;
if (R < 1) R = 10;
}
else
{
K--;
if (K < 1) K = 10;
}
key[3].single_flag = 0;
}
if (view==0 && lock==0)
{
if (key[3].long_flag == 1) lock = 1;
key[3].long_flag = 0;
}
else if (view==0 && lock==1)
{
if (key[3].single_flag == 1) lock = 0;
key[3].single_flag = 0;
}
}
void display(void)
{
if (view == 0)
{
LCD_DisplayStringLine(Line1, (uint8_t *)" DATA ");
sprintf(text, " M=%c ", M);
LCD_DisplayStringLine(Line3, (uint8_t *)text);
sprintf(text, " P=%d%% ", P);
LCD_DisplayStringLine(Line4, (uint8_t *)text);
sprintf(text, " V=%.1f ", V);
LCD_DisplayStringLine(Line5, (uint8_t *)text);
LED_On(LD1);
}
else if (view == 1)
{
LCD_DisplayStringLine(Line1, (uint8_t *)" PARA ");
sprintf(text, " R=%d ", R);
LCD_DisplayStringLine(Line3, (uint8_t *)text);
sprintf(text, " K=%d ", K);
LCD_DisplayStringLine(Line4, (uint8_t *)text);
LED_Off(LD1);
}
else if (view == 2)
{
LCD_DisplayStringLine(Line1, (uint8_t *)" RECD ");
sprintf(text, " N=%d ", N);
LCD_DisplayStringLine(Line3, (uint8_t *)text);
sprintf(text, " MH=%.1f ", MH);
LCD_DisplayStringLine(Line4, (uint8_t *)text);
sprintf(text, " ML=%.1f ", V);
LCD_DisplayStringLine(Line5, (uint8_t *)text);
LED_Off(LD1);
}
if (lock == 1) LED_On(LD3);
else LED_Off(LD3);
}
/* task.h */
#ifndef __TASK_H
#define __TASK_H
#include "main.h"
#include <stdio.h>
#include "led.h"
#include "lcd.h"
#include "fonts.h"
#include "key.h"
void key_pro(void);
void display(void);
#endif /* __TASK_H */
到了這里,關(guān)于【速成】藍(lán)橋杯嵌入式省一教程:(五)用按鍵和屏幕實(shí)現(xiàn)嵌入式交互系統(tǒng)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!