第15页共39页项目文件名“AltiumDesigner设计教程FPGA51SpiritLevel”项目前续文件接文辑“AltiumDesigner设计教程SL1SL1XilinxSpartanIIEPQ208Rev1.01”(二)FPGA_51_Spirit_Level.PrjFpg1FPGA_51_Spirit_Level.SchDocTSK51AOCDMicroprocessorCLKRSTEASFRDATAO[7..0]SFRDATAI[7..0]SFRADDR[6..0]SFRWRSFRRDROMDATAO[7..0]ROMDATAI[7..0]ROMADDR[15..0]ROMWRROMRDINT0INT1T0T1RXDTXDRXDOP0O[7..0]P0I[7..0]P1O[7..0]P1I[7..0]P2O[7..0]P2I[7..0]P3O[7..0]P3I[7..0]MEMDATAO[7..0]MEMDATAI[7..0]MEMADDR[15..0]MEMWRMEMRDPSWRPSRDP1TSK51A_D[7..0][7..0]LCD_ELCD_RWLCD_RSLCD_DB[7..0]LCD_LIGHT2x16LiquidCrystalDisplayI[7..0]O0O1O2O3O4O5O6O7GNDGND[11..0][11..0]CLK_BRDJTAG_NEXUS_TMSJTAG_NEXUS_TCKJTAG_NEXUS_TDOJTAG_NEXUS_TDITCKTMSTDITDOTRSTJTAG.JTAGJTAGJTAGJTAGJTAG..VCCXout_Alt[10..0][10..0]CLKDELAY[7..0]INITU1FPGA_STARTUP8VCCYout_AltI[7..0]O0O1O2O3O4O5O6O7CLKDOUT[7..0]ADDR[11..0]DIN[7..0]WEM1RAMS_8x4KCLKDOUT[7..0]ADDR[10..0]DIN[7..0]WEM2RAMS_8x2KD0D1S0GNDTEST_BUTTONI1I0I2I3I4I5I6I7O[7..0]CalibrateX/YaxisGNDGNDRemovealljumpersonJP3(Xaxis)andJP4(Yaxis)第16页共39页2SpiritLevel.PrjEmb2.1HeaderDocuments2.1.1hware.h#defineAXIS_PORTP3//portfortheAXISselector#defineKEY_PORTP2//portforTestButton第17页共39页2.1.2TimeTSK51.h//TimerroutinestogenerateaccuratetimedelaysonTSK51processor#definePROCESSOR_CLOCK50000000#defineTEN_US_COUNT12voidWait_10us(intTime);voidWait_1ms(intTime);voidWait_1s(intTime);voidinit_timer0(void);externunsignedint__dataTime0;externunsignedchar__dataTime0_updated;externunsignedint__dataX_T2_Start;externunsignedint__dataX_T3;externunsignedint__dataX_T2;externunsignedint__dataX_T1;externunsignedint__dataISR_T0Count;第18页共39页2.1.3Lcd_Controls.h#defineLCD_DATAP1#defineLCD_BFP1_7#defineLCD_RWP0_1#defineLCD_RSP0_0#defineLCD_EP0_2#defineLCD_LIGHTP0_3#ifdefLCD_DISABLE#defineLCD_BUSY0#else#defineLCD_BUSY(LCD_IR_Read()&0x80)#endif#defineLCD_Set_CGRAM_Address(Address)while(LCD_BUSY);LCD_IR_Write((Address&0x3F)|0x40)#defineLCD_Set_DDRAM_Address(Address)while(LCD_BUSY);LCD_IR_Write(Address|0x80)#defineLCD_Putch(ch)LCD_DR_Write(ch)#defineROW00x00#defineROW10x40voidinlineWrite_LCD(unsignedcharData);voidLCD_IR_Write(unsignedcharData);voidLCD_DR_Write(unsignedcharData);unsignedcharLCD_IR_Read(void);unsignedcharLCD_DR_Read(void);voidInitLCD(void);voidLCD_WriteString(constchar*str);voidLCD_WriteChar(unsignedcharc);第19页共39页voidLCD_ClearDisplay(void);voidLCD_WriteNibble(unsignedcharX);voidLCD_Write8bit(unsignedcharX);voidLCD_Write16bit(unsignedintX);voidLCD_Write32bit(unsignedlongintX);voidLCD_WriteByteAsSignedDec(signedcharVal);voidLCD_GotoXY(unsignedcharX,unsignedcharY);第20页共39页3.1SourceDocuments3.1.1main.c#includehware.h#includeLCD_Control.h#includeTimeTSK51.h#defineSELECT_X_AXIS_ALTAXIS_PORT=0#defineSELECT_Y_AXIS_ALTAXIS_PORT=1signedlongDelXAg;signedlongDelYAg;signedlongAg;signedcharAgDash;signedcharsign;signedcharAngle;signedchar__romLookupAngle[]={0,//00,//11,//21,//32,//42,//53,//63,//74,//84,//94,//105,//115,//126,//13第21页共39页6,//147,//157,//168,//178,//188,//199,//209,//2110,//2210,//2311,//2411,//2512,//2612,//2713,//2813,//2913,//3014,//3114,//3215,//3315,//3416,//3516,//3617,//3717,//3818,//3918,//4019,//4119,//4220,//4320,//44第22页共39页21,//4521,//4622,//4722,//4822,//4923,//5023,//5124,//5224,//5325,//5425,//5526,//5626,//5727,//5827,//5928,//6028,//6129,//6229,//6330,//6431,//6531,//6632,//6732,//6833,//6933,//7034,//7134,//7235,//7335,//7436,//75第23页共39页36,//7637,//7738,//7838,//7939,//8039,//8140,//8240,//8341,//8442,//8542,//8643,//8744,//8844,//8945,//9045,//9146,//9247,//9347,//9448,//9549,//9649,//9750,//9851,//9952,//10052,//10153,//10254,//10355,//10455,//10556,//106第24页共39页57,//10758,//10859,//10960,//11061//111};signedlongCalcAngleRef(unsignedintT1,unsignedintT2){signedlongAg;Ag=(long)T116;Ag=Ag/(long)T2;Ag=Ag-(1L15);Ag=((1L16)*T1)/T2-(1L15);return(Ag);}signedlongGetDeltaAngle(void){signedlongDelAg=0;Time0_updated=0;do{DelAg=((1L16)*X_T1)/X_T2-(1L15);__asm(nop);}while(Time0_updated11);第25页共39页return(DelAg);}voidCalibrateSpiritLevel(void){SELECT_X_AXIS_ALT;DelXAg=GetDeltaAngle();SELECT_Y_AXIS_ALT;DelYAg=GetDeltaAngle();Wait_1ms(500);}voidHello(void){LCD_LIGHT=0;InitLCD();LCD_LIGHT=1;LCD_GotoXY(0,0);LCD_WriteString(SpiritLevelV1.0);LCD_GotoXY(0,1);LCD_WriteString(PressTest/Reset);Wait_1ms(500);while(KEY_PORT==0);}voidLCD_DisplayAngle(unsignedcharROW,signedlongDelAg){第26页共39页while(Time0_updated11){__asm(nop);}Time0_updated=0;LCD_Set_DDRAM_Address(0);LCD_Set_DDRAM_Address(40);Ag=((1L16)*X_T1)/X_T2-(1L15);Ag=Ag-DelAg;AgDash=(signedchar)(Ag/64);sign=AgDash0?-1:1;AgDash*=sign;if(AgDash110){Angle=61*sign;}else{Angle=LookupAngle[AgDash]*sign;}LCD_Set_DDRAM_Address(ROW+12);if(Angle-60)LCD_WriteString();elseif(Angle=60)LCD_WriteString();else第27页共39页LCD_WriteString();LCD_WriteByteAsSignedDec(Angle);LCD_DR_Write(0xDF);LCD_WriteString();}voidSpiritLevel(void){LCD_GotoXY(0,0);LCD_WriteString(Xaxisangle);LCD_GotoXY(0,1);LCD_WriteString(Yaxisangle);while(KEY_PORT==0){SELECT_X_AXIS_ALT;LCD_DisplayAngle(ROW0,DelXAg);SELECT_Y_AXIS_ALT;LCD_DisplayAngle(ROW1,DelYAg);}}voidmain(void){i