📄 main.c
字号:
/*
*********************************************************************************************************
**
** 初始化,定义和子函数
*********************************************************************************************************
*/
#include "config.h"
#include "stdio.h"
#include "math.h"
#define Task0StkLengh 64 // 定义任务Task0的堆栈长度
#define Task1StkSize 128 // 定义任务Task1的堆栈长度
#define Task2StkSize 128 // 定义任务Task2的堆栈长度
#define Task3StkSize 128 // 定义任务Task3的堆栈长度
#define BEEP 1<<7
OS_STK Task0Stk [Task0StkLengh]; // 定义任务Task0的堆栈
OS_STK Task1Stk [Task1StkSize]; // 定义任务Task1的堆栈
OS_STK Task2Stk [Task2StkSize]; // 定义任务Task2的堆栈
OS_STK Task3Stk [Task3StkSize]; // 定义任务Task3的堆栈
OS_EVENT *pd0;
OS_EVENT *sem7;
uint32 hh=0;
int vv,mm;
uint8 n=1,s5=1,z=1,zj3,k0=1,k1=0,k2=0,k3=1;
int8 ff[20][2]={2,10,
10,10,
};
void Task0(void *pdata); // 任务Task0
void Task1(void *data); // 任务Task1
void Task2(void *data); // 任务Task2
void Task3(void *data); // 任务Task3
int key(void);
void led(uint8 a);
void ISendStr (uint8 x, uint8 y, uint8 color, char *str);
void PC_DispChar (uint8 x, uint8 y, uint8 chr, uint8 color);
void ISendStr1 (uint32 da);
void UART0_Init (void);
char snack(int8 ss[][2],uint8 d,uint8 s9);
char snack1(int8 ss[][2],uint8 d1,uint8 mn1);
void MSPI_Init(void);
void mp(uint8 a);
uint8 u,s0,je;
unsigned char rrr(unsigned char vv0,unsigned char vv1) //随机函数
{u=rand()%10;
if(vv0/10<=u&&u<=vv1/10&&s0)
{je=u*10;
s0=0;
return 0;
}
else
{if(!s0)
{if(je/10!=vv0/10&&je/10!=vv1/10)
{ je+=u;
s0=1;
return 1;
}
if(je/10==vv0/10&&vv0%10<=u&&je/10!=vv1/10)
{s0=1;
je+=u;
return 1;
}
if(je/10==vv1/10&&vv1%10>=u&&je/10!=vv0/10)
{s0=1;
je+=u;
return 1;
}
if(vv0/10==vv1/10&&vv1%10>=u&&vv0%10<=u)
{s0=1;
je+=u;
return 1;
}
}
}
return 0;
}
uint8 u1,s1,je1;
unsigned char rrr1(unsigned char vv0,unsigned char vv1) //随机函数
{ u1=rand()%10;
if(vv0/10<=u1&&u1<=vv1/10&&s1)
{je1=u1*10;
s1=0;
return 0;
}
else
{if(!s1)
{if(je1/10!=vv0/10&&je1/10!=vv1/10)
{ je1+=u1;
s1=1;
return 1;
}
if(je1/10==vv0/10&&vv0%10<=u1&&je1/10!=vv1/10)
{s1=1;
je1+=u1;
return 1;
}
if(je1/10==vv1/10&&vv1%10>=u1&&je1/10!=vv0/10)
{s1=1;
je1+=u1;
return 1;
}
if(vv0/10==vv1/10&&vv1%10>=u1&&vv0%10<=u1)
{s1=1;
je1+=u1;
return 1;
}
}
}
return 0;
}
uint8 kk(int8 aa,int8 bb) //判断点有没有在蛇身函数
{uint8 zj;
if(n!=1)
{for(zj=n-1;zj!=0;zj--)
{ if(ff[zj][0]==ff[zj-1][0])
{
if(!(ff[zj][1]>bb)==(ff[zj-1][1]>bb))
{if(ff[zj][0]==aa)
return 0;
}
}
if(ff[zj][1]==ff[zj-1][1])
{
if(!(ff[zj][0]>aa)==(ff[zj-1][0]>aa))
{if(ff[zj][1]==bb)
return 0;
}
}
}
}
return 1;
}
/*
*********************************************************************************************************
**
** 主函数启动多任务
*********************************************************************************************************
*/
int main (void)
{
OSInit ();
OSTaskCreate (Task0,(void *)0, &Task0Stk[Task0StkLengh - 1], 3);
pd0=OSSemCreate(0);
sem7=OSSemCreate(1);
OSStart ();
return 0;
}
/*
********************************************************************************************************
** Task0 任务0
** 完成目标板初始化和创建任务和按扭处理
********************************************************************************************************
*/
void Task0 (void *pdata)
{
pdata = pdata;
TargetInit ();
OSTaskCreate (Task1,(void *)0, &Task1Stk[Task1StkSize - 1], 2);
OSTaskCreate (Task2,(void *)0, &Task2Stk[Task2StkSize - 1], 4);
OSTaskCreate (Task3,(void *)0, &Task3Stk[Task3StkSize - 1], 5);
{ uint8 err;
uint16 ii;
pdata = pdata; // 避免编译警告
PINSEL0 = 0x05;
PINSEL1=00;
PINSEL2=PINSEL2&(~0X08);
IO1DIR|=0XFF<<18;
IO0DIR|=BEEP;
UART0_Init ();
ISendStr1 (hh); //初始化数码管
for(ii=0;ii<2000;ii++) //清屏
{PC_DispChar(ii%80,ii/80,32,0);
}
snack(ff,n,0x21); //画蛇初始化
IO1SET|=0XFF<<18;
for (;;)
{switch(key()) //按扭
{case 1:zj3=1;
break;
case 2:zj3=2; //向左
break;
case 3:zj3=3; //向下
break;
case 4:zj3=4; //向上
break;
case 5:if(k0)
{k0=0;
led(11);
}
else
{k0=1;
led(1);
}
break;
case 6:if(k3)
{ k3=0;
err=OSTaskSuspend (4);
}
else
{k3=1;
err=OSTaskResume (4);
}
break;
}
if(k1)
{ k1=0;
z=1;
n=1;s5=1;
hh=0;
ff[0][0]=2;
ff[0][1]=10;
ff[1][0]=10;
ff[1][1]=10; //按扭
ISendStr1 (hh); //初始化数码管
for(ii=0;ii<2000;ii++) //清屏
PC_DispChar(ii%80,ii/80,32,0);
snack(ff,n,0x21); //画蛇初始化
err=OSSemPost(pd0);
err=OSTaskResume (4);
}
if(ff[n][0]==vv&&ff[n][1]==mm) //是否吃到豆子
{err=OSSemPost(pd0);
s5=0;
OSSemPend(sem7,0,&err);
ISendStr1 (++hh);
k2=1;
err=OSSemPost(sem7); //产生豆子
} //是否吃到豆子
OSTimeDly(8);
}
}
}
/*
********************************************************************************************************
** Task1任务
** 声音和流水灯任务
********************************************************************************************************
*/
void Task1(void *pdata)
{int d1=0,d2=0;
pdata=pdata;
for(;;)
{if(k2)
{IO0CLR|=BEEP; //发声
k2=0;
}
if(k0) //led为流水
{IO1SET|=0XFF<<18;
led(d1);
if(d1==0)
d2=1;
if(d1==8)
d2=0;
if(d2)
d1++;
else
d1--;
}
else //led为全亮
IO1CLR|=0XFF<<18;
OSTimeDly(15);
IO0SET|=BEEP;
}
}
/*
********************************************************************************************************
** Task2 任务
** 蛇前进任务
********************************************************************************************************
*/
void Task2(void *pdata)
{
uint8 err,zj,zj1,zj2;
pdata = pdata; // 避免编译警告
for(;;)
{if(k0)
{if(n!=1) //是否碰到蛇身
{for(zj=n-1;zj!=0;zj--)
{if(ff[zj][0]==ff[zj-1][0])
{
if(!(ff[zj][1]>ff[n][1])==(ff[zj-1][1]>ff[n][1]))
{
if(ff[n][0]>ff[n-1][0])
{if(ff[zj][0]==ff[n][0]+1)
{if(ff[n-1][1]>ff[n-2][1])
zj3=3;
else
zj3=4;
goto sss; //蛇头碰到蛇身改变蛇头
}
}
if(ff[n][0]<ff[n-1][0])
{if(ff[zj][0]==ff[n][0]-1)
{
if(ff[n-1][1]>ff[n-2][1])
zj3=3;
else
zj3=4;
goto sss; //蛇头碰到蛇身改变蛇头
}
}
}
}
if(ff[zj][1]==ff[zj-1][1])
{
if(!(ff[zj][0]>ff[n][0])==(ff[zj-1][0]>ff[n][0]))
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -