"); //-->
版本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
}
专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们
相关推荐
ZLG500C读卡模块使用指南
脉冲宽度调制(PWM):工作原理及其在电子电路中的核心作用
电阻标准阻值咨询
和弦音乐 语音报号 七彩背光 彩屏动画电路
台积电与三星1纳米制程争霸战打响
将AMT编码器集成到无人机载荷系统
电力载波放大电路
这两天全球互联网中毒,上网速度真慢呀:(
ZLG500C 应用文档V1.0 (仅对购买ZLG500C产品的客户开...
和弦音乐 语音报号 七彩背光 彩屏动画电路2
微型扬声器后腔体的关键作用
压电元件为何是电子设备触觉反馈的理想选择
我想研究嵌入式Linux,请给予指点!
数据采集技术第二讲:配置管理软件MAX
谁有ARM板的实际电路图?哪里能找到?
使用LabVIEW构建简易数据采集系统
Altera: 采用全系列40-nm收发器FPGA和ASIC实现创新
NI PAC平台引领工业控制发展新技术
存储卡连接器:SD 卡、SIM 卡与智能卡如何与设备实现接口
全内置和弦音乐来电显示电话芯片
谷歌优化升级网络架构,打造生成式 AI 推理与训练高效利器
MLCC市场迎来涨价潮,三星电机拟调涨5~10%
Lumai 推出光计算服务器 可实时运行百亿参数 LLM
ARM anywhereII使用说明
ZLG500B读卡模块演示软件
数据采集技术第一讲:DAQ基础知识简介
电话占线指示器电路
ZLG500BX2 器件读卡模块简介
ZLG500C Mifare卡读写模块应用
台积电CoWoS晶圆平均售价接近7nm