嵌入式系统课程设计报告
题目:连连看在uCOS II系统ARM平台的简单实现
自动化 2010级
xxxxx xxxxx
2012.12.10
一.设计思路
连连看游戏可以消灭一切成双成对的东东,为大家喜爱,老少皆宜;在实验平台上做连连看的实现,需结合触摸屏识别和LCD显示。设计的关键分两个部分,硬件的核心在于触摸屏和LCD显示的实现,软件的核心是寻找方法实现识别相同图标并决定是否予以消灭。
最初试图采用穷举的方法逐步寻路试图实现确认相同图标能否相连消灭之,但尽了很大努力仍未实现识别寻路功能,因此一定程度上影响了整体进度和对硬件的熟悉;后来,突然想到连连看可以相消的两个图标之间是通过矩形相联系的。于是程序的思路忽然明确起来,建立一个矩形寻路的函数,结合穷举的办法,在实现了自行寻路确认相消。
矩形是最终解救这个设计的钥匙。幸运的是找到了这把钥匙,这点上体会了思维的偶然性。本来打算按输入矩阵定制连连看解法,但是有了矩形这个钥匙后换输入矩阵程序无需更改函数主题,仅需改变a[6][8]和相应的b[6][8]。
程序写到这里是极大地鼓舞,现场调试希望是又一个鼓舞。(结果很不乐观)
解释一下矩形的思路,连连看游戏中可以消去(连线转弯次数不超过两次)的两图标连接,除了两图标挨着或直线相连的情况,其他情况都可以看做是通过A图标或A图标的在上下左右任一方向无阻碍的情况下延伸出去的中间点与B图标发生矩形相邻两边的联系。
二.设计效果(见最后,实际记录最后一次实验台调试结果)
最后的设计效果达成很不乐观,软件上面再认真的思路也不如软硬件结合的联合调试有效,这是实实在在的体会了。
最终只实现连连看图形的显示,其他的种种还只是存在于软件里的代码而已,这让人无比遗憾。
在触摸板没法工作起来的情况下当时可以设置延时程序,给定消去办法显示连连看图标的消去,只是后话。
三.设计收获
从学完C++后也没有再编过程序,这次设计编的程序给了复习C++的机会,结合这学期课程微机原理,在嵌入式设计中,深入体会了码农的欢乐与焦虑。
在找不到合适方法实现程序时,体会到深入学习数据结构等知识以及实践运用的必要性,所以决定寒假继续学习编程及嵌入式的知识。
另外,估计设计结果调试成功后的中午,从淘宝上买的arm Cortex-M3上搭的学习板也差不多收到了,据说Cortex-M3上也可以搭Ucos系统,到时候可以继续学习。弥补嵌入式实验中硬件结合偏少的遗憾(因为最初分配的实验台在第二节实验课末尾开始就不工作了,有两次实验没能找到合适实验台,另外软件设计工作延后也是没法硬件调试的后腿)。
结果调试成功的失败了,学习板打开,Jlink一直连不上stm32,(终于知道这是ST意法半导体公司的Cotex-M3)百度论坛满世界最后找到方法,输入指令usb,识别成功,大半天已经过去,发现被我们无数次抱怨的“神奇”实验台原来要想从无到有的搭建起来必然是个大的工程。看着学习板上一个个的模块,失望的发现,数电模电加上微机哦加上嵌入式还是被彻底的打败了,正是那句话纸上得来终觉浅,绝知此事要躬行。经过网上的一番搜索,发现做stm的人很多,挺热的,有大量的QQ群,淘宝店,代码等等,不过在买来的开发板带的资料里面不知道谁说了一句,不同于51,stm尚没有成熟的教材,通过技术手册的自己探究更加有用。这个冬天伴着屋外的风雪,开始对实验板慢慢熟悉。大约在冬季,我写完了这个收尾性的设计报告。
四.设计代码
/***************
* try my best *
***************/
#include "INCLUDES.H" /*包含与uC/OS-II相关的系统调用的头文件 */
#include "mx1_aitc.h" /* 包含与中断控制器相关的头文件 */
#include "IRQ.h" /* 包含与中断管理相关的头文件 */
#include "mx1_gpio.h"
#include "misc.h"
#include "mx1_lcdc.h"
#include "mx1_asp.h" /*包含与触摸屏控制相关的头文件*/
#include "mx1_uart.h" /*包含与串口通信的头文件*/
#include "string.h"
#include "stdio.h"
static int a[][8]={{0},{0,0,1,1,1,1},{0,0,1,1,1,1},{0,0,1,1,1,1},
{0,0,1,1,1,1},{0}};
//有无图标状态矩阵,0为无图标,1为有图标,2为选中
static int b[][8]={{0},{0,0,2,3,2,4},{0,0,1,4,3,3},{0,0,1,2,4,1},
{0,0,4,1,3,2},{0}};
//图标形状颜色状态矩阵,0为无。
static int c[6][8]={0};
/*函数名称:getin;
函数功能:将捕捉到的触摸点在哪个格子进行量化处理。LCD屏幕显示的矩形{(30,30)(300,210)}横向9等分,纵向6等分,
等效为一个9*6二维数组。根据捕获输入触点落入屏幕所在格子将其转化为9*6的数点,其中新建了一点数点型变量pattern(图案),用作中间传值变量,保存处理结果*/
void getin(D_POINT pixelPoint, D_POINT *pattern )
{
int x=0,y=0;//将捕获到的输入进行标准量化处理
if(pixelPoint.x>300)x=0;
if(pixelPoint.x>270 && pixelPoint.x<300)x=9;
if(pixelPoint.x>240 && pixelPoint.x<270)x=8;
if(pixelPoint.x>210 && pixelPoint.x<240)x=7;
if(pixelPoint.x>180 && pixelPoint.x<210)x=6;
if(pixelPoint.x>150 && pixelPoint.x<180)x=5;
if(pixelPoint.x>120 && pixelPoint.x<150)x=4;
if(pixelPoint.x>90 && pixelPoint.x<120)x=3;
if(pixelPoint.x>60 && pixelPoint.x<90)x=2;
if(pixelPoint.x>30 && pixelPoint.x<60)x=1;
if(pixelPoint.x<30)x=0;
if(pixelPoint.y>210)y=0;
if(pixelPoint.y>180)y=6;
if(pixelPoint.y>150 && pixelPoint.y<180)y=5;
if(pixelPoint.y>120 && pixelPoint.y<150)y=4;
if(pixelPoint.y>90 && pixelPoint.y<120)y=3;
if(pixelPoint.y>60 && pixelPoint.y<90)y=2;
if(pixelPoint.y>30 && pixelPoint.y<60)y=1;
if(pixelPoint.y<30)y=0;
/*量化完成后将量化处理结果保存至pattern中,当捕获输入点数不在范围内时,统一量化为点(0.0)*/
if(x!=0&&y!=0){pattern->x=y;pattern->y=x;}
else{pattern->x=0;pattern->y=0;}
}
/*函数名称:styletest
函数功能:判断两点关系类型
入口参数:两点坐标(x1,y1)(x2,y2)
出口参数:两点关系(0:不同x也不同y.1:同x挨着,2:同y挨着,3:同x不挨着,4:同y不挨着)*/
int styletest(int x1,int x2,int y1,int y2)
{
if(x1-x2==0)
{if(y1-y2==1||y1-y2==-1)return 1;
return 3;}
if(y1-y2==0)
{if(x1-x2==1||x1-x2==-1)return 2;
return 4;}
return 0;
}
/*函数名称:findRect
函数功能:判断两点能否通过两点确定的矩形的两条相邻边连接
入口参数:两点坐标(x1,y1)(x2,y2)
出口参数:两点关系(0连不上1能通过矩形靠右和靠上的两边相连2能通过矩形靠左和靠下的两边相连3能通过矩形靠左和靠上的两边相连,4能通过矩形靠右和靠下的两边相连)*/
int findRect(int x1,int y1,int x2,int y2)
{
if(x1>x2&&y1>y2)
{int i=x2,j=y2,m=x1,n=y1;
for(;j<n;){j++;if(a[i][j]==1)break;}
if(j==n){for(;i<m;i++)if(a[i][j]==1)break;}if(j==n&&i==m)return 1;
//1能通过矩形靠右和靠上的两边相连
i=x2;j=y2;m=x1;n=y1;
for(;i<m;){i++;if(a[i][j]==1)break;}
if(i==m){for(;j<n;j++)if(a[i][j]==1)break;}if(j==n&&i==m)return 2;
// 2能通过矩形靠左和靠下的两边相连 return 0; //0:fail in rect连不上
}
if(x1<x2&&y1<y2)
{
int i=x1,j=y1,m=x2,n=y2;
for(;j<n;){j++;if(a[i][j]==1)break;}
if(j==n){for(;i<m;i++)if(a[i][j]==1)break;}if(j==n&&i==m)return 1;
//1能通过矩形靠右和靠上的两边相连
i=x1;j=y1;m=x2;n=y2;
for(;i<m;){i++;if(a[i][j]==1)break;}
if(i==m){for(;j<n;i++)if(a[i][j]==1)break;}if(j==n&&i==m)return 2;
//2能通过矩形靠左和靠下的两边相连
return 0; //0:fail in rect连不上
}
if(x1<x2&&y1>y2)
{
int i=x2,j=y2,m=x1,n=y1;
for(;i>m;){i--;if(a[i][j]==1)break;}
if(i==m){for(;j<n;j++)if(a[i][j]==1)break;}if(i==m&&j==n)return 3;
//3能通过矩形靠左和靠上的两边相连
i=x1;j=y1;m=x2;n=y2;
for(;j<n;){j++;if(a[i][j]==1)break;}
if(j==n){for(;i>m;i--)if(a[i][j]==1)break;}if(i==m&&j==n)return 4;
// 4能通过矩形靠右和靠下的两边相连)
return 0; //0:fail in rect连不上
}
if(x1>x2&&y1<y2)
{
int i=x1,j=y1,m=x2,n=y2;
for(;i>m;){i--;if(a[i][j]==1)break;}
if(i==m){for(;j<n;j++)if(a[i][j]==1)break;}if(i==m&&j==n)return 3;
//3能通过矩形靠左和靠上的两边相连
i=x1;j=y1;m=x2;n=y2;
for(;j<n;j++)if(a[i][j]==1)break;
if(j==n){for(;i>m;i--)if(a[i][j]==1)break;}if(i==m&&j==n)return 4;
// 4能通过矩形靠右和靠下的两边相连)
return 0; //0:fail in rect连不上
}
}
/*函数名称:lianlian
函数功能:连线并消灭一对相同的图标;
首先显示连线矩阵c,然后显示消去后图标矩阵*/
void lianlian()
{
int i=0,j=0;
for(;i<7;i++)
{
for(;j<8;j++){
if(c[i][j]==1)MX1_LCDC_DrawLine(30,60,270,60,15,LS_SOLID);
MX1_LCDC_DrawLine(30*j+30,30*i+45,30*j+60,30*i+45,27,LS_SOLID);
if(c[i][j]==2)
MX1_LCDC_DrawLine(30*j+45,30*i+30,30*j+45,30*i+60,27,LS_SOLID);
if(c[i][j]==3)
{MX1_LCDC_DrawLine(30*j+45,30*i+45,30*j+45,30*i+60,27,LS_SOLID);
MX1_LCDC_DrawLine(30*j+45,30*i+45,30*j+60,30*i+45,27,LS_SOLID);}
if(c[i][j]==4)
{MX1_LCDC_DrawLine(30*j+45,30*i+45,30*j+45,30*i+60,27,LS_SOLID);
MX1_LCDC_DrawLine(30*j+45,30*i+45,30*j+30,30*i+45,27,LS_SOLID);}
if(b[i][j]==5)
{MX1_LCDC_DrawLine(30*j+45,30*i+45,30*j+45,30*i+30,27,LS_SOLID);
MX1_LCDC_DrawLine(30*j+45,30*i+45,30*j+30,30*i+45,27,LS_SOLID);}
if(b[i][j]==6)
{MX1_LCDC_DrawLine(30*j+45,30*i+45,30*j+45,30*i+30,27,LS_SOLID);
MX1_LCDC_DrawLine(30*j+45,30*i+45,30*j+60,30*i+45,27,LS_SOLID);}
c[i][j]=0;}
} //连线完成开始消去
MX1_LCDC_DrawRect(0,0,319,239,15,27,LS_SOLID,FS_SOLID); //重画框架
MX1_LCDC_DrawRect(10,10,310,230,15,50,LS_SOLID,FS_SOLID);
MX1_LCDC_DrawRect(30,30,300,210,15,50,LS_SOLID,FS_SOLID);
MX1_LCDC_DrawLine(30,60,300,60,15,LS_SOLID);
MX1_LCDC_DrawLine(30,90,300,90,15,LS_SOLID);
MX1_LCDC_DrawLine(30,120,300,120,15,LS_SOLID);
MX1_LCDC_DrawLine(30,150,300,150,15,LS_SOLID);
MX1_LCDC_DrawLine(30,180,300,180,15,LS_SOLID);;
MX1_LCDC_DrawLine(60,30,60,210,15,LS_SOLID);
MX1_LCDC_DrawLine(90,30,90,210,15,LS_SOLID);
MX1_LCDC_DrawLine(120,30,120,210,15,LS_SOLID);
MX1_LCDC_DrawLine(150,30,150,210,15,LS_SOLID);
MX1_LCDC_DrawLine(180,30,180,210,15,LS_SOLID);
MX1_LCDC_DrawLine(210,30,210,210,15,LS_SOLID);
MX1_LCDC_DrawLine(240,30,240,210,15,LS_SOLID);
MX1_LCDC_DrawLine(270,30,270,210,15,LS_SOLID);
for(i=0;i<7;i++) //重显示图标
{
for(j=0;j<8;j++)
{
if(b[i][j]==0)
MX1_LCDC_DrawRect(30*j+32,30*i+32,30*j+58,30*i+58,50,50,LS_SOLID,FS_SOLID);
if(b[i][j]==1)
MX1_LCDC_DrawRect(30*j+35,30*i+35,30*j+55,30*i+55,8,27,LS_SOLID,FS_SOLID);
if(b[i][j]==2)
MX1_LCDC_DrawCircle(30*j+45, 30*i+45,13,15,07,LS_SOLID,FS_SOLID);
if(b[i][j]==3)
MX1_LCDC_DrawRect(30*j+35,30*i+35,30*j+55,30*i+55,30,10,LS_SOLID,FS_SOLID);
if(b[i][j]==4)
MX1_LCDC_DrawCircle(30*j+45,30*i+45,13,30,47,LS_SOLID,FS_SOLID);
}
}
}
/*函数名称:lianzhu
函数功能:在验证矩形两边可以连接两点后,把两点通过矩形的两边相连(改变显示连线参数矩阵c),为lianlian函数显示连线做准备;
入口参数:两点坐标(x1,y1)(x2,y2);
*/
void lianzhu(int x1,int y1,int x2,int y2)
{
if(findRect(x1,y1,x2,y2)==1)
{
int tx=x1,tmx=x2,ty=y1,tmy=y2;
if(x1>x2){tx=x2;tmx=x1;ty=y2;tmy=y1;}
c[tx][tmy]=4;ty++;
for(;ty<tmy;ty++)c[tx][ty]=1;
tx++;
for(;tx<tmx;tx++)c[tx][ty]=2;
a[x1][y1]=0;a[x2][y2]=0;b[x1][y1]=0;b[x2][y2]=0;
lianlian();
}
if(findRect(x1,y1,x2,y2)==2)
{
int tx=x1,tmx=x2,ty=y1,tmy=y2;
if(x1>x2){tx=x2;tmx=x1;ty=y2;tmy=y1;}
c[tmx][ty]=6;tx++;
for(;tx<tmx;tx++)c[tx][ty]=2;
ty++;
for(;ty<tmy;ty++)c[tx][ty]=1;
a[x1][y1]=0;a[x2][y2]=0;b[x1][y1]=0;b[x2][y2]=0;
lianlian();
}
if(findRect(x1,y1,x2,y2)==3)
{
int tx=x1,tmx=x2,ty=y1,tmy=y2;
if(x1<x2){tx=x2;tmx=x1;ty=y2;tmy=y1;}
c[tmx][ty]=3;tx--;
for(;tx>tmx;tx--)c[tx][ty]=2;
ty++;
for(;ty<tmy;ty++)c[tx][ty]=1;
a[x1][y1]=0;a[x2][y2]=0;b[x1][y1]=0;b[x2][y2]=0;
lianlian();
}
if(findRect(x1,y1,x2,y2)==4)
{
int tx=x1,tmx=x2,ty=y1,tmy=y2;
if(x1<x2){tx=x2;tmx=x1;ty=y2;tmy=y1;}
c[tx][tmy]=5;ty++;
for(;ty<tmy;ty++)c[tx][ty]=1;
tx--;
for(;tx>tmx;tx--)c[tx][ty]=2;
a[x1][y1]=0;a[x2][y2]=0;b[x1][y1]=0;b[x2][y2]=0;
lianlian();
}
}
/* 用于时钟中断 */
extern void OSStartTimeTick( void );
extern void OSTickISR( void );
#define STK_SIZE_TASK 256 /* 分配给任务的堆栈大小 */
#define PRIO_TASK 3 /* 任务的优先级 */
OS_STK StkTask[STK_SIZE_TASK]; /* 为任务分配堆栈空间 */
/* 此函数定义了一个任务 */
void YourTask( void *pdata )
{
int i,j,x1,y1,x2,y2,x,y,num=16,k,sh,xi,zu,yo,you;
D_POINT pixelPoint,pattern ;
IRQ_Register( OSTickISR, TIMER1_INT ); /* 开启uC/OS-II的时钟中断(必须
在第一个运行的任务里进行) */
OSStartTimeTick();
/* 在下面添加任务内容 */
while( 1 ){
MX1_LCDC_DrawRect(0,0,319,239,15,27,LS_SOLID,FS_SOLID); //画框架
MX1_LCDC_DrawRect(10,10,310,230,15,50,LS_SOLID,FS_SOLID);
MX1_LCDC_DrawRect(30,30,300,210,15,50,LS_SOLID,FS_SOLID);
MX1_LCDC_DrawLine(30,60,300,60,15,LS_SOLID);
MX1_LCDC_DrawLine(30,90,300,90,15,LS_SOLID);
MX1_LCDC_DrawLine(30,120,300,120,15,LS_SOLID);
MX1_LCDC_DrawLine(30,150,300,150,15,LS_SOLID);
MX1_LCDC_DrawLine(30,180,300,180,15,LS_SOLID);
MX1_LCDC_DrawLine(60,30,60,210,15,LS_SOLID);
MX1_LCDC_DrawLine(90,30,90,210,15,LS_SOLID);
MX1_LCDC_DrawLine(120,30,120,210,15,LS_SOLID);
MX1_LCDC_DrawLine(150,30,150,210,15,LS_SOLID);
MX1_LCDC_DrawLine(180,30,180,210,15,LS_SOLID);
MX1_LCDC_DrawLine(210,30,210,210,15,LS_SOLID);
MX1_LCDC_DrawLine(240,30,240,210,15,LS_SOLID);
MX1_LCDC_DrawLine(270,30,270,210,15,LS_SOLID);
for(i=0;i<6;i++)
for(j=0;j<8;j++)
{if(b[i][j]==1)
MX1_LCDC_DrawRect(30*j+35,30*i+35,30*j+55,30*i+55,8,27,LS_SOLID,FS_SOLID);
if(b[i][j]==2)
MX1_LCDC_DrawCircle(30*j+45, 30*i+45,13,15,07,LS_SOLID,FS_SOLID);
if(b[i][j]==3)
MX1_LCDC_DrawRect(30*j+35,30*i+35,30*j+55,30*i+55,30,10,LS_SOLID,FS_SOLID);
if(b[i][j]==4)
MX1_LCDC_DrawCircle(30*j+45,30*i+45,13,30,47,LS_SOLID,FS_SOLID);
}
CBA : while(num!=0) //当全部消去后重新开始下一局
{
while(k<2)//选定两个东东
{
k=0;
TP_GetPixelInput( &pixelPoint, 50000 );
while(pattern.x==0||pattern.y==0)
{
getin(pixelPoint,&pattern);
}
i=pattern.x-1;
j=pattern.y-1;
if(a[i][j]==2) //判断是已选定该东东
{
a[i][j]=1; //取消该东东选定,取消蓝色虚线框,恢复白色底面
MX1_LCDC_DrawRect(30*j+31,30*i+31,30+59,y1+59,15,50,LS_SOLID,FS_TRANS); // FS_TRANS指只画矩形框LS_SOLID,指虚线
k--;
}
else if(a[i][j]==1&&b[i][j]==b[x1][y1])
{
a[i][j]==2; //选定一个东东,用蓝色虚线框标注
k++;
if(k==1){x1=i;y1=j;}
if(k==2){x2=i;y2=j;}
x=30*j+31;
y=30*i+31;
MX1_LCDC_DrawRect( x,y,x+28,y+28, 8, 15, LS_DOTDOT, FS_TRANS );
} // LS_DOTDOT,指虚线,蓝色虚线框;
else if(b[i][j]!=b[x1][y1])
{
a[i][j]=1; //取消东东选定,取消蓝色虚线框,恢复白色底面
MX1_LCDC_DrawRect( x,y,x+28,y+28, 15,50, LS_SOLID, FS_TRANS );
k--;
}
} //选中两个图标的循环范围
a[x1][y1]=2;
a[x2][y2]=2; //表示选中两个图标
if(styletest(x1,x2,y1,y2)==1||styletest(x1,x2,y1,y2)==2)
{a[x1][y1]=0;a[x2][y2]=0;b[x1][y1]=0;b[x2][y2]=0;lianlian();
num=num-2; goto CBA;
} //最简单的两种情况,横向和竖向相连的情况
if(styletest(x1,x2,y1,y2)==3)
{
int t=y1,tm=y2;
if(y1>y2){t=y2;tm=y1;}
for(;t<tm;t++)
if(a[x1][t]==1)break;
if(t==tm)
{
t=y1+1;if(y1>y2)t=y2+1;
for(;t<tm;t++)c[x1][t]=1;
a[x1][y1]=0;a[x2][y2]=0;b[x1][y1]=0;b[x2][y2]=0;
lianlian(); goto CBA; //在一条线上能通过直线相连
}
goto ABC; //在一条线上却不能能通过直线相连,试通过矩形相连
}
if(styletest(x1,x2,y1,y2)==4)
{
int t=x1,tm=x2;
if(x1>x2){t=x2;tm=x1;}
for(;t<tm;t++)
if(a[t][y1]==1)break;
if(t==tm)
{
t=x1+1;if(x1>x2)t=x2+1;
for(;t<tm;t++)c[t][y1]=2;
a[x1][y1]=0;a[x2][y2]=0;b[x1][y1]=0;b[x2][y2]=0;
lianlian(); goto CBA; //在一条线上能通过直线相连
}
goto ABC; //在一条线上却不能能通过直线相连,试通过矩形相连
}
if(findRect(x1,y1,x2,y2)!=0) //能用矩形两边相连的情况四种
{lianzhu(x1,y1,x2,y2); goto CBA;}
ABC://最普通的情况,通A图标的上下左右的衍生点加矩形两边连上B图标
for(sh=x1;sh>=0;){sh--;if(a[sh][y1]==0)if(findRect(sh,y1,x2,y2)!=0){you++;break;}}
if(you==1) //通过向上寻找一点搭起矩形两边的连接成功
{
int t=x1-1;
for(;t>sh;t--)c[t][y1]=2;
if(findRect(sh,y1,x2,y2)==2||findRect(sh,y1,x2,y2)==3)c[sh][y1]=4;
if(findRect(sh,y1,x2,y2)==1||findRect(sh,y1,x2,y2)==4)c[sh][y1]=3;
lianzhu(sh,y1,x2,y2);you=0; goto CBA;
}
for(xi=x1;xi<8;){xi++;if(a[xi][y1]==0)if(findRect(xi,y1,x2,y2)!=0){you++;break;}}
if(you==1) //通过向下寻找一点搭起矩形两边的连接成功
{
int t=xi-1;
for(;t>x1;t--)c[t][y1]=2;
if(findRect(xi,y1,x2,y2)==2||findRect(xi,y1,x2,y2)==3)c[sh][y1]=5;
if(findRect(xi,y1,x2,y2)==1||findRect(xi,y1,x2,y2)==4)c[sh][y1]=6;
lianzhu(xi,y1,x2,y2); you=0; goto CBA;
}
for(zu=y1;zu>=0;){zu--;if(a[x1][zu]==0)if(findRect(x1,zu,x2,y2)!=0){you++;break;}}
if(you==1) //通过向左寻找一点搭起矩形两边的连接成功
{
int t=y1-1;
for(;t>zu;t--)c[x1][t]=1;
if(findRect(x1,zu,x2,y2)==2||findRect(x1,zu,x2,y2)==3)c[sh][y1]=4;
if(findRect(x1,zu,x2,y2)==1||findRect(x1,zu,x2,y2)==4)c[sh][y1]=3;
lianzhu(x1,zu,x2,y2); you=0; goto CBA;
}
for(yo=y1;yo<9;){yo--;if(a[x1][yo]==0)if(findRect(x1,yo,x2,y2)!=0){you++;break;}}
if(you==1) //通过向右寻找一点搭起矩形两边的连接成功
{
int t=yo-1;
for(;t>y1;t--)c[x1][t]=1;
if(findRect(x1,yo,x2,y2)==2||findRect(x1,yo,x2,y2)==3)c[sh][y1]=4;
if(findRect(x1,yo,x2,y2)==1||findRect(x1,yo,x2,y2)==4)c[sh][y1]=3;
lianzhu(x1,yo,x2,y2); you=0; goto CBA;
}
a[x1][y1]=1; a[x2][y2]=1; //取消东东选定,取消蓝色虚线框,恢复白色底面
MX1_LCDC_DrawRect( 30*y1+31,30*x1+31,30*y1+59,30*x1+59, 15,50, LS_SOLID, FS_TRANS );
MX1_LCDC_DrawRect( 30*y2+31,30*x2+31,30*y2+59,30*x2+59, 15,50, LS_SOLID, FS_TRANS );
} //while(num!=0)范围
} //while(1)范围
} //任务YourTask的范围
/* 初始化后,从这里开始执行C代码 */
int __main( void )
{
unsigned int palette[LCDC_CMRAM_SIZE];
int i;
MX1_AITC_Init(); /* 初始化中断控制器 */
IRQ_Init(); /* 初始化中断管理 */
OSInit(); /* 初始化uC/OS-II内核数据结构 */
//初始化LCD
MX1_LCDC_Init(LCDC_PANEL_WIDTH, LCDC_PANEL_HEIGHT,
LCDC_INIT_STARTX, LCDC_INIT_STARTY, LCDC_VPW, LCDC_PANEL_CONF, LCDC_BPP );
// 初始化调色板
for( i=0; i<16; i++ ){
palette[i] = RGB( i, 0, 0 );
palette[i+16] = RGB( 0, i, 0 );
palette[i+32] = RGB( 0, 0, i );
palette[i+48] = RGB( 0xf, 0xf, 0xf );
}
MX1_LCDC_CMRAM_Set( palette );
/* 建立一个任务 */
OSTaskCreate( YourTask, 0, &StkTask[STK_SIZE_TASK-1], PRIO_TASK );
OSStart(); /* 开始调度 */
return 0;
}
代码结束,灰机灰过去了