嵌入式系统设计报告

时间:2024.4.20

嵌入式系统课程设计报告

题目:连连看在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;

}

代码结束,灰机灰过去了

更多相关推荐:
20xx完整ARM嵌入式系统实验报告

郑州航空工业管理学院嵌入式系统实验报告修订版20第赵成张克新编著院姓专学系名业号电子通信工程系20xx年3月制实验一ARM体系结构与编程方法一实验目的了解ARM9S3C2410A嵌入式微处理器芯片的体系结构熟悉...

嵌入式系统实验报告

嵌入式系统设计实验报告班级学号姓名成绩指导教师1实验一11实验名称博创UP3000实验台基本结构及使用方法12实验目的1学习嵌入式系统开发流程2熟悉UPnet3000实验平台的核心硬件电路和外设3增加对各个外设...

嵌入式系统课程设计报告

嵌入式系统课程设计报告基于ARM的楼宇对讲系统设计摘要采用模块化设计方法设计出一款基于ARM微控制芯片和Linux操作系统的楼宇对讲系统,该对讲系统通过以太网与楼宇间的各室内机相连,实现了安装在楼道门口的终端机…

嵌入式系统设计课程报告_

嵌入式图像处理系统课程报告基于隔离开关水平垂直度测试姓名郑亚茹班级硕3019学号嵌入式图像识别处理一研究目的1从项目开发实施隔离开关水平垂直度测量控制角度研究嵌入式系统应用技术的一般流程尝试使用软件工程2图像处...

王招治-嵌入式系统设计报告

研究生课程设计报告直流电机程序设计课程名称嵌入式系统设计姓名王招治学号专业电子与通信工程任课教师李国刚开课时间20xx817课程设计提交时间20xx年9月10日直流电机程序设计一设计目的1熟悉ARM本身自带的P...

嵌入式系统设计实验报告

111实验项目名称基于ucOS的多任务系统一实验目的1掌握LPC2200forMagicARM2200专用工程模板的使用2能够在MagicARM2200S上运行基于COSII操作系统的程序3掌握基于COSII操...

嵌入式系统实验报告

实验报告20xx20xx学年第二学期课程名称ARM嵌入式系统原理与开发实验名称嵌入式Linux交叉开发环境建立与程序开发实验时间指导单位20xx年5月21日通信与信息工程学院指导教师余雪勇学生姓名学院系通信与信...

嵌入式系统设计论文

嵌入式系统设计论文专业电子信息工程信号处理班级姓名指导教师评分年月日摘要当今信息时代嵌入式系统的应用无处不在而ARM嵌入式系统应用市场份额约占75从嵌入式系统的基本概念入手分别从ARM的定义ARM微处理器ARM...

嵌入式系统设计课设报告

福州大学嵌入式系统设计课设报告书题目基于28027的虚拟系统姓名学号学院电气工程与自动化学院专业电气工程与自动化年级起讫日期指导教师目录1课程设计目的12课程设计题目和实现目标13设计方案14程序流程图15程序...

嵌入式系统课程设计报告样例

嵌入式系统应用课程设计报告专业班级11电气1班学生姓名朱帅指导教师设计时间20xx20xx第1学期工程技术学院1直流电机控制程序设计摘要STM32系列基于专为要求高性能低成本低功耗的嵌入式应用专门设计的ARMC...

嵌入式系统设计学习报告

SOPC系统设计简介孟伟荣20xx22250226在二十世纪九十年代末可编程逻辑器件PLD的复杂度已经能够在单个可编程器件内实现整个系统完整的单芯片系统SOC概念是指在一个芯片中实现用户定义的系统在一个SOC设...

嵌入式系统课程设计报告 (2)

嵌入式系统课程设计报告设计任务一十字路口交通灯控制一设计目的1了解基于ARM7核的LPC2106的管脚功能和特点掌握IO控制寄存器的设置方法2掌握ARM7应用系统编程开发方法能用C语言编写应用程序3熟练掌握AD...

嵌入式系统设计报告(52篇)