找回密码
 立即注册
查看: 793|回复: 8

例程里这一句,是否多余?

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:374
  • 最近打卡:2025-04-29 08:33:10

16

主题

137

回帖

978

积分

高级会员

积分
978
发表于 2024-2-23 09:38:49 | 显示全部楼层 |阅读模式
在STC8H8K64U的例程包中,有《11-串口2中断模式与电脑收发测试》这个例程。其中在 UART2_config(2){} 函数中有如下语句:

        P_SW2 &= ~0x01;
        P_SW2 |= 1;         //UART2 switch to: 0: P1.0 P1.1,  1: P4.6 P4.7

这里P_SW2最后一位是引脚选择位S2_S,设置为1,即实验箱使用的引脚P4.6和P4.7。我的疑问是,这两句只用最后一句就可以让最后一位为1,其他位保持不变,为何又加了第一句,让最后一位先清零?这一句是否有必要?谢谢。(顺便说一句,这个例程中SetTimer2Baudrate,错写成SetTimer2Baudraye,none错写成了nine了)


回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:135
  • 最近打卡:2024-12-25 10:15:05

47

主题

1350

回帖

8058

积分

荣誉版主

冲哥视频教程和各种开源资料QQ交流群884047237,可群

积分
8058
QQ
发表于 2024-2-23 10:04:56 | 显示全部楼层
本帖最后由 电子DIY小家 于 2024-2-23 11:16 编辑

因为这个历程是这样用的:
正常情况下想要用P4.6 P4.7,是不是就按照如下的写法就可以了,


        P_SW2 &= ~0x01;
        P_SW2 |= 1;         //UART2 switch to: 0: P1.0 P1.1,  1: P4.6 P4.7



但是如果想要切换到 P1.0 P1.1,是不是就要像下面这样写了
        P_SW2 &= ~0x01;
        P_SW2 |= 0;         //UART2 switch to: 0: P1.0 P1.1,  1: P4.6 P4.7


可以看到上面的切换到 P1.0 P1.1引脚上的写法,因为是或等于的写法,如果这个位本身是1那将是无法写入的,所以为了程序的通用,直接先把这个位清0了在写入(这种写法也是为了方便多组引脚选择)。

那么问题来了其实本身,引脚切换也可以直接一行完成,比如:
选择 P4.6 P4.7就是: P_SW2 |= 1;
选择 P1.0 P1.1就是:P_SW2 &= ~0x01;

当然学得好的直接这样写就OK了,但是对于新手这样就不好理解了,尤其是两个位去从四组引脚里选择的这样写就更难了~

点评

这就是新手的照葫芦画瓢么0.0 P_SW2 |= 0; 哈哈哈  发表于 2024-2-23 10:59
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:374
  • 最近打卡:2025-04-29 08:33:10

16

主题

137

回帖

978

积分

高级会员

积分
978
发表于 2024-2-23 10:51:58 | 显示全部楼层
谢谢冲哥的解释,明白了!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:453
  • 最近打卡:2025-05-02 08:15:40
已绑定手机

13

主题

1257

回帖

2975

积分

金牌会员

积分
2975
发表于 2024-2-23 11:00:36 | 显示全部楼层
电子DI*** 发表于 2024-2-23 10:04
因为这个历程是这样用的:
正常情况下想要用P4.6 P4.7,是不是就按照如下的写法就可以了,

选择 P4.6 P4.7就是: P_SW2 |= 0;
选择 P1.0 P1.1就是:P_SW2 &= ~0x01;

我认为C51中清零和置位最标准的写法还是需要掌握的,在汇编中也是对应CLR和SET两条指令,这都属于基本操作,没必要考虑新手不好理解的“问题”。

点评

对于上述回复: 首先,选择 P4.6 P4.7就是: P_SW2 |= 0; 这里的0应该改成1. 其次,“清零和置位最标准的写法还是需要掌握的”这个话术本身没有问题,但是退一万步讲万一用户不会呢,示例代码就是回了让用户可以最  详情 回复 发表于 2024-2-23 11:15
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:135
  • 最近打卡:2024-12-25 10:15:05

47

主题

1350

回帖

8058

积分

荣誉版主

冲哥视频教程和各种开源资料QQ交流群884047237,可群

积分
8058
QQ
发表于 2024-2-23 11:15:42 | 显示全部楼层
21cns*** 发表于 2024-2-23 11:00
选择 P4.6 P4.7就是: P_SW2 |= 0;
选择 P1.0 P1.1就是:P_SW2 &= ~0x01;


对于上述回复:

首先,选择 P4.6 P4.7就是: P_SW2 |= 0; 这里的0应该改成1.
其次,“清零和置位最标准的写法还是需要掌握的”这个话术本身没有问题,但是退一万步讲万一用户不会呢,示例代码就是回了让用户可以最快的办法上手的。
截图202402231114145002.jpg

用这个例子来说,用户拿到这个代码要切换串口引脚只要把00改成40或者80或者c0就好,这不就方便多了,不需要再去想半天的与还是或,老鸟一不小心还容易搞错。

点评

让用户最快的办法上手,,并不是这样无意义的写法,,而且封装好相应功能的API,用 中文 详细的描述API的使用方法和注意事项。  发表于 2024-2-23 14:04
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:453
  • 最近打卡:2025-05-02 08:15:40
已绑定手机

13

主题

1257

回帖

2975

积分

金牌会员

积分
2975
发表于 2024-2-23 11:53:27 | 显示全部楼层
电子DI*** 发表于 2024-2-23 11:15
对于上述回复:

首先,选择 P4.6 P4.7就是: P_SW2 |= 0; 这里的0应该改成1.

超过1bit的设置,确实用你说的这种写法好。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:383
  • 最近打卡:2025-04-30 09:42:19

40

主题

194

回帖

601

积分

高级会员

积分
601
发表于 2024-2-26 16:36:42 | 显示全部楼层
示例代码能够照顾到不同层次的开发人员,我认为这正是STC的暖心之处,应该给予肯定和表杨。
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 13:17 , Processed in 0.157885 second(s), 95 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表