单片机C语言怎么声明一个可以位寻址的变量
我是初学者,我想定义一个变量,要把这变量存放于可位寻址区,后期可以对每一位进行单独操作的,最好是能把这变量固定在那个地址不变的,要怎么编写呢忘了说明是C51单片机的...
我是初学者,我想定义一个变量,要把这变量存放于可位寻址区,后期可以对每一位进行单独操作的,最好是能把这变量固定在那个地址不变的,要怎么编写呢
忘了说明是C51单片机的 展开
忘了说明是C51单片机的 展开
展开全部
是这个样子的,你只要声明了位变量,比如bit a;而且这个变量是全局变量,或者是函数内部的静态变量,那么,这个位变量的地上就恒不变了,只是地址是多少这个是编译器随机分配的,不敢十分确定,但是在以后的运行中,地址肯定是不变的。
如果你声明的是函数内部的动态变量,比如在函数内部声明:bit a,那么,这个位变量是随着函数的调用变化的,其地址也是变化的。
所以,你只要声明一个全局的位变量,那么,这个变量就肯定是地址不变的,当然,不知道其地址具体是多少罢了。
如果你非要知道每个地址是多少,那么,有两个办法:
1 你集中把128个位全部都定义出来。
比如,你在某个C文件里,这样写:
bit Bit00 = 0;
bit Bit01 = 0;
bit Bit02 = 0;
bit Bit03 = 0;
一直定义128个,把所有位空间占满,那么,这样,就可以肯定Bit00的地址是0x20的最低位,bit01的地址是0x20的次低位了。
2 用sbit,而不用bit.
比如:unsigned char data B_Var[16] = 0;
sbit Led_Status1 = B_Var[0]^7;那么,就表示Led_Status 是第20H地址中的最高位。
sbit Led_Status2 = B_Var[6]^3;那么,就表示Led_Status 是第26H地址中的第3位。
这个其实并不是定义了位变量,只是起了个别名而已。但效果一样,只是注意,你更改B_Var[6],可能会更改26H的地址第3位,所以,如果你只用位,那么,就不要操作B_Var[6]这个数组元素。
其实呢,你只要定义个全局变量就行了,没有必要知道这个bit变量的地址,因为没有什么实际意义。
如果你声明的是函数内部的动态变量,比如在函数内部声明:bit a,那么,这个位变量是随着函数的调用变化的,其地址也是变化的。
所以,你只要声明一个全局的位变量,那么,这个变量就肯定是地址不变的,当然,不知道其地址具体是多少罢了。
如果你非要知道每个地址是多少,那么,有两个办法:
1 你集中把128个位全部都定义出来。
比如,你在某个C文件里,这样写:
bit Bit00 = 0;
bit Bit01 = 0;
bit Bit02 = 0;
bit Bit03 = 0;
一直定义128个,把所有位空间占满,那么,这样,就可以肯定Bit00的地址是0x20的最低位,bit01的地址是0x20的次低位了。
2 用sbit,而不用bit.
比如:unsigned char data B_Var[16] = 0;
sbit Led_Status1 = B_Var[0]^7;那么,就表示Led_Status 是第20H地址中的最高位。
sbit Led_Status2 = B_Var[6]^3;那么,就表示Led_Status 是第26H地址中的第3位。
这个其实并不是定义了位变量,只是起了个别名而已。但效果一样,只是注意,你更改B_Var[6],可能会更改26H的地址第3位,所以,如果你只用位,那么,就不要操作B_Var[6]这个数组元素。
其实呢,你只要定义个全局变量就行了,没有必要知道这个bit变量的地址,因为没有什么实际意义。
展开全部
单片机中,可以位寻址的有两个地方,第一是特殊功能寄存器中可以被8整除的寄存器,第二就是20H~2FH这个位址空间。两个地方的位变量申明不一样。
第一个地方的申明是: sbit 位变量
比如:sbit pwm=P1^0;
第二个地方的申明是:bit 位变量
比如: bit flag;
第一个地方的申明是: sbit 位变量
比如:sbit pwm=P1^0;
第二个地方的申明是:bit 位变量
比如: bit flag;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
首先是你的头文件是#include<reg51.h>
在这个头文件中包含着一些声明比如:sfr scan ;
这个声明是你在程序中不必写出来的,只需要#include<reg51.h>
然后你再在你的程序中写语句:sbit 变量名 P0^1;
注意这个P0^1是指P0输出/输入的第一个位。希望对你有帮助
在这个头文件中包含着一些声明比如:sfr scan ;
这个声明是你在程序中不必写出来的,只需要#include<reg51.h>
然后你再在你的程序中写语句:sbit 变量名 P0^1;
注意这个P0^1是指P0输出/输入的第一个位。希望对你有帮助
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
int *cc;
cc=(int*)0X6300 ;
*cc=3;
cc=(int*)0X6300 ;
*cc=3;
更多追问追答
追问
我是初学者,还不是很清楚命令,能帮我把每句都写上中文说明吗?那个*号是什么意思?我在书中没看到,那个0x6300怎么这么大?最大不是0xFF吗?你是设了个16位的?
追答
如果你不知道你的计算机是多少位寻址可以这样做
char *p="a";
printf("%p",p);
这样就把p的地址输出来了。
int *cc是定义一个指针,
cc=(int*)0X6300 是吧地址强制类型转换成指向该地址的指针
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询