图1 程序控制指令
IF .. THEN 指令
IF 指令含有含有三个分支,分别是Then ,Else 和ElsIF。
图2 IF 语句
图3 浮点数比较条件
IF语句应该是SCL里面最常用的语句了,常用于条件判断。判断类型可以是BOOL类型,可以是浮点类型等等,基本上所有类型都可以判断,只要比较的两个变量类型是一样。
在图2中,AByte 是Byte 类型,因为1在0..255之间,所以1会自动转化为Byte类型。如果比较的是Abyte类型是256,会是什么样子呢?读者可以自己写的程序,试验一下,看看结果,会加深你对数据类型的理解。
上面程序中,首先比如AByte是否和1相等,如果相等则Outvalue的值为1,然后和2比较,如果和2相等,那么OuValue值为2,如果都满足条件OuValue 的输出值则为5。
上述的IF条件语句,也可以用CASE语句来进行表示。CASE的比较类型没有IF 范围广,只有整形才能做为比较条件。
CASE指令
图4 IF语句的CASE表达方式
从CASE语句表述中,我们发现语句相对于IF表达式来说,更加清晰简单明了,所以如果需要用到整形条件作为判断,尽量用CASE来实现,会提高效率。
FOR 指令
FOR指令常用来对数组类型数据进行批量处理,在上一期讲解中已经举过一个例子,下面举个稍微复杂点的例子。
图5 FOR循环语句
在FOR程序,我们对数组的每一个索引值进行赋值,同时判断索引值的奇偶性来进行赋值 *** 作。
图6 FOR循环语句2
在上面的程序里面,我们发现有一个关键字Continue .当FOR循环执行到该语句的时候,Continue下面的程序都不会执行。所以,当iCout小于15的时候,AArray[iCount]:=iCount赋值语句不会执行。
还有一个地方有点区别,就是FOR 语句后面,多了一个关键字 BY 。BY的含义是For 执行的间隔按照BY的设定来执行。如果后面设定为1,则0..99全部执行;如果设定为2,则执行顺序为0,2,4,6,8的顺序来执行。
上述的FOR循环语句,我们同样可以采用WHILE循环来实现。
WHILE 指令
图7 WHILE指令
WHILE循环的表达方式和FOR循环基本类型,但是我们注意一点,这里面对循环变量,手动进行进行递进。如果没有这一句,iCount的值一直为0,循环条件iCount<100将一直为True,WHILE循环会一直执行。所以切记一定执行该语句。
我们还注意到一个关键字EXIT,当执行到该指令的时候,WHILE循环会停止执行,FOR指令也是一样。所以上面的程序,运行下来的情况是,数组的赋值只执行到AArray[81]结束。
GOTO指令
goto指令主要用来执行跳转过程,可以带来程序 *** 作的便利性,一般不推荐使用。若 *** 作不当,则会打乱整个程序的逻辑性。
在图7 中,如果iCount 大于90,那么,程序就会跳出WHILE 循环执行指定标签lable13地方程序#iCount=0,继续从头开始执行WHILE循环。当然这个 *** 作是毫无意义的,这里只是举个例子而已。
发送和接收差不多,这里是个例子,有问题欢迎一起讨论
/*****************************************************
/* 文件名: I2C.h
/* 描述 : I2C.c的头文件
/* 编写环境 : Keil uVision 3 V3.51
/* 作者 : XX
/* 学校 : 广东XX大学
/* Email : lanhaospider@163.com
/* 版本 : V1.0
/* 编写日期 : 2008-3-30
/* 仅供学习参考
/* 芯片 : MCS-51 AT89S52
/* 晶振 : 11.0592MHz
/* 功能描述 : 模拟I2C总线的接口程序库,主机的程序
/* 应用 : 发送n个字节: 起始位->发送控制字节(类型标识符4位->
片选3位->读写位最后1位)->应答位->数据->应答...........应答->终止位
高位先到达,低位后到达
/****************************************************/
#include "reg51.h"/*根据不同主控芯片型号改写该套入*/
#include "intrins.h"
sbit SCL = P1^6 /*定义SCL线所在口,根据实践需要改写该定义*/
sbit SDA = P1^7 /*定义SDA线所在口,根据实践需要改写该定义*/
unsigned char idata error/*错误提示,全局变量*/
extern void Start_I2C(void)
extern void Stop_I2C(void)
extern void Ack_I2C(void)
extern void Send_Ack(void)
extern void Send_Not_Ack(void)
extern void Send_I2C(unsigned char send_byte)
extern unsigned char Receive_I2C(void)
/*****************************************************/
/* 文件名: I2C.c
/* 描述 : I2C通信程序
/* 编写环境 : Keil uVision 3 V3.51
/* 作者 : XX
/* 学校 : 广东XX大学
/* Email : lanhaospider@163.com
/* 版本 : V1.0
/* 编写日期 : 2008-3-30
/* 仅供学习参考
/* 芯片 : MCS-51 AT89S52
/* 晶振 : 11.0592MHz
/* 功能描述 : 模拟I2C总线的接口程序库,为主机的程序
/*****************************************************/
#include "I2C.h"
/**************************************************
调用方式 : void Start_I2C(void)
函数说明: 启动I2C总线
**************************************************/
void Start_I2C(void)
{
EA = 0 /*关总中断*/
SDA = 1 /*发送启动总线的数据信号*/
SCL = 1 /*发送启动总线的时钟信号*/
_nop_() /*保持数据线高,延时*/
_nop_()
_nop_()
_nop_()
_nop_()
SDA = 0 /*发送起始信号*/
_nop_()
_nop_()
_nop_()
_nop_()
_nop_()
SCL = 0 /*时钟线高低跳变一次,I2C通信开始*/
}
/**************************************************
调用方式 : void Stop_I2C(void)
函数说明: 关闭I2C总线
**************************************************/
void Stop_I2C(void)
{
SCL = 0/*发送关闭总线的时钟信号*/
SDA = 0/*发送关闭总线的数据信号*/
_nop_()
_nop_()
_nop_() /*保持数据线低,延时*/
_nop_()
_nop_()
SCL = 1 /*时钟线一次低高跳变,I2C通信停止*/
_nop_()
_nop_()
_nop_()
_nop_()
_nop_()
SDA = 1 /*发送I2C总线停止数据信号*/
_nop_()
_nop_()
_nop_()
_nop_()
_nop_()
EA = 1 /*开总中断*/
}
/**************************************************
调用方式 : void Ask_I2C(void)
函数说明: 主控程序等待从器件接收方式应答
**************************************************/
void Ack_I2C(void)
{
unsigned char errtimes = 0xFF
SDA = 1
SCL = 1
error = 0x10
while(SDA)
{
errtimes--
if(!errtimes)
{
Stop_I2C()
error = 0x11
return
}
}
SCL = 0
}
/**************************************************
调用方式 : void Send_Ask(void)
函数说明: 主控程序为接收方,从器件为发送方时,从
器件等待主器件应答
**************************************************/
void Send_Ack(void)
{
SDA = 0 /*保持数据线低,时钟线发生一次高低跳变 发送一个应答信号*/
_nop_()
_nop_()
_nop_()
_nop_()
_nop_()
SCL = 1 /*时钟线保持低电平*/
_nop_()
_nop_()
_nop_()
_nop_()
_nop_()
SCL = 0
}
/**************************************************
调用方式 : void Send_Not_Ask(void)
函数说明: 主控程序为接收方,从器件为发送方时,非应答信号
**************************************************/
void Send_Not_Ack(void)
{
SDA = 1 /*保持数据线高,时钟线发生一次高低跳变 没有应答*/
_nop_()
_nop_()
_nop_()
_nop_()
_nop_()
SCL = 1 /*时钟线保持高电平*/
_nop_()
_nop_()
_nop_()
_nop_()
_nop_()
SCL = 0
}
/**************************************************
调用方式 : void Send_I2C(unsigned char send_byte)
函数说明: 总线发送一个字节
**************************************************/
void Send_I2C(unsigned char send_byte)
{
unsigned char send_bit
for(send_bit = 8send_bit <= 0send_bit--)
{
SCL = 0
_nop_()
SDA = (send_byte &0x80)
send_byte<<=1
_nop_()
_nop_()
_nop_()
_nop_()
_nop_()
SCL = 1
_nop_()
_nop_()
_nop_()
_nop_()
_nop_()
}
SCL = 0
}
/**************************************************
调用方式 : unsigned char Receive_I2C(void)
函数说明: 从I2C总线上接收一个字节
**************************************************/
unsigned char Receive_I2C(void)
{
unsigned char receive_bit , receive_byte = 0
for(receive_bit = 8receive_bit <= 0receive_bit--)
{
SCL = 0
_nop_()
_nop_()
_nop_()
_nop_()
_nop_()
_nop_()
SCL = 1
_nop_()
_nop_()
_nop_()
_nop_()
_nop_()
receive_byte <<=1
receive_byte |= SDA
}
SCL = 0
return receive_byte
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)