欢迎来到天天文库
浏览记录
ID:50288921
大小:128.50 KB
页数:3页
时间:2020-03-07
《AVR单片机C语言程序设计中的位操作.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、动手学AVR单片机十二、AVR单片机C语言程序设计中的位操作在标准C语言的的教材中,对于位运算的操作是基本不涉及的,但是在单片机系统的程序中,需要经常操作各类以字节为单位的寄存器,而这些寄存器通常都是以二进制中的位为控制单位的数据组合。往往一个8位寄存器中的每一位都有各自的控制对象,例如端口B的方向寄存器DDRB,如下图所示 它实际上控制着PB口的8个端口PB0-PB7的方向,也就是说它的每一位都控制一个端口的方向,如果我们要把端口PB0-PB3设置为输出口,而把PB4-PB7设置为输入口,在不用位运
2、算符的情况下,我们可以直接使用赋值语句DDRB=0x0f来实现,这样是完全可以实现的。 但是如果出现下面的情况:在程序中PB口的8位端口的状态本来是1、3、5、7为输入。0、2、4、6为输出(即DDRB=0x55),接下来要将PB口的第1位设置为输出,其它端口的状态不变,然后又要将第2位设置为输入,其它端口的状态不变。该怎么实现?也许我们仍然可以使用赋值语句来实现,比如DDRB=0x55;接下来设置DDRB=0x57;然后再设置DDRB=0x53;首先要肯定的是,这种做法是绝对正确的。但是我们可能有没
3、有注意到,在改变其中一位的值的时候,我们同时还要考虑其它7位的状态,并且要小心翼翼的避免不小心改变了其它位的值。 那么有没有一种方法,可以简单的实现修改某一位的状态,同时不会改变其它位的状态呢? 这就牵出了单片机C语言程序设计中的位运算的概念。 我们来看这个语句:DDRE
4、=(1<5、调用,现在我们就来看看在io.h中PE5是如何定义的(在WINAVR的安装目录下查找iom64.h),我们可以看到PE口的8位分别定义如下:/*PortEDataRegister-PORTE*/#define PE7 7#define PE6 6#define PE5 5#define PE4 4#define PE3 3#define PE2 2#define PE1 1#define PE0 6、 0 可以看出,实际上PE5=5;那么1<7、=(1<8、(1<9、”表示的是“或”操作DDRE是端口E的方向寄存器,在iom64.h中定义为:#defineDDRE _SFR_IO8(0x02);它实际上是定义了一个标识符,这个标识符对应数据存储区RAM中的某个地址,这个我们暂且不去深究。我们还是回过头来看DDRE=DDRE10、(111、<12、位运算符:移位运算符:左移<<,右移>>与运算符:&或运算符:13、取反运算符:~异或运算符:^ 就这些了,总共只有6中位运算符。现在我们来看一下这些运算符都起什么作用;左移运算符:表达形式为x<14、的值不改变n=1时,x<=8以后,x的值就一直是0了,这是因为x是一个只有8位的整形变量,它的最大二进制长
5、调用,现在我们就来看看在io.h中PE5是如何定义的(在WINAVR的安装目录下查找iom64.h),我们可以看到PE口的8位分别定义如下:/*PortEDataRegister-PORTE*/#define PE7 7#define PE6 6#define PE5 5#define PE4 4#define PE3 3#define PE2 2#define PE1 1#define PE0
6、 0 可以看出,实际上PE5=5;那么1<7、=(1<8、(1<9、”表示的是“或”操作DDRE是端口E的方向寄存器,在iom64.h中定义为:#defineDDRE _SFR_IO8(0x02);它实际上是定义了一个标识符,这个标识符对应数据存储区RAM中的某个地址,这个我们暂且不去深究。我们还是回过头来看DDRE=DDRE10、(111、<12、位运算符:移位运算符:左移<<,右移>>与运算符:&或运算符:13、取反运算符:~异或运算符:^ 就这些了,总共只有6中位运算符。现在我们来看一下这些运算符都起什么作用;左移运算符:表达形式为x<14、的值不改变n=1时,x<=8以后,x的值就一直是0了,这是因为x是一个只有8位的整形变量,它的最大二进制长
7、=(1<8、(1<9、”表示的是“或”操作DDRE是端口E的方向寄存器,在iom64.h中定义为:#defineDDRE _SFR_IO8(0x02);它实际上是定义了一个标识符,这个标识符对应数据存储区RAM中的某个地址,这个我们暂且不去深究。我们还是回过头来看DDRE=DDRE10、(111、<12、位运算符:移位运算符:左移<<,右移>>与运算符:&或运算符:13、取反运算符:~异或运算符:^ 就这些了,总共只有6中位运算符。现在我们来看一下这些运算符都起什么作用;左移运算符:表达形式为x<14、的值不改变n=1时,x<=8以后,x的值就一直是0了,这是因为x是一个只有8位的整形变量,它的最大二进制长
8、(1<9、”表示的是“或”操作DDRE是端口E的方向寄存器,在iom64.h中定义为:#defineDDRE _SFR_IO8(0x02);它实际上是定义了一个标识符,这个标识符对应数据存储区RAM中的某个地址,这个我们暂且不去深究。我们还是回过头来看DDRE=DDRE10、(111、<12、位运算符:移位运算符:左移<<,右移>>与运算符:&或运算符:13、取反运算符:~异或运算符:^ 就这些了,总共只有6中位运算符。现在我们来看一下这些运算符都起什么作用;左移运算符:表达形式为x<14、的值不改变n=1时,x<=8以后,x的值就一直是0了,这是因为x是一个只有8位的整形变量,它的最大二进制长
9、”表示的是“或”操作DDRE是端口E的方向寄存器,在iom64.h中定义为:#defineDDRE _SFR_IO8(0x02);它实际上是定义了一个标识符,这个标识符对应数据存储区RAM中的某个地址,这个我们暂且不去深究。我们还是回过头来看DDRE=DDRE
10、(1
11、<12、位运算符:移位运算符:左移<<,右移>>与运算符:&或运算符:13、取反运算符:~异或运算符:^ 就这些了,总共只有6中位运算符。现在我们来看一下这些运算符都起什么作用;左移运算符:表达形式为x<14、的值不改变n=1时,x<=8以后,x的值就一直是0了,这是因为x是一个只有8位的整形变量,它的最大二进制长
12、位运算符:移位运算符:左移<<,右移>>与运算符:&或运算符:
13、取反运算符:~异或运算符:^ 就这些了,总共只有6中位运算符。现在我们来看一下这些运算符都起什么作用;左移运算符:表达形式为x<14、的值不改变n=1时,x<=8以后,x的值就一直是0了,这是因为x是一个只有8位的整形变量,它的最大二进制长
14、的值不改变n=1时,x<=8以后,x的值就一直是0了,这是因为x是一个只有8位的整形变量,它的最大二进制长
此文档下载收益归作者所有