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

📄 test.c

📁 uCOS实现交通灯转换
💻 C
字号:

/******************************Test*******************************/
#include "includes.h"
#define  TASK_STK_SIZE   512				//任务堆栈长度
OS_STK   MyTaskStk[TASK_STK_SIZE];		//定义任务堆栈区
OS_STK   YouTaskStk[TASK_STK_SIZE];		//定义任务堆栈区
OS_STK   InPutTaskStk[TASK_STK_SIZE];		//定义任务堆栈区	

INT16S   key;								//用于退出uCOS_II的键
INT8U	 x=0,y=0;							//字符显示位置
INT8U    row=0,column=0,round=60;
void  MyTask(void *data);						//声明任务
void  YouTask(void *data);						//声明任务
void  InPutTask(void *data);
void  drawstreet();

/************************主函数*********************************/
void  main (void)
{
    char* s_M="M";							//定义要显示的字符
    OSInit( );									//初始化uCOS_II
    PC_DOSSaveReturn( );						//保存Dos环境
    PC_VectSet(uCOS, OSCtxSw);				//安装uCOS_II中断
	drawstreet();
    OSTaskCreate(
MyTask,								//创建任务MyTask
		s_M,								//给任务传递参数
		&MyTaskStk[TASK_STK_SIZE - 1],		//设置任务堆栈栈顶指针
		0									//任务的优先级别为0
);	
	OSTaskCreate(
        InPutTask,								//创建任务MyTask
		(void *)0,								//给任务传递参数
		&InPutTaskStk[TASK_STK_SIZE - 1],		//设置任务堆栈栈顶指针
		4									//任务的优先级别为0
);	


	
    OSStart( );								//启动多任务管理
}


void drawstreet(){
	row=0;
	column=0;
	while(row<10){
	 PC_DispChar(row, 10,			//显示字符的位置
		'-', 
		DISP_BGND_BLACK+DISP_FGND_WHITE );

	 PC_DispChar(row+20, 10,			//显示字符的位置
		'-', 
		DISP_BGND_BLACK+DISP_FGND_WHITE );

	  PC_DispChar(row, 15,			//显示字符的位置
		'-', 
		DISP_BGND_BLACK+DISP_FGND_WHITE );

	 PC_DispChar(row+20, 15,			//显示字符的位置
		'-', 
		DISP_BGND_BLACK+DISP_FGND_WHITE );
	 row=row+1;
	}
	while(column<10){
	 PC_DispChar(10, column,			//显示字符的位置
		'|', 
		DISP_BGND_BLACK+DISP_FGND_WHITE );

	 PC_DispChar(10, column+15,			//显示字符的位置
		'|', 
		DISP_BGND_BLACK+DISP_FGND_WHITE );



	 PC_DispChar(20, column,			//显示字符的位置
		'|', 
		DISP_BGND_BLACK+DISP_FGND_WHITE );

	 PC_DispChar(20, column+15,			//显示字符的位置
		'|', 
		DISP_BGND_BLACK+DISP_FGND_WHITE );

	 column=column+1;
	}

 


}

/*******************任务MyTask**********************************/

void  MyTask (void *pdata)
{
    x=round;						//定义要显示的字符
	OSTaskDel(2);
#if OS_CRITICAL_METHOD == 3
    OS_CPU_SR  cpu_sr;
#endif
    pdata = pdata; 
    OS_ENTER_CRITICAL( );
    PC_VectSet(0x08, OSTickISR);				//安装时钟中断向量
    PC_SetTickRate(OS_TICKS_PER_SEC);		//设置时钟频率
    OS_EXIT_CRITICAL( );
    OSStatInit( );								//初始化统计任务


	PC_DispChar(10, 12,			//显示字符的位置
		'G', 
		DISP_BGND_BLACK+DISP_FGND_GREEN );
	PC_DispChar(14, 9,			//显示字符的位置
		'R', 
		DISP_BGND_BLACK+DISP_FGND_RED );

    for (;;) 
    {   
        if (x==0) 
		{   
			gotoxy(11,14);
			printf("0");
			gotoxy(15,11);
			printf("0");
			PC_DispChar(10, 12,			//显示字符的位置
		   'R', 
		    DISP_BGND_BLACK+DISP_FGND_RED );
    
	        PC_DispChar(14, 9,			//显示字符的位置
		    'R', 
		    DISP_BGND_BLACK+DISP_FGND_RED );
	   		OSTimeDlyHMSM(0, 0, 3, 0);			//等待3秒
	   		
			OSTaskCreate(
            YouTask,								//创建任务MyTask
			(void *)0,									//给任务传递参数
			&YouTaskStk[TASK_STK_SIZE - 1],	//设置任务堆栈栈顶指针
			2									// MyTask的优先级别为2
            );

        }    
		if(x<10){
			gotoxy(12,14);
			printf("%c",' ');
			gotoxy(16,11);
			printf("%c",' ');
			
		}
		if(x<100){
			gotoxy(13,14);
			printf("%c",' ');
			gotoxy(16,11);
			printf("%c",' ');
		}
        gotoxy(11,14);
		printf("%d",x);
		gotoxy(15,11);
		printf("%d",x);
		x--;
		
    	OSTimeDlyHMSM(0, 0, 1, 0);			//等待3秒
}
}

/************************任务YouTask******************************/

void  YouTask (void *pdata)
{
	x=round;
#if OS_CRITICAL_METHOD == 3
    OS_CPU_SR  cpu_sr;
#endif
    pdata = pdata; 
    OSTaskDel(0);
	PC_DispChar(10, 12,			//显示字符的位置
		'R', 
		DISP_BGND_BLACK+DISP_FGND_RED );
    
	PC_DispChar(14, 9,			//显示字符的位置
		'G', 
		DISP_BGND_BLACK+DISP_FGND_GREEN );
    for (;;) 
    { 
		if(x==0){
			gotoxy(11,14);
			printf("0");
			gotoxy(15,11);
			printf("0");
            PC_DispChar(10, 12,			//显示字符的位置
		   'R', 
		    DISP_BGND_BLACK+DISP_FGND_RED );
    
	        PC_DispChar(14, 9,			//显示字符的位置
		    'R', 
		    DISP_BGND_BLACK+DISP_FGND_RED );

			OSTimeDlyHMSM(0, 0, 3, 0);			//等待3秒
	   		OSTaskCreate(
            MyTask,								//创建任务MyTask
			(void *)0,									//给任务传递参数
			&MyTaskStk[TASK_STK_SIZE - 1],	//设置任务堆栈栈顶指针
			0									// MyTask的优先级别为2
            );
		}
		if(x<10){
			gotoxy(12,14);
			printf("%c",' ');			
			gotoxy(16,11);
			printf("%c",' ');
		}
		if(x<100){
			gotoxy(13,14);
			printf("%c",' ');
			gotoxy(16,11);
			printf("%c",' ');
		}
        gotoxy(11,14);
		printf("%d",x);
		gotoxy(15,11);
		printf("%d",x);
		x--;
       		
		
        OSTimeDlyHMSM(0, 0, 1, 0);		//等待1秒
    }
}


void  InPutTask (void *pdata){
#if OS_CRITICAL_METHOD == 3
    OS_CPU_SR  cpu_sr;
#endif
	char* s1 = "10";
	char* s_G="G";
    char* s_R="R";							//定义要显示的字符
	/*用于计算的变量*/
	INT8U key,lastkey;
	INT8U err;
	char temp[5];
	INT32U sum=0;
	int times=0;
	pdata = pdata;
	/*显示字符串,学号姓名等*/
	PC_DispStr(0,0,"0543042055_TangGang",DISP_FGND_LIGHT_RED);
	PC_DispStr(0,1,"Please input a number:",DISP_FGND_LIGHT_GRAY);
	
	for (;;){
		if (PC_GetKey(&key)==TRUE){
			if(key==0x1B)PC_DOSReturn();										//如果按下Esc键则退出uCOS_II,恢复Dos环境
			/*数字处理,以及Backspace键的处理*/
			if(key>47&&key<58&&times<3||key==8){
				if(times==0){
					PC_DispStr(24,1,"     ",DISP_FGND_LIGHT_GRAY);
					PC_DispStr(29,1,"       ",DISP_FGND_LIGHT_GRAY);
					PC_DispStr(44,17,"                                                     ",DISP_FGND_LIGHT_GRAY);
				}
				if(key!=8){
					++times;
					PC_DispChar(24+times,1,key,DISP_FGND_LIGHT_GRAY);
					sum=sum*10+key-48;
					lastkey=key;
				}
				if(key==8&&times>0){
					PC_DispChar(24+times,1,' ',DISP_FGND_LIGHT_GRAY);
					sum=(sum-lastkey+48)/10;
					times-=1;
				}
				
			}
		}
		/*输入回车后处理,判断值是否在范围内*/
		if (key == 13){
			if(times==0){
					PC_DispStr(24,2,"  ",DISP_FGND_LIGHT_GRAY);
				}
			/*不在范围内的处理*/
			if ( sum < 20 || sum > 120){
				PC_DispStr(10,2,"Please input a number between 20 and 120",DISP_FGND_LIGHT_GRAY);
			}
			/*在范围内的处理*/
			else{
				round=sum;
			    
			}

		}
	}
}


/************************End************************************/

⌨️ 快捷键说明

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