用C语言给51单片机编程时,怎么给外部单元的地址赋值(单片机的指针问题)
初学51单片机,有些问题请教!
我知道在标准c语言里面是不能给指定的一个地址单元赋值的,但是不知道单片机这里能不能这样。
问题1:keil c51中怎么才能使用DPTR寄存器?用keil时包含 <reg51.h> 后我可以使用DPH和DPL但是不能使用DPTR,难道单片机的c里面不能用DPTR?
问题2:单片机的c中指针是多少位的?在标准c里任何类型的指针都是4个字节,即32位(虽然这和操作系统还有编译器有关但一般来说都是32位),但是51单片机好像片内与片外的地址不是一样长的啊(片内8位,片外16位),那么用c给它编程时,其中的指针是多长呢?
问题3:如果我要给一个外部单元,比如0x853f,向这个单元里面写入数据。该怎么办?在标准c里面是不容许直接给一个地址赋值的,但是我在keil里面直接赋值还是能够编译通过,这是否能说这在单片机的编程里面是可以的?
[解决办法]
问题1:keil c51中怎么才能使用DPTR寄存器?用keil时包含 <reg51.h> 后我可以使用DPH和DPL但是不能使用DPTR,难道单片机的c里面不能用DPTR?
C里面不推荐直接操作寄存器...
问题2:单片机的c中指针是多少位的?在标准c里任何类型的指针都是4个字节,即32位(虽然这和操作系统还有编译器有关但一般来说都是32位),但是51单片机好像片内与片外的地址不是一样长的啊(片内8位,片外16位),那么用c给它编程时,其中的指针是多长呢?
单片机里的指针分两类,
一类是通用指针,它是三个字节,一个字节是存储区域类型,另外两个字节是地址
一类是确定区域的指针,由于区域确定,那它直接就是一个地址值.有可能是两个字节或是一个字节
问题3:如果我要给一个外部单元,比如0x853f,向这个单元里面写入数据。该怎么办?在标准c里面是不容许直接给一个地址赋值的,但是我在keil里面直接赋值还是能够编译通过,这是否能说这在单片机的编程里面是可以的?
单片机里面没有那些讨厌的高级内存特性,大家都知道的空间,你写就是了,呵呵
但是,这不是一个好的习惯,自己权衡一下哈
[解决办法]
一般类型指针:存储器类型+高位偏移+低位偏移(与标准C相同,不过同时还可以说明指针的存储类型)
如:
long *tate; //为一个指向 long 型整数的指针,而 tate本身则依存储模式存放
char *xrata ptr; //为一个指向 char数据的指针而 ptr本身放于外部RAM区
例如:
char *cp;
int *ip;
long *lp;
char data dc= 'A ';
int data di=12;
long data dl=2007;
cp=&dc;
ip=&ip;
lp=&dl;
同时也可以访问 code存储器,xdata存储器
----------------------------------------------------
存储器指针: 总是指向特定的存储区
如: char data *str; //str指向data 区中的 char型数据
int xdata *pow; //pow指向外部RAM的int 类型数据
例如:
char data *cp; //指向 data存储器中的 char 型变量的指针
int xdata *ip; //指向 xdata 存储器中的int 型变量的指针
long code *lp; //指向 code 存储器中的 long 型变量的指针
char data dc= 'A ';
int xdata buf[3]={ 'A ',12,2007};
long code lx=2007;
cp=&dc;
ip=&buf[1];
lp=&lx;
[解决办法]
Dos时代,经常有为了加速显示直接写显存的勾当,你不知道,不要说人家不能。
[解决办法]
*((char *)0x9a9590ff) = 'a ';
[解决办法]
也可以在编译时控制定义变量的地址
然后给该变量赋值,也可达到效果
不过用起来有点麻烦