变量在循环中丢失———中间变量的重要性
变量在循环中丢失———中间变量的重要性
我们来看这样一个程序:
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);}
}
变量在循环中丢失———中间变量的重要性相关推荐
- stm32怎么调用for循环内部的变量_循环中的异步amp;amp;循环中的闭包
在这之前先要了解一下 for循环中let 和var的区别 var 是函数级作用域或者全局作用域,let是块级作用域 看一个例子 function foo() { for (var ...
- Matlab中for循环中的循环变量在循环体中不能改变
如下代码: for i = 1:10if i==3i=i+5;end end 其中的 i=i+5 这一行不会改变for循环中i的值,for循环变量i会取哪些值,是第一次进入循环时就决定了的.无论在循环 ...
- Python编程语言学习:在for循环中如何同时使用2个变量或者3个变量
Python编程语言学习:在for循环中如何同时使用2个变量或者3个变量 目录 在for循环中如何同时使用2个变量或者3个变量 在for循环中如何同时使用2个变量
- Python坑:bool是int的子类、列表循环中的变量泄露、lambda在闭包中会保存局部变量、重用全局变量
bool是int的子类 a = True print isinstance(a, int) print True == 1 print False == 0 运行结果: True True True ...
- go语言for循环中修改临时变量无效
总结 1. for循环中,遍历变量是临时变量,修改不影响原始变量 2. for循环中如果想修改原始变量,可以直接修改原始变量本身才行 实验如下图 代码如下 package main import &q ...
- php foreach 符号,关于php:php-foreach循环中变量之前的符号
本问题已经有最佳答案,请猛点这里访问. Possible Duplicate: Reference - What does this symbol mean in PHP? 我需要知道为什么在fore ...
- java 中for循环中重复定义的变量 为什么不报错?
java 中for循环中重复定义的变量 为什么不报错? public class Test1 {public static void main(String[] args) {int[] arr = ...
- bat for 循环中定义变量(变量值不显示,通过使用「延期变量扩展」方式解决)
■前言 今天实现业务功能时,写了类似如下,第一个循环中的代码, @setlocal enabledelayedexpansion @echo off cd /d C:\test\temp\ tree ...
- 在循环之前或循环中声明变量之间的区别?
本文翻译自:Difference between declaring variables before or in loop? I have always wondered if, in genera ...
最新文章
- 收藏:Sql类型与.Net(C#)类型对应关系
- 看尽SLAM、ReID和文字识别等技术进展!15位视觉技术大咖齐聚一堂
- ADT17中引入外部JAR包时出现ClassNotFoundException
- 吴恩达机器学习笔记11-梯度下降法实践2-学习率
- stm32c语言设计以及注释,13个基于STM32的经典项目设计实例,全套资料~-嵌入式系统-与非网...
- ajax获取jsp对象,如何用Ajax传递一个对象集合到jsp页面。
- blocks bytes extents比较
- linux下安装apache mysql,linux下常见的apache+mysql+php的安装
- 花钱购买C语言教程,秘籍:小白从零开始玩转C语言教程,足足300集
- 中国民营航天公司罗列火箭发射火箭发动机
- 关于微信小程序picker之multiSelector多列选择器
- mac安装淘宝镜像cnpm,绝对有效!!!!!!
- iOS 开发者账号总结
- 【考研加油】所有上岸的考研人都有一个共同的特点,就是他们都参加考试了。2023考研加油。
- 《设计心理学》学习笔记之设计未来(第四册)
- java 网络爬虫_如何用Java实现网络爬虫
- html中常用的标签小结
- RJ45及RJ11的接线方法
- MobaXterm中文版
- PHP友盟 接口推送,友盟推送文档接口json格
热门文章
- android文字代码,编写使用Android 系统自带的文字转语音代码
- 计算机exsl表f4代表锁定,Excel快捷键速查表.doc
- SQL交叉表查询 如何实现
- (入门自用)--Linux--进程终止与等待--0914--0919
- 二本师大计算机排名,全国师范类大学排名 二本师范大学有哪些
- 无人值守煤炭运销系统硬件要求有什么
- 虚拟机连接服务器需要注意什么,VMware Workstation虚拟机软件常见问题及注意事项说明...
- [渝粤教育] 泉州师范学院 闽南历史文化 参考 资料
- 方向标准离差指数 DDI
- 给网站添加访问地图3d版,平面版