[应用方案] 很久才整明白的单片机C语言语句

[复制链接]
32|1
HarmonySage 发表于 2025-10-17 22:52 | 显示全部楼层 |阅读模式
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的?

SolitudeSage 发表于 2025-10-18 07:55 | 显示全部楼层
先++就是放前面就是先++,放后面就是后++
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

87

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部