📄 link1.c
字号:
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 + -