⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 link1.c

📁 这个程序用于单片机和无线传输芯片CC2500之间的传送
💻 C
📖 第 1 页 / 共 2 页
字号:
void FlashWrite (unsigned char xdata *pwrite, unsigned char *BufFrom, unsigned char len)
  {
	   bit EA_SAVE = EA;                   // preserve EA
       //unsigned char xdata * data pwrite;           // FLASH write pointer
	   unsigned char i;
	   EA = 0;                             // disable interrupts
	   //pwrite = (unsigned char xdata *) addr;

	   // change clock speed to slow, then restore later
	   VDM0CN = 0x80;                      // enable VDD monitor
	   RSTSRC = 0x02;                      // enable VDD monitor as a reset source

 	   for (i=0;i<len;i++)
	    {
 
		   FLKEY  = 0xA5;                      // Key Sequence 1
		   FLKEY  = 0xF1;                      // Key Sequence 2

           //pwrite = (unsigned char xdata *) (addr+i);	 
		  
            PSCTL |= 0x01; 
		   *pwrite++ = *BufFrom++;       	 
			
            PSCTL &= ~0x01; 				// PSWE = 0
	     }
	   PSCTL &= ~0x01;                     // PSWE = 0
	   EA = EA_SAVE;                       // restore interrupts
   }


//采用指针方法实现,对flash读操作采用movc指令,故采用code指针类型,bufTo为存放读取值的缓冲指针
//len为数据长度

void FlashRead1(unsigned char code * pread , unsigned char * BufTo,unsigned char len)
 {
    bit EA_SAVE = EA;                   // preserve EA

	unsigned char i;
	
    EA=0;

   	for (i=0;i<len;i++)
       {
	   		BufTo[i]=*pread;
			pread++;
	    }
    EA=EA_SAVE;
 }

//对flash读操作采用CBYTE[],bufTo为存放读取值的缓冲指针

void FlashRead2(unsigned int adr, unsigned char * BufTo,unsigned char len)
 {
   unsigned char i;
   for (i=0;i<len;i++)
      {
	    BufTo[i]=CBYTE[adr];
		adr++;
	   }
 }

//----------------------------------------------------

unsigned char ReadStringUART(char *Dest,unsigned char BufferLen)
{
	char c;
	unsigned char count = 0;

	while(BufferLen--)
	{
		*Dest = '\0';
		c = getkey();
		if(c == '\r' || c == '\n')
			break;
		count++;
		*Dest++ = c;
	}
	return count;
}



//-----------------------------------------------------------------------------
// MAIN Routine
//-----------------------------------------------------------------------------

void main (void) 
{																																			

	char buf [30]="欢迎使用准直仪!SN:";
	
	unsigned int Axy[4]={0,0,0,0};
	unsigned char isel,bQuit,LampYY=0;

	idata char response[15]; 
	idata float result[2];

	unsigned char indata[2];
	xdata float Cxy[4]={0.01,0.02,0.3,0.44};
	xdata float Kxy[4]={1.0,1.0,1.0,1.0};
	xdata unsigned char SFlag=0;
    xdata unsigned char time=4;  //idata

	unsigned char SN[9] = "2008-001"; // 将被拷贝到FLASH中的字符串
	
	unsigned char SAVEFLAG='C';

  
//reset:  
   PCA0MD &= ~0x40;                    // WDTE = 0 (clear watchdog timer enable)   
                          // Initialize Port I/O
   SYSCLK_Init ();                     // Initialize Oscillator
   UART0_Init();
   Delay(8000);     //等待键1s
   PORT_Init(); 
   LcmInit();  
   LcmClearTXT();
   
   PutStr(0,0,buf);
   SN[8]='\0';
   PutStr(1,2,SN);

   Delay(8000);     //等待键

   // Initiates board setup process if button is depressed on startup
   FlashRead2(FLOG_PAGE_ADDR,&SFlag,1);	 
   if(SFlag!=0xFF)
    {
		FlashRead1(FLOG_PAGE_ADDR+1,Cxy,16);
		FlashRead1(FLOG_PAGE_ADDR+20,Kxy,16);		
		FlashRead2(FLOG_PAGE_ADDR+40,&time,1);
		FlashRead1(FLOG_PAGE_ADDR+45,SN,8);
    }

  if(key3 == 0u || SFlag==0xFF)
    {
	   Delay(3000);     //延迟
	   		
		// Invalidate the EEPROM contents if BUTTON0 is held down for more than 4 seconds
		//TICK StartTime = TickGet();

		if(key3 == 0u || SFlag==0xFF)
		{
	      
           while(!bQuit)
			{
				// Display the menu
				
				printf("\r\n\r\n\r自准直仪器配置菜单:\r\n\r\n");
				printf("\t1: Change serial number(SN):\t");
				                                   printf(SN);
				printf("\r\n\t2: Setting X-Axis :\tKx1=%2.4f",Kxy[0]);
				printf("\r\n\t3: Setting X-Axis :\tKx2=%2.4f",Kxy[1]);
				printf("\r\n\t4: Setting Y-Axis :\tKy1=%2.4f",Kxy[2]);
				printf("\r\n\t5: Setting Y-Axis :\tKy2=%2.4f",Kxy[3]);
				printf("\r\n\t6: Setting X-Axis Absolute Center Value:\tCx=%2.2f",Cxy[0]);			
				printf("\r\n\t7: Setting Y-Axis Absolute Center Value:\tCy=%2.2f",Cxy[1]);
				printf("\r\n\t8: CCD Integration Time(1-4):\t\tT=%c",time+48);

				printf("\r\n\t9: About Me:\t\t Help");
				printf("\r\n\t0: Save & Exit");
				printf("\r\nEnter a menu choice: ");			
				// Wait for the user to press a key	Execute the user selection
				switch(getkey())
				{
					case '1':
						printf("\nNew Serial Number setting(ex:2008-001): ");
						if(ReadStringUART(SN, sizeof(SN)))
						{//SN= response;}
						break;
					case '2':
					    printf("\nNew Kx1 value setting: ");
						if(ReadStringUART(response, sizeof(response)))
						{Kxy[0] = atof((char*)response);}
						break;				
					case '3':
					    printf("\nNew Kx2 value setting: ");
						if(ReadStringUART(response, sizeof(response)))
						{Kxy[1] = atof((char*)response);}
						break;			
					case '4':
					    printf("\nNew Ky1 value setting: ");
						if(ReadStringUART(response, sizeof(response)))
						{Kxy[2] = atof((char*)response);}
						break;						
					case '5':
						printf("\nNew Ky2 value setting: ");
						if(ReadStringUART(response, sizeof(response)))
						{Kxy[3] = atof((char*)response);}
						break;
					case '6':
						printf("\nNew X1 Center value setting: ");
						if(ReadStringUART(response, sizeof(response)))
						{Cxy[0] = atof((char*)response);}
						break;	
					case '7':
					    printf("\nNew Y1 Center value setting: ");
						if(ReadStringUART(response, sizeof(response)))
						{Cxy[1] = atof((char*)response);}
						break;				
					case '8':
						printf("\nNew Integrate time T value setting(1-4): ");
						if(ReadStringUART(response, sizeof(response)))
						{time = atoi((char*)response);}
						break;	
					case '9':
						printf("\n\t光学自准直仪器 Ver1.0, Copy Right Reservt (2008). \n\tTel:13817125881 ,Email:zhangxuedian@hotmail.com ");
						
						break;	
					case '0':
						bQuit = 1;			
					   	//SaveAppConfig();
						FlashErasePage (FLOG_PAGE_ADDR);
						FlashWrite(FLOG_PAGE_ADDR,&SAVEFLAG,1);
						FlashWrite(FLOG_PAGE_ADDR+1,Cxy,16);
						FlashWrite(FLOG_PAGE_ADDR+20,Kxy,16);
						FlashWrite(FLOG_PAGE_ADDR+40,&time,1);
						FlashWrite(FLOG_PAGE_ADDR+45,SN,8);		 
						printf("\r\n\r\nExit & Save data into EEPROM.\r\n\r\n");
						LcmClearTXT();
						while(key3 == 0u){		
							  LcmClearTXT();	
							  PutStr(1,0,"Release Key3,Restart gain...");}						
						break;
			 	}//end switch
			}//end while	   
		  
		   //goto reset;
		  			
	     }//end if
	  }//end if
    }
   FlashRead1(FLOG_PAGE_ADDR+1,Cxy,16);
   FlashRead1(FLOG_PAGE_ADDR+20,Kxy,16);   
   FlashRead2(FLOG_PAGE_ADDR+40,&time,1);
   FlashRead1(FLOG_PAGE_ADDR+45,SN,8);
   switch (time)
    {
	   case 1:
		   P0|=63;
		   break;
	   case 2:
		   P0|=127;
		   break;
	   case 3:
		   P0|=191;
		   break;
	   case 4:
		   P0|=255;
		   break;   
    }
 
   LcmClearTXT();
	  
  
   isel=sprintf (buf, "Cx=%2.2f,Cy=%2.2f,K1=%2.2f,K2=%2.2f",Cxy[0],Cxy[1],Kxy[0],Kxy[1]);
   buf[isel+1]='\0';
   PutStr(0,0,buf);
  
   isel=sprintf (buf, "K3=%2.2f,K4=%2.2f,T=%c",Kxy[2],Kxy[3],time+48);
   buf[isel+1]='\0';
   PutStr(2,0,buf);
 
   Delay(80000);     //等待复位
   Delay(80000);     //等待
   LcmClearTXT();
   PutStr(0,0,"警告!!        电路或光路异常,请调节偏置电阻或光路狭缝。");

   printf("\n\n   X1    X2     Y1     Y2    -new list,copy into Excel and calculate the K --");

   while (1)
    {
           
	   if(LampXY==LampX) 
			{
			   	if(xReady==1)					//pin-ready数据=high,开始接受
	    	    {
			       P1 &=0xfc;
			       for(isel=0;isel<2;isel++)  {  // 修改4->2,原来1次性读取8个数据;
			         P1 &=0xfc;          //现在读取4个数据,
					 P1 |=2*isel;
		             Delay(2);
		             P2=0xff;
		             indata[0]=P2;
					 P1 &=0xfc;
					 P1 |=2*isel+1;
		             Delay(2);
		             P2=0xff;
		             indata[1]=P2;
                    
					 Axy[isel]=indata[0]+indata[1]*256;
					 result[0]=(Axy[1]+Axy[0])*Kxy[0]+(Axy[1]-Axy[0])*Kxy[1];}

				  }
                }
          else
			  {
			   	if(yReady==1)					//pin-ready数据=high,开始接受
	    	     {
				   P1 &=0xfc;
			       for(isel=0;isel<2;isel++)  {  // 修改4->2,原来1次性读取8个数据;
			         P1 &=0xfc;          //现在读取4个数据,
					 P1 |=2*isel;
		             Delay(2);
		             P2=0xff;
		             indata[0]=P2;
					 P1 &=0xfc;
					 P1 |=2*isel+1;
		             Delay(2);
		             P2=0xff;
		             indata[1]=P2;                    
					 Axy[isel]=indata[0]+indata[1]*256;
					 result[1]=(Axy[3]+Axy[2])*Kxy[2]+(Axy[3]-Axy[2])*Kxy[3];}
				  }
			    
			    }
			
						
			printf("\n %u, %u, %u, %u",Axy[0],Axy[1],Axy[2],Axy[3]);
            
			LcmClearTXT();
		    
			//isel=sprintf (buf, "Dx=%.5u, %.5u\0",Axy[0],Axy[1]);
			//buf[isel+1]='\0';
	     	//PutStr(0,0,buf);
		
			//isel=sprintf (buf, "Dy=%.5u, %.5u\0",Axy[2],Axy[3]);
            //buf[isel+1]='\0';
	     	//PutStr(1,0,buf);
	       
		   result[0]-=Cxy[2];
		   result[1]-=Cxy[3];

           PutStr(0,0,"X-轴");
           PutStr(2,0,"Y-轴");

		   //isel=sprintf (buf, "%c: X=%3.2f",SFlag,result[0]);			
		   isel=sprintf (buf, "   X=%3.2f\"",result[0]);			
		   buf[isel+1]='\0';
		   PutStr(1,0,buf);		
		   isel=sprintf (buf, "   Y=%3.2f\"",result[1]);	
		   buf[isel+1]='\0';		
		   PutStr(3,0,buf);	       

       	    Delay(3000);     //等待复位
            
		//else	//ready=0;
		  // {		   
			  //  LcmClearTXT();
			//    PutStr(0,0,"警告!!        电路或光路异常,请调节偏置电阻或光路狭缝。");
			
		    }
  	
	  //Key_in();
		  

		if(key1==0u)
		{
		  Delay(500);
		  if (key1==0u)
		  {
		  //以原来绝对中心值计算坐标
		    Cxy[2]=Cxy[0];
			Cxy[3]=Cxy[1];
			SFlag='C';
			//SaveAppConfig();
			FlashErasePage (FLOG_PAGE_ADDR);
			FlashWrite(FLOG_PAGE_ADDR,&SAVEFLAG,1);
			FlashWrite(FLOG_PAGE_ADDR+1,Cxy,16);
			FlashWrite(FLOG_PAGE_ADDR+20,Kxy,16);
			FlashWrite(FLOG_PAGE_ADDR+40,&time,1);
			FlashWrite(FLOG_PAGE_ADDR+45,SN,8);	
			 
			LcmClearTXT();
			isel= sprintf(buf,"中心值设定成功!");
            buf[isel+1]='\0';
	        PutStr(0,0,buf);
			isel=sprintf (buf, "Cx=%u",Cxy[2]);
			buf[isel+1]='\0';
	     	PutStr(1,0,buf);
			isel=sprintf (buf, "Cy=%u",Cxy[3]);
			buf[isel+1]='\0';
	     	PutStr(2,0,buf);
            isel=sprintf (buf, "K3: 返回");
			buf[isel+1]='\0';
	     	PutStr(3,2,buf);
            while(key3==1u) {}
           }
		   while(key3==0){}
		}
        
		if(key2==0u)
		{
		  Delay(500);
		  if (key2==0u)
		  {
		  //以当前值为相对中心值计算坐标
		    Cxy[2]=result[0];
		    Cxy[3]=result[1];
		    SFlag='A';
			FlashErasePage (FLOG_PAGE_ADDR);
			FlashWrite(FLOG_PAGE_ADDR,&SAVEFLAG,1);
			FlashWrite(FLOG_PAGE_ADDR+1,Cxy,16);
			FlashWrite(FLOG_PAGE_ADDR+20,Kxy,16);
			FlashWrite(FLOG_PAGE_ADDR+40,&time,1);
			FlashWrite(FLOG_PAGE_ADDR+45,SN,8);
			
			LcmClearTXT();
			isel= sprintf(buf,"任意值设定成功!");
            buf[isel+1]='\0';
	        PutStr(0,0,buf);
		    isel=sprintf (buf, "Cx=%u",Cxy[2]);
			buf[isel+1]='\0';
	     	PutStr(1,0,buf);
			isel=sprintf (buf, "Cy=%u",Cxy[3]);
			buf[isel+1]='\0';
	     	PutStr(2,0,buf);
            isel=sprintf (buf, "K3: 返回");
			buf[isel+1]='\0';
	     	PutStr(3,2,buf);
            while(key3==1u) {}			
          }
		   while(key3==0){}
		}
        
		if (key3==0u)
		{
		  Delay(500);
		  if (key3==0u)
		  {
			  LcmClearTXT();
			  isel= sprintf(buf,"设定时间:(1-4)");
              buf[isel+1]='\0';
     	      PutStr(0,0,buf);
			  isel= sprintf(buf,"说明:");
              buf[isel+1]='\0';
     	      PutStr(2,0,buf);
			  isel= sprintf(buf,"K1:+  K2:OK");
              buf[isel+1]='\0';
     	      PutStr(3,0,buf);
			 
			  while(key3==0u){}
			  while(key2==1u)
				 { 
					  isel= sprintf (buf, "T=%c",time+48);
					  buf[isel+1]='\0';
	                  PutStr(1,4,buf);
					  if(key1==0u)  
					    {
						   if(time>=4) 
						   {time=1;}
						   else
						   {
						      time++;}
                         }
					  Delay(100);
				  }
				  //exit and save Time
			  switch (time)
			    {
				   case 1:
					   P0|=63;
					   break;
				   case 2:
					   P0|=127;
					   break;
				   case 3:
					   P0|=191;
					   break;
				   case 4:
					   P0|=255;
					   break;   
			    }
             // save
			FlashErasePage (FLOG_PAGE_ADDR);
			FlashWrite(FLOG_PAGE_ADDR,&SAVEFLAG,1);
			FlashWrite(FLOG_PAGE_ADDR+1,Cxy,16);
			FlashWrite(FLOG_PAGE_ADDR+20,Kxy,16);
			FlashWrite(FLOG_PAGE_ADDR+40,&time,1);
			FlashWrite(FLOG_PAGE_ADDR+45,SN,8);
		   }
		 }			 
      }//end while
 
}
// End Of File



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -