如果是汇编,XDATA的很好访问,直接用MOVX指令,访问的就是XDATA,比如:
MOV DPTR,#1000H
MOVX A,@DPTR
如果是C语言,那么声明变量时加上xdata就可以了。比如
#include<reg51h>
unsigned int xdata a;
main()
{
a=0x5a;
printf("%d",a);
while(1);
}
也可以采取另一种方式来访问XDATA,比如:
#include<reg51h>
#include<absacch>
#define uchar unsigned char
#define uint unsigned int
//PA、PB、PC端口及命令端口地址定义
#define PA XBYTE[0x0000]
#define PB XBYTE[0x0001]
#define PC XBYTE[0x0002]
#define COM XBYTE[0x0003]
//待显示字符编码队列
uchar code DSY_CODE_Queue[]={
0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xa4,0xc0,0xc0,0x80,0xc0,0x80,0xf9,
0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff
};
//数码管选通
uchar codeDSY_Index[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
//延时
void DelayMS(uint ms)
{
uchari;
while(ms--)for(i=0;i<120;i++);
}
//主程序
void main()
{
uinti,j,k;
COM=0x80; //8255工作方式选择:PA、PB均输出,工作方式0
while(1)
{
for(j=0;j<40;j++) //刷新显示一段时间
{
for(k=0;k<8;k++) //在8个数码管上显示字符
{
PB=DSY_Index[k]; //位码
PA=DSY_CODE_Queue[k+1]; //段码
DelayMS(1);
}
}
i=(i+1)%15; //刷新显示一段时间后递增i,形成滚动效果,最大索引为14
}
}
你的程序在每次写入和读出一个数据延时一段时间,我写c02时延时的是5MS,
AT24C16
处理速度有点慢,如果你有STC的单片机话就用STC内部的EEPROM吧(实际上是FLASH)
ReadAddr是个16bit的数据,可分为高8bit和低8bit
两个可能:
1高8位为寄存器地址的高8位,低8位为寄存器地址的低8位。就像if里面走的
2高8位为从机地址(slave地址)的一部分,也是7位的slave地址(所以要左移一位(ReadAddr/256)<<1),而且是以0xA0为基址的从机地址,所以从机地址应该是:(0XA0+((ReadAddr/256)<<1)),低8位为寄存器地址的低8位。就像else里面的走的
以上 是我的理解 可能有所偏差
以上就是关于KEIL 编程 如何使用XDATA全部的内容,包括:KEIL 编程 如何使用XDATA、51单片机向at24c16EPROM写入一个数据每问题,写入多个数据,读出的数据都一样、IIC程序问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)