"); //-->
版本2
由LED图可知高电平为熄灭。由key图可知,GPB6、7只能有一个为低电平,低电平为选通。
首先,定义一个GP类,内有set、reset、test成员函数。其含义和bitset类型相同,详情请看《C++ primer》。
typedef unsigned int uint;
class GP
{
public:
GP(volatile unsigned int &address) : m_address(address) {}
void set(short bit){ m_address |= 1<<bit; }
void set(short bit, bool v);
void reset(short bit) { m_address &= ~(1<<bit); }
bool test(short bit) { return (m_address & (1 << bit)) != 0; }
private:
volatile uint& m_address;
};
void GP::set(short bit, bool v)
{
if (v) set(bit);
else reset(bit);
}
然后定义KEY类,为了方便操作key,继承GP类,其中的press(按键)返回test后的取反值。
class KEY : private GP
{
public:
KEY(volatile uint &address, short bit) : GP(address),m_keyth(bit) {}
bool press() { return !test(m_keyth); }
private:
short m_keyth;
};
再定义led,继承GP类,其中的blackOut(关灯)与lightOn(开灯)分别与set和reset对应。
class LED : private GP
{
public:
LED(volatile uint &address, short bit) : GP(address),m_ledth(bit) {}
void blackOut() { set(m_ledth); }
void lightOn() { reset(m_ledth); }
private:
short m_ledth;
};
结合key和led,KEYLED就横空出世了:
class KEYLED : private KEY, private LED
{
public:
KEYLED(volatile uint &keyAddr, short keyth,\
volatile uint &ledAddr, short ledth) : \
KEY(keyAddr, keyth), LED(ledAddr, ledth) {}
void lightLedOrNot();
};
void KEYLED::lightLedOrNot()
{
if ( press() )
lightOn();
else
blackOut();
}
由LED图和key图,创建的对象为:
static KEYLED keyLed1(rGPFDAT, 0, rGPFDAT, 4);
static KEYLED keyLed2(rGPFDAT, 0, rGPFDAT, 5);
static KEYLED keyLed3(rGPGDAT, 5, rGPFDAT, 6);
static KEYLED keyLed4(rGPGDAT, 5, rGPFDAT, 7);
只需写上以下代码即可:
GPBDAT.set(7, 1);
GPBDAT.set(6, 0);
keyLed1.lightLedOrNot();
keyLed3.lightLedOrNot();
GPBDAT.set(7, 0);
GPBDAT.set(6, 1);
keyLed2.lightLedOrNot();
keyLed4.lightLedOrNot();
版本1
由LED图可知高电平为熄灭。由key图可知,GPB6、7只能有一个为低电平,低电平为选通。
首先,定义一个GP类,内有set、reset、test成员函数。其含义和bitset类型相同,详情请看《C++ primer》。
然后定义GPIO类,为了方便操作key和led,继承GP类,其中的blackOut(关灯)与lightOn(开灯)分别与set和reset对应。当test某键为true时,代表该键没有按下。
由LED图和key图宏定义如下:
#define KEY1 0 //GPF0 GPB6
#define KEY2 0 //GPF0 GPB7
#define KEY3 5 //GPG5 GPB6
#define KEY4 5 //GPG5 GPB7
#define LED1 4 //GPF4
#define LED2 5 //GPF5
#define LED3 6 //GPF6
#define LED4 7 //GPF7
创建的对象为:
static GPIO GPBDAT(rGPBDAT), key12(rGPFDAT), key34(rGPGDAT);
static GPIO led(rGPFDAT);
拿key1为例:
if (key12.test(KEY1)) {
led.blackOut(LED1); //熄灭LED1
}
else {
led.lightOn(LED1); //点亮LED1
}
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。