新闻  |   论坛  |   博客  |   在线研讨会
keyGpio总结 其中涉及C++ 已更新版本2
mayer | 2009-05-16 19:38:25    阅读:1454   发布文章

keyGpio总结 其中涉及C++ 已更新版本2

rar版本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();




rar版本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
    }

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客