变量在循环中丢失———中间变量的重要性

我们来看这样一个程序:

void SPI_byte_write(unsigned char tem)
{unsigned char i=0;for(i=0;i<8;i++){if((tem&0x80)==0x80)MOSI = 1;elseMOSI = 0;SCK = 1;delay_ms(100);tem = tem<<1;SCK = 0;delay_ms(100);}SCK = 0;
}int main(void)
{unsigned char avr = 0x13;while(1){SPI_byte_write(avr);}
}

SPI_byte_write是io口模拟spi,写单个字符的函数。与时钟对应,从高到低把一个字符的8位用高低电平表达出来。
       大家觉得这个程序有没有问题呢?
       如果这个程序只运行一次,那么它是没有问题的,但是注意,这个SPI_byte_write在循环里,它能不能一直发送这个avr(0x13)呢?
       答案是不能
       按照我们的理解,这个函数应该是一直在发送avr,但是,当第二次进循环的时候,这时的avr已经不是0x13了,而是已经移位8次的0x00(移位后用0补齐)。所以,第一次之后的每一次,都是在发送0x00.

(补充一下,这个问题可能只出现在51单片机中,如果是严格的C语言,avr的值应该不会改变,因为这个形参调用是传值形式,avr只是传了一个副本给了tem,avr本身的值没有变,但是单片机中这样用确实只会发送第一个avr,后续全是0.)

那么怎么解决这个问题呢?
答案就是在子函数中加一个中间变量。用该变量作为媒介,接收形参的值,之后对该中间变量进行按位与、移位等操作,主函数中的实参一直没被操作,还是原来的值,这样,每次发送的就是avr=0x13,变量的值便不会丢失。

void SPI_byte_write(unsigned char tem)
{unsigned char i=0,dat;dat = tem;for(i=0;i<8;i++){if((dat&0x80)==0x80)MOSI = 1;elseMOSI = 0;SCK = 1;delay_ms(100);dat = dat<<1;SCK = 0;delay_ms(100);}SCK = 0;
}int main(void)
{unsigned char avr = 0x13;while(1){SPI_byte_write(avr);}
}

变量在循环中丢失———中间变量的重要性相关推荐

  1. stm32怎么调用for循环内部的变量_循环中的异步amp;amp;循环中的闭包

    在这之前先要了解一下 for循环中let 和var的区别 var 是函数级作用域或者全局作用域,let是块级作用域 看一个例子     function foo() {       for (var  ...

  2. Matlab中for循环中的循环变量在循环体中不能改变

    如下代码: for i = 1:10if i==3i=i+5;end end 其中的 i=i+5 这一行不会改变for循环中i的值,for循环变量i会取哪些值,是第一次进入循环时就决定了的.无论在循环 ...

  3. Python编程语言学习:在for循环中如何同时使用2个变量或者3个变量

    Python编程语言学习:在for循环中如何同时使用2个变量或者3个变量 目录 在for循环中如何同时使用2个变量或者3个变量 在for循环中如何同时使用2个变量

  4. Python坑:bool是int的子类、列表循环中的变量泄露、lambda在闭包中会保存局部变量、重用全局变量

    bool是int的子类 a = True print isinstance(a, int) print True == 1 print False == 0 运行结果: True True True ...

  5. go语言for循环中修改临时变量无效

    总结 1. for循环中,遍历变量是临时变量,修改不影响原始变量 2. for循环中如果想修改原始变量,可以直接修改原始变量本身才行 实验如下图 代码如下 package main import &q ...

  6. php foreach 符号,关于php:php-foreach循环中变量之前的符号

    本问题已经有最佳答案,请猛点这里访问. Possible Duplicate: Reference - What does this symbol mean in PHP? 我需要知道为什么在fore ...

  7. java 中for循环中重复定义的变量 为什么不报错?

    java 中for循环中重复定义的变量 为什么不报错? public class Test1 {public static void main(String[] args) {int[] arr = ...

  8. bat for 循环中定义变量(变量值不显示,通过使用「延期变量扩展」方式解决)

    ■前言 今天实现业务功能时,写了类似如下,第一个循环中的代码, @setlocal enabledelayedexpansion @echo off cd /d C:\test\temp\ tree ...

  9. 在循环之前或循环中声明变量之间的区别?

    本文翻译自:Difference between declaring variables before or in loop? I have always wondered if, in genera ...

最新文章

  1. 收藏:Sql类型与.Net(C#)类型对应关系
  2. 看尽SLAM、ReID和文字识别等技术进展!15位视觉技术大咖齐聚一堂
  3. ADT17中引入外部JAR包时出现ClassNotFoundException
  4. 吴恩达机器学习笔记11-梯度下降法实践2-学习率
  5. stm32c语言设计以及注释,13个基于STM32的经典项目设计实例,全套资料~-嵌入式系统-与非网...
  6. ajax获取jsp对象,如何用Ajax传递一个对象集合到jsp页面。
  7. blocks bytes extents比较
  8. linux下安装apache mysql,linux下常见的apache+mysql+php的安装
  9. 花钱购买C语言教程,秘籍:小白从零开始玩转C语言教程,足足300集
  10. 中国民营航天公司罗列火箭发射火箭发动机
  11. 关于微信小程序picker之multiSelector多列选择器
  12. mac安装淘宝镜像cnpm,绝对有效!!!!!!
  13. iOS 开发者账号总结
  14. 【考研加油】所有上岸的考研人都有一个共同的特点,就是他们都参加考试了。2023考研加油。
  15. 《设计心理学》学习笔记之设计未来(第四册)
  16. java 网络爬虫_如何用Java实现网络爬虫
  17. html中常用的标签小结
  18. RJ45及RJ11的接线方法
  19. MobaXterm中文版
  20. PHP友盟 接口推送,友盟推送文档接口json格

热门文章

  1. android文字代码,编写使用Android 系统自带的文字转语音代码
  2. 计算机exsl表f4代表锁定,Excel快捷键速查表.doc
  3. SQL交叉表查询 如何实现
  4. (入门自用)--Linux--进程终止与等待--0914--0919
  5. 二本师大计算机排名,全国师范类大学排名 二本师范大学有哪些
  6. 无人值守煤炭运销系统硬件要求有什么
  7. 虚拟机连接服务器需要注意什么,VMware Workstation虚拟机软件常见问题及注意事项说明...
  8. [渝粤教育] 泉州师范学院 闽南历史文化 参考 资料
  9. 方向标准离差指数 DDI
  10. 给网站添加访问地图3d版,平面版