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

    文章

    16379

    浏览量

    178270
  • 定时器
    +关注

    关注

    23

    文章

    3250

    浏览量

    114897
  • 逻辑运算
    +关注

    关注

    0

    文章

    56

    浏览量

    9763
收藏 人收藏

    评论

    相关推荐

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

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

    C语言指针运算符详解

    在C语言中,当你有一个指向数组中某个元素的指针时,你可以对该指针执行某些算术运算,例如加法或减法。这些运算可以用来遍历数组中的元素,如ptr[i]等价于*(ptr + i)。然而,如果你的操作使得指针指向了数组以外的位置(除了数组结束位置之后的一个位置之外),那么这个指针
    的头像 发表于 10-30 11:16 256次阅读

    Verilog语法中运算符的用法

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

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

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

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

    在C语言的编程领域中,运算符是实现数据处理与逻辑操作的关键工具。无论是在处理简单的数值计算,还是在构建复杂的逻辑结构时,运算符的使用贯穿始终。作为编程语言的基础组成部分之一,
    的头像 发表于 09-18 15:56 363次阅读
    技术干货驿站 ▏深入理解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 1014次阅读

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

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

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

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

    cpu的运算器和控制器的作用是什么

    Unit)是CPU中负责执行算术和逻辑运算的部分。它的主要作用包括: 1.1 算术运算运算器可以执行各种算术运算,如加法、减法、乘法、除法等。这些
    的头像 发表于 06-30 11:15 2240次阅读

    Golang为何舍弃三元运算符

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

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

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

    C语言程序的结构认识

    两个符号之间不可以有空格,复合赋值运算符的优先级与赋值运算符的相同。表达式n+=1等价于n=n+1,作用是取变量n中的值增1再赋给变量n,其他复合的赋值运算符运算规则依次类推。
    发表于 03-22 12:30 1257次阅读

    异或门的逻辑符号和逻辑电路组成

    异或门(XOR gate)是数字逻辑电路中常用的一种逻辑门。它的作用是对两个输入信号进行逻辑运算,输出一个结果。
    的头像 发表于 02-04 14:18 1.1w次阅读
    异或门的<b class='flag-5'>逻辑</b>符号和<b class='flag-5'>逻辑</b>电路组成

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

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