51单片机关于片内片外存储器的操作方法总结

来源:互联网 发布:一元包邮 淘宝 编辑:程序博客网 时间:2024/05/21 17:59

一、

char addr,i;
addr=0x30; //起始地址
for(i=0;i<16;i++)
{
         *((char idata*)addr++)=i; //从起始地动址开始赋值
}
addr=0x30;

 

具体意思是:
首先addr自加一,因为++在变量后面,所以该表达式使用自加之前的值,比如第一次循环,表达式使用的addr是0x30.

第二步,将0x30强制转换为char idata类型指针。

第三步,解引用该指针,将i的值赋给该指针指向的地址

 

二、

char addr1,i;
addr = 0x2000;
addr1 = 0x30;  //片内,片外存储区首地址分别为30H、2000H
for(i=0;i<16;i++)  
{
      *((char xdata*)addr++) = i;   //给片外存储地址赋值
}

addr=0x2000;
for(i=0;i<16;i++)   //从片外存储区读取数据
{
     *((char idata*)addr1++) = *((char xdata*)addr++);  //存储到片内的数据存储区
}

 

三、

   char addr,i,j,t;
   addr=0x30;         //数据块的首地址
   for(i=0;i<16;i++)
    {
     *((char idata*)(addr+i))=15-i;     //初始化数据块
 }
   for(i=0;i<15;i++)        //采用冒泡法排序
     for(j=i+1;j<16;j++)
   {
    if(*((char idata*)(addr+i))>*((char idata*)(addr+j)))
       {
      t=*((char idata*)(addr+i));
   *((char idata*)(addr+i))=*((char idata*)(addr+j)); 
   *((char idata*)(addr+j))=t; 
    }
   }

 

 

四、

char aa,i;
 P1=0xff;
 while(1)
  {
  aa=P1;        //初P1口的开关状态
  switch(aa)       //判断是哪个开关闭合
  {
    case 0xff:       //没有开关按下时,则给目标地址一赋0
    {
      for(i=0;i<16;i++)
    {
       *((char idata*)0x30+i)=0x00;
    }
   
    }break;

    case 0xfe:       //第一个开关按下时,则给目标地址一赋1
    {
      for(i=0;i<16;i++)
    {
       *((char idata*)0x30+i)=0x01;
    }
    }break;

    case 0xfd:       //第二个开关按下时,则给目标地址一赋2
    {
      for(i=0;i<16;i++)
    {
       *((char idata*)0x30+i)=0x02;
    }
    }break;

    case 0xfb:       //第三个开关按下时,则给目标地址一赋3
    {
      for(i=0;i<16;i++)
    {
       *((char idata*)0x30+i)=0x03;
    }
    }break;

    default: break;
 
   }
 }