找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1112|回复: 4
打印 上一主题 下一主题
收起左侧

很久才整明白的单片机C语言语句

[复制链接]
跳转到指定楼层
楼主
ID:299910 发表于 2025-2-14 09:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
unsigned char a;

  //a=0;
port_mode();              // 将单片机所有端口配置为准双向弱上拉方式

        while(1)      

        {

                P0 =~(1<<a++);                  // 第一次运行时 0000 0001<< 0 = 0000 0001

                //a++;

                //P0=~(1<<a);

                //a++;

           if (a==0x08)          // 允许左移8次。

                {

                        a=0;

                }

        }

这是一个流水灯的程序,其中P0 =~(1<<a++);这条语句我看了很久才弄明白。

1.困惑的是运算顺序 a应该先++,还是应该先位移?

通过语句分解和实验证明a是先进行左移运算,后进行自加运算的。

如果a先进行自加运算P0.0这个灯会一直不亮。被抛弃了。至于为什么会被抛弃,我在思考的这个阶段还没特别明白,能想到的就是那一位被抛弃了。

2.其次是1<<a,这条语句我一直理解为a左移了1位,其实是1左移了a位。弄明白这个语句就不难理解为什么P0.0会被抛弃了。a先自加1,a==1,1左移1位=0000 0010,再取反=1111 1101,P0.0位一直会是1(低电平导通),所以P0.0一直不亮。

3.为什么没有对a进行赋初值,那初值会是多少?是0吗?

经测试a的初值可以是0。但是a赋值大于8的时候灯就不会亮,因为if (a==0x08)时a=0,这里改成a> =0x08,a就可以是大于8的值。可是原程序a==0x08,a不赋初值也都可以运行,那a是怎么保证不大于8的?

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:353115 发表于 2025-2-15 14:39 | 只看该作者
1、你的C语言需要加强。你可以去看一下C语言的运算符优先级。可以看到++是高于位移运算符的,只不过a++这种运算,它要求先参与运算,后进行自加。
2、程序直接初始化P0=~0x01。在循环中P0 = P0<<1|P0>>7。这样就可以循环移动了。比你添加一个变量a要清爽得多。
3、变量若被使用必须先初始化,这是个规范。
回复

使用道具 举报

板凳
ID:299910 发表于 2025-2-18 14:46 | 只看该作者
qsssuv 发表于 2025-2-15 14:39
1、你的C语言需要加强。你可以去看一下C语言的运算符优先级。可以看到++是高于位移运算符的,只不过a++这种 ...

感谢大神指点,基础知识的确差的很,需要从头开始,好好学习。
回复

使用道具 举报

地板
ID:1110477 发表于 2025-3-28 04:59 | 只看该作者
jackduan2018 发表于 2025-2-18 14:46
感谢大神指点,基础知识的确差的很,需要从头开始,好好学习。

对对对,a++是a的现在的值,先参与左边的运算,然后再自增。好像有个左结合右结合的说法
回复

使用道具 举报

5#
ID:1110477 发表于 2025-3-28 05:06 | 只看该作者
jackduan2018 发表于 2025-2-18 14:46
感谢大神指点,基础知识的确差的很,需要从头开始,好好学习。

他的第一条对,后两条也对,但是太古板了,C语言是技巧的艺术
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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