0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

用Bitwise逻辑运算符进行设计

微云疏影 来源:Digi-Key 作者:Digi-Key 2022-04-12 15:02 次阅读

下文将介绍 AND (&) Bitwise 逻辑并阐明博文《直接端口的操作案例》中介绍的概念。在该示例中,通过多个按钮和电位计控制器来操作由步进电机驱动的摄像头滑块。所选的微控制器在许多端口上都分布了有限的 I/O,这是通过将 I/O 汇编成单一数字值来实现的。

概览

在软件中评估开关输入时,常常从有用的 if/then 语句开始。这对于独立输入可能很有用,但对于多个交互式输入来说则不然。用 if/then 语句涵盖所有的按钮组合,可能会产生数百行代码和每周期中大量的执行任务。实施 Bitwise 逻辑可以最大限度地减少代码,提高周期速度。

项目参数

摄像头滑块项目涉及五个瞬时接触 SPST 开关,这些开关用于在滑块驱动电机的工作过程中选择方向和速度。将输入转换为 SPEED/ENABLE/DIRECTION 输出。开关按压操作与多开关按压识别功能同时在软件中锁定。

pYYBAGJVJA2AVhXbAACH6rtTBqU965.jpg

AND Bitwise 运算符

摄像头滑块的主要位运算符是 AND。该运算器使用 C 语言编程中的安培 (&) 符号,使用图 1 中的真值表。

poYBAGJVJA2ASw1mAAA0nZ7R75k254.jpg

图 1:AND Biwise 运算符的真值表及示例。(图片来源:Don Johanneck)

I/O 组合

为了确立一个能代表所有开关的单值,把位移至所需的位置,进行相加并使用 AND 运算符进行比较(见图 2)。另一个代表极限传感器当前状态的值与开关按压值进行比较,以便在达到极限时取消输出。

pYYBAGJVJA2AXA5zAAB06ZELRI0517.jpg

图 2:摄像头滑块开关的配置,位的编译以及 AND 运算符的使用。(图片来源:Don Johanneck)

在这种情况下,如果按下任何一个按钮或按钮组合,则 buttonValues 不等于零,并在软件中通过 limitValue 和查找表进行操作,以确定输出,这与前面提到的直接端口操作博文中描述的方法完全相同。

编程

该程序使用由经过处理的输入值索引而成的输出值表。程序员可以通过改变表数值来确定按任何组合的按钮所产生的动作,这样就不需要改变程序结构,否则结构更改可能是令人望而生畏的。在该示例中,图 3 中的表值代表了单个、多个和对立的按钮动作,不需要单独 IF 语句(图 4)。

poYBAGJVJA6ANN_iAABW9Z5ZB98917.jpg

图 3:由输入值索引而成的唯一输出值表。

pYYBAGJVJA6AT_IEAABSe6eZ2PI384.jpg

图 4:主代码;读取数值和确定输出。

电机控制是通过一个用来确定步进频率的定时器中断服务例程以及一种“跳跃”方法实现的,这种方法通过仅在 stepGo 变量等于或大于 stepFreq 变量时设置电机控制板上的 STEP 引脚来简化速度控制(图 5)。较低的电位器值使该例程跳过了更多的 STEP。

poYBAGJVJA6AafwPAAA2EFniX70951.jpg

图 5:电机控制的中断服务例程。

结论:

使用诸如 AND (&) 这样的位运算符可以简化代码,并大大减少解析数字输入所需的 IF 语句的数量。输出表的建立简单而灵活。使用更多的输出位可以快速扩展输出表,提供更多的输出选择。每一个增加的输出位都需要在主代码中增加一个(或几个)处理程序。一旦输出表建立,该表就会在每个周期内只使用一次,而由主代码完成繁重的工作。中断服务例程在后台稳定地运行,更新电机控制器的 STEP 引脚,但在主代码切换电机控制器的使能 (ENN) 引脚之前,不会发生运动。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 控制器
    +关注

    关注

    112

    文章

    16191

    浏览量

    177369
  • 定时器
    +关注

    关注

    23

    文章

    3237

    浏览量

    114445
  • 逻辑运算
    +关注

    关注

    0

    文章

    56

    浏览量

    9752
收藏 人收藏

    评论

    相关推荐

    逻辑异或运算符在Python中的用法

    ,Python中的 ^ 符号实际上是一个按位异或运算符,用于对整数的二进制表示进行异或操作。 尽管如此,我们仍然可以通过一些方法来实现逻辑异或的功能,即当两个布尔值不同时为真,相同时为假。这可以通过使用
    的头像 发表于 11-19 09:46 74次阅读

    Verilog语法中运算符的用法

    verilog语法中使用以下两个运算符可以简化我们的位选择代码。
    的头像 发表于 10-25 15:17 289次阅读
    Verilog语法中<b class='flag-5'>运算符</b>的用法

    技术干货驿站 ▏解锁C语言高效编程秘诀:深入解析运算符与优先级

    逻辑表达。1位运算符“程序中的所有数在计算机内存中都是以二进制的形式储存的,位运算可以直接对整数在内存中的二进制位进行操作,运位算包括位逻辑运算
    的头像 发表于 10-13 08:09 191次阅读
    技术干货驿站 ▏解锁C语言高效编程秘诀:深入解析<b class='flag-5'>运算符</b>与优先级

    技术干货驿站 ▏深入理解C语言:编程高手必备,全方位解析运算符的核心技能!

    在C语言的编程领域中,运算符是实现数据处理与逻辑操作的关键工具。无论是在处理简单的数值计算,还是在构建复杂的逻辑结构时,运算符的使用贯穿始终。作为编程语言的基础组成部分之一,
    的头像 发表于 09-18 15:56 308次阅读
    技术干货驿站 ▏深入理解C语言:编程高手必备,全方位解析<b class='flag-5'>运算符</b>的核心技能!

    MATLAB(4)--MATLAB基本运算

    逻辑运算 逻辑运算符:&(与)、|(或)和~(非)。 设参与逻辑运算的两个标量a和b,那么运算规则为: a&b:a、b全为非零时,
    发表于 09-06 10:18

    c语言从右到左的运算符有哪些

    以下是一些主要的从右到左运算的C语言运算符: 函数调用运算符 ( () ):当您调用一个函数时,参数列表是从右到左进行求值的。 后置递增运算符
    的头像 发表于 08-20 11:39 691次阅读

    TestStand表达式中常用的语法规则和运算符使用

    TestStand也有自己的语言嘛?在回答这个问题之前大家可以想一下在使用TestStand时有一个和语言密切相关的属性。没错那就是表达式(Expressions),在这篇文章中,小编将以Q&A的方式来带着大家来理解并熟悉TestStand表达式中较为常用的一些语法规则以及运算符使用。
    的头像 发表于 08-15 18:10 1082次阅读
    TestStand表达式中常用的语法规则和<b class='flag-5'>运算符</b>使用

    PLC中的逻辑运算方式有哪些

    PLC(可编程逻辑控制器)中的逻辑运算方式主要包括以下几种,这些逻辑运算在PLC编程中扮演着至关重要的角色,用于实现各种复杂的控制逻辑
    的头像 发表于 07-24 16:55 537次阅读

    Golang为何舍弃三元运算符

    golang中不存在?:运算符的原因是因为语言设计者已经预见到三元运算符经常被用来构建一些极其复杂的表达式。虽然使用if进行替代会让代码显得更长,但这毫无疑问可读性更强。
    的头像 发表于 04-03 15:13 664次阅读

    鸿蒙TypeScript入门学习第5天:【TypeScript 运算符

    运算符用于执行程序代码运算,会针对一个以上操作数项目来进行运算
    的头像 发表于 04-01 16:18 437次阅读
    鸿蒙TypeScript入门学习第5天:【TypeScript <b class='flag-5'>运算符</b>】

    使用ADS并使用ILLD和367DP MCU,赋值运算符没有按预期运行的原因?

    我正在使用 ADS 并使用 ILLD 和 367DP MCU。 从字面上看,赋值运算符没有按预期运行。 例如,考虑以下代码(这是一个极其简化的示例,实际上,它涉及将SPI结果分配给一个变量以通过
    发表于 01-18 10:43

    if函数多个条件并列怎么输入

    要输入多个条件并列的if函数,可以使用逻辑运算符将它们连接起来。常用的逻辑运算符有"and"(与)、"or"(或)、"not"(非)。以下是一个示例: if 条件 1 and 条件 2 and 条件
    的头像 发表于 12-03 10:31 3696次阅读

    逻辑运算符两侧运算对象的数据类型是

    逻辑运算符是编程中常用的运算符之一,用于判断两个表达式之间的关系,并返回布尔值结果。在逻辑运算中,两侧运算对象的数据类型可以是任意类型。 首先,我们需要了解
    的头像 发表于 11-30 14:15 1647次阅读

    python中运算符的优先级大小

    解。 Python中的运算符可以分为以下几类:算术运算符、比较运算符逻辑运算符、位运算符、赋值运算符
    的头像 发表于 11-29 16:21 3218次阅读

    c语言a++和++a的区别举例

    C语言中的"++"和"--"运算符是用来增加或减少变量的值的。"++"运算符可以在变量之前或之后使用,有两种形式:前缀形式和后缀形式。前缀形式是在变量之前使用"++"运算符,而后缀形式是在变量之后
    的头像 发表于 11-26 09:09 3964次阅读