专栏中心

EEPW首页 > 专栏 > keyGpio总结 其中涉及C++ 已更新版本2

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

发布人:mayer 时间:2009-05-16 来源:工程师 发布文章
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
    }

专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们

关键词:

相关推荐

ZLG500C读卡模块使用指南

脉冲宽度调制(PWM):工作原理及其在电子电路中的核心作用

台积电与三星1纳米制程争霸战打响

EDA/PCB 2026-04-29

将AMT编码器集成到无人机载荷系统

ZLG500C 应用文档V1.0 (仅对购买ZLG500C产品的客户开...

微型扬声器后腔体的关键作用

压电元件为何是电子设备触觉反馈的理想选择

数据采集技术第二讲:配置管理软件MAX

使用LabVIEW构建简易数据采集系统

视频 2009-07-17

Altera: 采用全系列40-nm收发器FPGA和ASIC实现创新

视频 2009-07-13

NI PAC平台引领工业控制发展新技术

视频 2009-07-17

存储卡连接器:SD 卡、SIM 卡与智能卡如何与设备实现接口

谷歌优化升级网络架构,打造生成式 AI 推理与训练高效利器

MLCC市场迎来涨价潮,三星电机拟调涨5~10%

Lumai 推出光计算服务器 可实时运行百亿参数 LLM

ZLG500B读卡模块演示软件

数据采集技术第一讲:DAQ基础知识简介

视频 2009-07-17

ZLG500BX2 器件读卡模块简介

台积电CoWoS晶圆平均售价接近7nm

EDA/PCB 2026-04-29
更多 培训课堂
更多 焦点
更多 视频

技术专区