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

📄 main.c

📁 单片机开发环境 windows+ads+hjtag
💻 C
📖 第 1 页 / 共 2 页
字号:

#include "SP_LIB.H"


#ifdef OS_TASK_CREATE_EXT_EN
	//#define DSP_OS_INFO
#endif


#ifdef DSP_OS_INFO
	#define MyTaskCreate( task, pdata, STK, STK_Size, prio)     OSTaskCreateExt( \
		task,  pdata,   &STK[STK_Size - 1],                                         \
		prio,   prio,  &STK[0],  STK_Size,                                               \
		(void *)0,     OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);     
#else
	#define MyTaskCreate( task, pdata, STK, STK_Size, prio)     OSTaskCreate(  \
 		task, pdata, &STK[STK_Size- 1], prio);		
#endif



enum tagTaskPrio {
	TIME_ACTION_TASK_PRIO = 10,
	FILE_TASK_PRIO,


	SD_TEST_TASK_PRIO,
	SET_TIME_TASK_PRIO,
	FLASH_TASK_PRIO,
	WIRELESS_TASK_PRIO,
	CABLE_COM_TASK_PRIO,
	KEY_TASK_PRIO,
	LCD_TASK_PRIO,
	START_TASK_PRIO,
	PIN_YIN_INPUT_PRIO,
#ifdef DSP_OS_INFO
	OS_INFO_TASK_PRIO,
#endif
	OS_PRIO_TOTAL
};




#define	FILE_TASK_STK_SIZE	300				
OS_STK	FileTaskStk [FILE_TASK_STK_SIZE];		
//void  TimeActionTask(void *pdata);	

#define	TIME_ACTION_TASK_STK_SIZE	200				
OS_STK	TimeActionTaskStk [TIME_ACTION_TASK_STK_SIZE];		
void  TimeActionTask(void *pdata);	

#define	START_TASK_STK_SIZE	300				
OS_STK	StartTaskStk [START_TASK_STK_SIZE];		
void  StartTask(void *pdata);	


//for the following task will not run at the same time, so they use the same stack
#define COMM_STK_SIZE 512
OS_STK	CommStk [COMM_STK_SIZE];		

void  LCDTask(void *pdata);	
void  KeyTask(void *pdata);	
void  CableComTask(void *pdata);	
void  WirelessTask(void *pdata);	
void  FlashTask(void *pdata);	
void  SetTimeTask(void *pdata);	
void  SDTestTask(void *pdata);	


#ifdef DSP_OS_INFO

#define	OS_INFO_STK_SIZE	128				
OS_STK	OSInfoStk [OS_INFO_STK_SIZE];		

void OSInfoTask( void *pdata )
{
	INT8U str[50];
	INT8U       err;
	OS_STK_DATA data;                       /* Storage for task stack data                             */
	INT8U       i;

	SCI_Open( COM0, SCICFG_Baud9600, SCICFG_8DataBit, SCICFG_ParityNone, SCICFG_1StopBit);

	for( ;; ) {
		sprintf((char*)str, "Total= %d, CPU usage= %d, switches= %d\r\n", OSTaskCtr, OSCPUUsage, OSCtxSwCtr );
		SCI_Send( COM0, str, StrLen(str) );
		OSTimeDly( OS_DLY_100MS );
		for (i = TIME_ACTION_TASK_PRIO; i < OS_PRIO_TOTAL; i++) {
			err  = OSTaskStkChk( i, &data);
			if (err == OS_NO_ERR) {
				sprintf((char*)str, "task#= %d, Free= %d, Used= %d\r\n", i, data.OSFree/4, data.OSUsed/4 );
				SCI_Send( COM0, str, StrLen(str) );
				OSTimeDly( OS_DLY_100MS );
			}
		}

		//state task
		err  = OSTaskStkChk(OS_STAT_PRIO, &data);
		if (err == OS_NO_ERR) {
			sprintf((char*)str, "task= State Task, Free= %d, Used= %d\r\n", data.OSFree/4, data.OSUsed/4 );
			SCI_Send( COM0, str, StrLen(str) );
		}
		//idle task
		err  = OSTaskStkChk(OS_IDLE_PRIO, &data);
		if (err == OS_NO_ERR) {
			sprintf((char*)str, "task= Idle Task, Free= %d, Used= %d\r\n", data.OSFree/4, data.OSUsed/4 );
			SCI_Send( COM0, str, StrLen(str) );
		}
		OSTimeDly( OS_DLY_1000MS );
	}
}
#endif






int main (void)
{
	OSInit ();				

	MyTaskCreate( StartTask, (void *)0, StartTaskStk, START_TASK_STK_SIZE, START_TASK_PRIO);

	OSStart ();
	return 0;															
}



#define MAIN_MENU_BUTTON_TOTAL 8
void StartTask(void *pdata)
{
	INT8U buttonIndex;
	INT8U key;
	INT8U buttonStyle;
	INT8U str[10];
	INT8U viewPortIndex;
	INT16S ret;
	 
	pdata = pdata;
	SystemInit ();




#ifdef DSP_OS_INFO
    OSTaskCreateExt(OSInfoTask,
                          (void *)0,                                   
                          &OSInfoStk[OS_INFO_STK_SIZE - 1],   // Set Top-Of-Stack    
                          OS_INFO_TASK_PRIO,                                // One higher than the idle task
                          OS_INFO_TASK_PRIO,
                          &OSInfoStk[0],                           // Set Bottom-Of-Stack          
                          OS_INFO_STK_SIZE,
                          (void *)0,                                   // No TCB extension             
                          OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);  // Enable stack checking + clear 
#endif
	MyTaskCreate( TimeActionTask, (void *)0, TimeActionTaskStk, TIME_ACTION_TASK_STK_SIZE, TIME_ACTION_TASK_PRIO);
	MyTaskCreate( OSFileTask, (void *)0, FileTaskStk, FILE_TASK_STK_SIZE, FILE_TASK_PRIO);



	BuzzerBeep( 300 );
	while( (ret = LCD_CreateViewPort()) == ERROR_NO_VIEWPORT_AVAILABLE ) {
		OSTimeDly( OS_DLY_100MS );
	}
	viewPortIndex = ret;
	LCD_SetContrast( 10);//0~31
	Key_SetKeyLEDDelay( 5 );//key led delay 5 seconds. if set to 0, key led will not turn on or off automatically
	LCD_SetBackLightDelay( 10 );//back light delay 30 seconds. if set to 0, backlight will not turn on or off automatically
	PWR_SetIdleTimeLimit( 600 );	// after 600 second without key operation, system idle, 0 to disable idle

	buttonIndex = 0;
	key = KEY_0;
	while (1) {
		if( key ) {
			LCD_ActiveViewPort( viewPortIndex );
			LCD_SetFont( Fnt_GB11x12 );
			LCD_SetPixelPos( 10, 30 );
			LCD_PutStr(  (INT8U*)"上海桑博电子&&上志电子"  );

			LCD_SetFont( Fnt_GB15x16);
			LCD_SetPixelPos( 3, 140 );
			LCD_PutStr( (INT8U*)"中国★上海:59532657" );
			sprintf( (char*)str, "V%.2f", LIB_GetVersion() );
			LCD_SetFont( Fnt_GB11x12 );
			LCD_SetPixelPos( 70, 13 );
			LCD_PutStr( str );
			buttonStyle = ((buttonIndex==0)?LCD_INVERT_COPY:LCD_COPY);
			LCD_Button( 10, 45, 60, 20, (INT8U*)"显示",  buttonStyle );
			buttonStyle = ((buttonIndex==1)?LCD_INVERT_COPY:LCD_COPY);
			LCD_Button( 10, 69, 60, 20, (INT8U*)"按键",  buttonStyle );
			buttonStyle = ((buttonIndex==2)?LCD_INVERT_COPY:LCD_COPY);
			LCD_Button( 10, 93, 60, 20, (INT8U*)"有线通讯",  buttonStyle );
			buttonStyle = ((buttonIndex==3)?LCD_INVERT_COPY:LCD_COPY);
			LCD_Button( 10, 117, 60, 20, (INT8U*)"无线通讯",  buttonStyle );
			buttonStyle = ((buttonIndex==4)?LCD_INVERT_COPY:LCD_COPY);
			LCD_Button( 80, 45, 60, 20, (INT8U*)"设置时间",  buttonStyle );
			buttonStyle = ((buttonIndex==5)?LCD_INVERT_COPY:LCD_COPY);
			LCD_Button( 80, 69, 60, 20, (INT8U*)"数据存储",  buttonStyle );
			buttonStyle = ((buttonIndex==6)?LCD_INVERT_COPY:LCD_COPY);
			LCD_Button( 80, 93, 60, 20, (INT8U*)"sd卡测试",  buttonStyle );
			buttonStyle = ((buttonIndex==7)?LCD_INVERT_COPY:LCD_COPY);
			LCD_Button( 80, 117, 60, 20, (INT8U*)"- - - -",  buttonStyle );
			LCD_DeactiveViewPort( viewPortIndex );

		}

		OSTimeDly( OS_DLY_20MS );  
		key = Key_GetCode();
		switch( key ) {
			case KEY_UP:
				if( buttonIndex ) {
					buttonIndex--;
				}
				else {
					buttonIndex = MAIN_MENU_BUTTON_TOTAL-1;
				}
				break;
			case KEY_DOWN:
				if( buttonIndex >= MAIN_MENU_BUTTON_TOTAL-1 ) {
					buttonIndex = 0;
				}
				else {
					buttonIndex++;
				}
				break;
			case KEY_LEFT:
				if( buttonIndex >= 4 ) {
					buttonIndex -= 4;
				}
				break;
			case KEY_RIGHT:
				if( buttonIndex < 4 ) {
					buttonIndex += 4;
				}
				if( buttonIndex >= MAIN_MENU_BUTTON_TOTAL-1 ) {
					buttonIndex = MAIN_MENU_BUTTON_TOTAL-1;
				}
				break;
			case KEY_ENTER:
				switch( buttonIndex ) {
					case 0:
						MyTaskCreate( LCDTask, (void *)0, CommStk, COMM_STK_SIZE, LCD_TASK_PRIO);
						break;
					case 1:
						MyTaskCreate( KeyTask, (void *)0, CommStk, COMM_STK_SIZE, KEY_TASK_PRIO);
						break;
					case 2:
						MyTaskCreate( CableComTask, (void *)0, CommStk, COMM_STK_SIZE, CABLE_COM_TASK_PRIO);
						break;
					case 3:
						MyTaskCreate( WirelessTask, (void *)0, CommStk, COMM_STK_SIZE, WIRELESS_TASK_PRIO);
						break;
					case 4:
						MyTaskCreate( SetTimeTask, (void *)0, CommStk, COMM_STK_SIZE, SET_TIME_TASK_PRIO);
						break;
					case 5:
						MyTaskCreate( FlashTask, (void *)0, CommStk, COMM_STK_SIZE, FLASH_TASK_PRIO);
						break;
					case 6:
						MyTaskCreate( SDTestTask, (void *)0, CommStk, COMM_STK_SIZE, SD_TEST_TASK_PRIO);
						break;
					case 7:
						continue;
				}
				OSTaskSuspend( OS_PRIO_SELF );

				LCD_ActiveViewPort( viewPortIndex );
				LCD_ClrVP();
				LCD_DeactiveViewPort( viewPortIndex );
				break;

		}
	}

}





void TimeActionTask(void *pdata)
{
	INT8U err;
	INT8U str[30];
	INT8U viewPortIndex;
	INT16S ret;
	INT8U battStatus;
	RTCTime time;
	INT8U battDeadCount=0;

	
	pdata = pdata; //避免编译警告

	while( (ret = LCD_CreateViewPort()) == ERROR_NO_VIEWPORT_AVAILABLE ) {
		OSTimeDly( OS_DLY_100MS );
	}
	viewPortIndex = ret;
	LCD_ActiveViewPort( viewPortIndex );
	LCD_SetViewPortSize( 0, 0, 159, 30 );
	LCD_SetFont( Fnt_GB11x12 );
	LCD_DeactiveViewPort( viewPortIndex );
	for (;;) {
		OSSemPend(RTCTickSem, 0, &err);	//once per second

		battStatus = PWR_GetBatteryStatus();
		if( battStatus == BATT_DEAD) {
			battDeadCount++;
		}
		else {
			battDeadCount = 0;
		}

		if( Key_PowerOff() 
			||(PWR_IdleTimeOut() == TRUE)
			|| (battDeadCount >= 10 ) 	) {
			PWR_SystemOff();
		}
		

		time = RTCGetTime();
		sprintf( (char*)str, "%04d年%02d月%02d日", time.tm_year, time.tm_mon, time.tm_mday );

		LCD_ActiveViewPort( viewPortIndex );
		LCD_SetPixelPos( 1, 0 );
		LCD_PutStr( str );
		sprintf( (char*)str, "  %02d:%02d:%02d", time.tm_hour, time.tm_min, time.tm_sec );
		LCD_SetPixelPos( 0, 13 );
		LCD_PutStr( str );

		LCDS_1BitBmp( 120, 5, 32, 16, (INT8U*)Bmp_Battery[battStatus] );
		LCD_DeactiveViewPort( viewPortIndex );
	}
}



enum tagSDTestState {
	SDTest_CardError=0,
	SDTest_ReadFile,
	SDTest_ReadFinished,
	SDTest_WriteFile,
	SDTest_WriteError
};
void  SDTestTask(void *pdata)
{
	INT8U viewPortIndex;
	static INT16S ret;

	HANDLE hFile;
	INT8U state;
	INT16U ch;
	INT8U str[30];
	INT8U key=KEY_NONE;
	

	
	pdata = pdata;

	while( (ret = LCD_CreateViewPort()) == ERROR_NO_VIEWPORT_AVAILABLE ) {
		OSTimeDly( OS_DLY_100MS );
	}
	viewPortIndex = ret;
	LCD_ActiveViewPort( viewPortIndex );
	LCD_SetViewPortSize( 0, 30, 159, 159 );
	LCD_ClrVP();
	LCD_SetFont( Fnt_GB11x12 );
	LCD_SetPixelPos( 50, 0 );
	LCD_PutStr( (INT8U*)"SD卡测试" );
	LCD_Button( 100, 109, 50, 20, (INT8U*)"返回",  LCD_INVERT_COPY);
	LCD_DeactiveViewPort( viewPortIndex );



	LCD_ActiveViewPort( viewPortIndex );
	LCD_SetPixelPos( 10, 50 );
	LCD_PutStr( (INT8U*)"正在检测SD卡。。。" );
	LCD_DeactiveViewPort( viewPortIndex );
	if( SD_Initialize() == ERROR_NONE ) {
		ret = OSAddFileDriver( SDMMCCommand );
		ret = OSChangeDir( (INT8S*)"Science" );
		if( ret == PATH_NOT_FIND ) {
			ret = OSMakeDir( (INT8S*)"Science" );
			if( ret == ERROR_NONE ) {
				ret = OSChangeDir( (INT8S*)"Science" );
			}
		}
		state = SDTest_ReadFile;
		LCD_ActiveViewPort( viewPortIndex );
		LCD_Button( 10, 109, 50, 20, (INT8U*)"写文件",  LCD_INVERT_COPY);
		LCD_DeactiveViewPort( viewPortIndex );
	}
	else {
		LCD_ActiveViewPort( viewPortIndex );
		LCD_SetPixelPos( 10, 50 );
		LCD_PutStr( (INT8U*)"SD卡初始化失败!        " );
		LCD_DeactiveViewPort( viewPortIndex );
		state = SDTest_CardError;
	}


	while (1) {
		if( state == SDTest_ReadFile ) {
			ret = OSFileClose( hFile );
			hFile = OSFileOpen( (INT8S*)"ReadTest.txt", (INT8S*)"r" );
			LCD_ActiveViewPort( viewPortIndex );
			LCD_SetViewPortSize( 1, 45, 159, 139 );
			LCD_ClrVP();
			LCD_DeactiveViewPort( viewPortIndex );
			if( hFile != Not_Open_FILE ) {
				while( OSFileGetCh( (INT8S*)str, hFile ) == ERROR_NONE ) {
					if( str[0] > 0xA0 ) {
						if( ch == 0 ) {
							ch = str[0];
							continue;
						}
						else {
							ch <<= 8;
							ch += str[0];
						}
					}
					else {
						ch = str[0];
					}
					LCD_ActiveViewPort( viewPortIndex );
					LCD_PutCh( ch );
					LCD_DeactiveViewPort( viewPortIndex );
					ch = 0;
				}
			}
			else {
				LCD_ActiveViewPort( viewPortIndex );
				LCD_SetPixelPos( 10, 50 );
				LCD_PutStr( (INT8U*)"打开文件(ReadTest.txt)失败!" );
				LCD_DeactiveViewPort( viewPortIndex );
			}
			ret = OSFileClose( hFile );
			state = SDTest_ReadFinished;
		}
		OSTimeDly( OS_DLY_100MS );
		key = Key_GetCode();
		switch( key ) {
			case KEY_F1:
				if( state == SDTest_CardError ) {
					break;
				}
				LCD_ActiveViewPort( viewPortIndex );
				LCD_SetViewPortSize( 0, 30, 159, 159 );
				if( state == SDTest_WriteFile || state == SDTest_WriteError ) {
					state = SDTest_ReadFile;
					LCD_Button( 10, 109, 50, 20, (INT8U*)"写文件",  LCD_INVERT_COPY);
				}
				else {
					state = SDTest_WriteFile;
					LCD_Button( 10, 109, 50, 20, (INT8U*)"读文件",  LCD_INVERT_COPY);
				}
				LCD_SetViewPortSize( 1, 45, 159, 139 );
				LCD_ClrVP();
				LCD_DeactiveViewPort( viewPortIndex );


				if( state == SDTest_WriteFile ) {
					ret = OSFileClose( hFile );
					hFile = OSFileOpen( (INT8S*)"WriteTst.txt", (INT8S*)"w" );
					if( hFile == Not_Open_FILE ) {
						LCD_ActiveViewPort( viewPortIndex );
						LCD_SetPixelPos( 10, 50 );
						LCD_PutStr( (INT8U*)"创建文件(WriteTst.txt)失败!" );
						LCD_DeactiveViewPort( viewPortIndex );
						state = SDTest_WriteError;
					}
				}		
				continue;
			case KEY_F2:
				if( state != SDTest_CardError ) {
					OSFileCloseAll( );
					OSRemoveFileDriver(0);
				}
				LCD_DeleteViewPort( viewPortIndex );
				OSTaskResume( START_TASK_PRIO );		
				OSTaskDel( OS_PRIO_SELF );
				break;
			case KEY_NONE:
				continue;
			case KEY_SEND:
				sprintf( (char*)str, "Send " );
				break;
			case KEY_ON_OFF:
				sprintf( (char*)str, "ON/OFF" );
				break;
			case KEY_ENTER:
				sprintf( (char*)str, "Enter" );
				break;
			case KEY_UP:
				sprintf( (char*)str, "Up" );
				break;
			case KEY_DOWN:
				sprintf( (char*)str, "Down" );
				break;
			case KEY_LEFT:
				sprintf( (char*)str, "Left" );
				break;
			case KEY_RIGHT:
				sprintf( (char*)str, "Right" );
				break;
			default:
				sprintf( (char*)str, "%c ", key );
				break;		
		}
		if( state == SDTest_WriteFile ) {
			OSFileWrite( str, StrLen(str), hFile );
			OSFileWrite( "\r\n", 2, hFile );
			LCD_ActiveViewPort( viewPortIndex );
			LCD_PutStr( str );
			LCD_DeactiveViewPort( viewPortIndex );
		}
	}
}


void  LCDTask(void *pdata)
{
	INT8U viewPortIndex;
	INT16S ret;

⌨️ 快捷键说明

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