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

📄 main.c

📁 一个用于LPC2119液晶,GUI测试及演示的程序
💻 C
📖 第 1 页 / 共 3 页
字号:
/****************************************************************************************
* 文件名:TEST.C
* 功能:GUI测试及演示程序。
* 作者:黄绍斌
* 日期:2003.09.09
****************************************************************************************/
#include "config.h"
#include "define.h"
#include <math.h>

#define   KEY_OK    3
#define   KEY_NEXT  2
#define   KEY_BACK  1
#define   CLK       28
#define   DATA      29
uint8  data[4];
uint8  bb[14]  = {0,0,0,0,0,0,0,0,0,0,0,0,0,0};
uint8  bobo[14]= {0,0,0,0,0,0,0,0,0,0,0,0,0,0};
uint8  keykey=0;
double qqq[60];
double www[60];
extern uint8  sec[60][2];
extern uint8  min[60][2];
extern uint8  hor[60][2];

uint8  DispButton49x14(void);

#define R  50
#define R0 47
#define R1 35
#define R2 23
#define LCM_LEDCON	 	0x00400000

struct Snake
{	
	uint32 x[N];
	uint32 y[N];
	uint32 node;
	uint32 direction;
	uint32 life;
}snake;

struct Food
{
	uint32 x;
	uint32 y;
	uint32 yes;
}food;

typedef struct
{
	uint32 Message;
	uint32 WParam;
	uint32 LParam;
}OSMSG,*POSMSG;	
	

uint32 GameSpeed = 10;
uint32 score	 = 0 ;

/****************************************************************************
* 名称:DelayNS()
* 功能:长软件延时
* 入口参数:dly		延时参数,值越大,延时越久
* 出口参数:无
****************************************************************************/
void  DelayNS(uint32  dly)
{  uint32  i;

   for(; dly>0; dly--) 
      for(i=0; i<5000; i++);
}

volatile uint8  keypress = 0;
/***********************************************************************
* 名称:IRQ_EINT3()
* 功能:外部中断3服务函数。置位keyin,使MoveCircle函数退出。
* 入口参数:无
* 出口参数:无
***********************************************************************/
void  __irq  IRQ_EINT3(void)
{  while( (EXTINT&0x08)!=0 )		// 等待外部中断信号恢复为高电平	
   {  EXTINT = 0x08;				// 清除EINT3中断标志
   }
   keypress = 1;
   keykey = 1;
   VICVectAddr = 0x00;              // 中断处理结束
}


/****************************************************************************
* 名称:WaitKey()
* 功能:等待一个有效按键,并返回按键值。本函数有去抖功能。
* 入口参数:无
* 出口参数:返回按键盘值。
****************************************************************************/
uint8  WaitKey(void)
{  uint32  i;
   uint8   key;
   uint8   key_bak;
   
   key = 0;							// 接收按键
   while(0==key)
   {  key = ZLG7290_GetKey();
      for(i=0; i<1000; i++);
   }
   
   key_bak = 1;
   while(0!=key_bak)				// 等待按键放开
   {  key_bak = ZLG7290_GetKey();
      for(i=0; i<1000; i++);
   }
    	
   return(key);
}




/****************************************************************************
* 名称:DispLog()
* 功能:显示LOG,用坚线填充屏幕(填充0xAA)。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void  DispLog(void)
{  GUI_FillSCR(0xAA);				// 填充0xAA
   DelayNS(30);
}


/****************************************************************************
* 名称:WaitAKey()
* 功能:等待任一个有效按键,并返回。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void  WaitAKey(void)
{  uint8  key;

   while(1)
   {  key = WaitKey();
      if(key==KEY_NEXT) return;
      if(key==KEY_BACK) return;
      if(key==KEY_OK) return;
   }
}

uint32 ADC_Data;
void Adc_init(void)
{
   PINSEL1 |= 0x01400000;						// 设置P0.27、P0.28连接到AIN0、AIN1
   
   /* 进行ADC模块设置,其中x<<n表示第n位设置为x(若x超过一位,则向高位顺延) */
   ADCR = (1 << 0)                     |		// SEL = 1 ,选择通道0
          ((Fpclk / 3000000 - 1) << 8) | 		// CLKDIV = Fpclk / 1000000 - 1 ,即转换时钟为1MHz
          (0 << 16)                    |		// BURST = 0 ,软件控制转换操作
          (0 << 17)                    | 		// CLKS = 0 ,使用11clock转换
          (1 << 21)                    | 		// PDN = 1 , 正常工作模式(非掉电转换模式)
          (0 << 22)                    | 		// TEST1:0 = 00 ,正常工作模式(非测试模式)
          (1 << 24)                    | 		// START = 1 ,直接启动ADC转换
          (0 << 27);							// EDGE = 0 (CAP/MAT引脚下降沿触发ADC转换)
   DelayNS(10);								
   ADC_Data = ADDR;								// 读取ADC结果,并清除DONE标志位
}

/****************************************************************************
* 名称:DrawBeanSnake()
* 功能:贪吃蛇专用,蛇和屏幕的位置坐标范围为(0,0)到(110/5=21,60/5=11)
*		画蛇和豆子
* 入口参数:x		蛇的x坐标值
*           y		蛇的y坐标值
* 出口参数:无
* 说明:操作失败原因是指定地址超出有效范围。
****************************************************************************/
void  DrawBeanSnake(uint32 x, uint32 y)
{  
	uint32 x0, y0, x1, y1;
    x0=x*6+1;	//偏移一个1为偏移的边框线,乘5是一个蛇节象素的大小
    y0=y*6+1;
    x1=x*6+6;
    y1=y*6+6;
	GUI_HLine(x0, y0, x1, 1);
    GUI_HLine(x0, y1, x1, 1);
    GUI_RLine(x0, y0, y1, 1);
    GUI_RLine(x1, y0, y1, 1);
}


/****************************************************************************
* 名称:ClearSnake()
* 功能:贪吃蛇专用 蛇和屏幕的位置坐标范围为(0,0)到(110/5-21/5=17,60/5-11/5=9)
*		清除蛇的尾部
* 入口参数:x		蛇的x坐标值
*           y		蛇的y坐标值
*
* 出口参数:无
* 说明:
****************************************************************************/
void  ClearSnake(uint32 x, uint32 y)
{  
    uint32 x0, y0, x1, y1;
    x0=x*6+1;	//偏移一个1为偏移的边框线,乘5是一个蛇节象素的大小
    y0=y*6+1;
    x1=x*6+6;
    y1=y*6+6;
    GUI_HLine(x0, y0, x1-1, 0);		//减1为防止把前面蛇的一个边框点给清掉
	GUI_HLine(x0, y1, x1-1, 0);
    GUI_RLine(x0, y0, y1,   0);
    GUI_RLine(x1, y0, y1, 	0);
}

/****************************************************************************
* 名称:GameOvere()
* 功能:游戏结束时清屏,并显示"游戏结束"
*		
* 入口参数:无
* 出口参数:无
* 说明:无
****************************************************************************/
void GameOver(void)
{
	GUI_FillSCR(0x00);
	GUI_PutHZ(85, 50,       	(uint8 *)you0, 16, 16);		//中间显示"游戏结束"
    GUI_PutHZ(85+16, 50,    	(uint8 *)xi0,  16, 16);
    GUI_PutHZ(85+16+16, 50, 	(uint8 *)jie0, 16, 16);
    GUI_PutHZ(85+16+16+16, 50,  (uint8 *)shu0, 16, 16);
	VICIntEnClr |= 0x020000;
}

/****************************************************************************
* 名称:PrintScore()
* 功能:在坐标(x,y)的屏幕上显示一个数
*		
* 入口参数:x		数的x坐标值
*           y		数的y坐标值
*			data	要显示的数
* 出口参数:无
* 说明:数的大小不能超过100
****************************************************************************/
void PrintScore(uint32 x, uint32 y, uint32 data)
{
	uint32 i,j,x0,y0;
	x0=x;
	y0=y;
	i=data/10;
	j=data%10;
	switch(i)
		{
		 //case 0:GUI_PutChar8_8(125-12, 54, '0');break;
		 case 0:GUI_PutChar8_8(x0, y0, '0');break;
		 case 1:GUI_PutChar8_8(x0, y0, '1');break;
		 case 2:GUI_PutChar8_8(x0, y0, '2');break;
		 case 3:GUI_PutChar8_8(x0, y0, '3');break;
		 case 4:GUI_PutChar8_8(x0, y0, '4');break;
		 case 5:GUI_PutChar8_8(x0, y0, '5');break;
		 case 6:GUI_PutChar8_8(x0, y0, '6');break;
		 case 7:GUI_PutChar8_8(x0, y0, '7');break;
		 case 8:GUI_PutChar8_8(x0, y0, '8');break;
		 case 9:GUI_PutChar8_8(x0, y0, '9');break;
		} 
	switch(j)
		{
		 //case 0:GUI_PutChar8_8(125-5, 54, '0');break;
		 case 0:GUI_PutChar8_8(x0+8, y0, '0');break;
		 case 1:GUI_PutChar8_8(x0+8, y0, '1');break;
		 case 2:GUI_PutChar8_8(x0+8, y0, '2');break;
		 case 3:GUI_PutChar8_8(x0+8, y0, '3');break;
		 case 4:GUI_PutChar8_8(x0+8, y0, '4');break;
		 case 5:GUI_PutChar8_8(x0+8, y0, '5');break;
		 case 6:GUI_PutChar8_8(x0+8, y0, '6');break;
		 case 7:GUI_PutChar8_8(x0+8, y0, '7');break;
		 case 8:GUI_PutChar8_8(x0+8, y0, '8');break;
		 case 9:GUI_PutChar8_8(x0+8, y0, '9');break;
		} 	
	
	
}

	
void GamePlay(void)
{	
	uint32 i;
	uint8 key = 0;
	snake.life=0;
	snake.direction=1;
	snake.x[0]=0;snake.y[0]=6;	//蛇头
	snake.x[1]=1;snake.y[1]=6;
	snake.node=2;				//节数
	food.x=7;					
	food.y=6;
	DrawBeanSnake(food.x,food.y);
	food.yes=1;
	score = 0;
	PrintScore(215,100,score);
	while(1)
	{
	if(food.yes==0)
		{
		food.x=food.x+3;
		food.y++;
		if(food.x>32)
			food.x=0;
		if(food.y>20)
			food.y=0;	
		DrawBeanSnake(food.x,food.y);
		food.yes=1;
		}
	if(food.yes==1)//避免豆子显示在蛇身上而使豆子被清掉
		{
		DrawBeanSnake(food.x,food.y);
		}
	for(i=snake.node-1;i>0;i--)
		{
		 snake.x[i]=snake.x[i-1];
		 snake.y[i]=snake.y[i-1];
		}
	switch(snake.direction)
		{
		 case 1:snake.x[0]+=1;break;
		 case 2:snake.x[0]-=1;break;
		 case 3:snake.y[0]-=1;break;
		 case 4:snake.y[0]+=1;break;
		}	
	for(i=3;i<snake.node;i++)		//从蛇的第四节开始判断是否撞到自己,因为蛇头为两节,第三节不可能拐过来
		{
		 if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0])	
			 {
			  GameOver();
			  snake.life=1;
			  break;
			 }
		}
	if(snake.x[0]>32||snake.y[0]>20)	//判断蛇是否撞到墙
		{
		 GameOver();
		 snake.life=1;
		}
	if(snake.life==1)	//如果蛇死就跳出循环,重新开始
	break;
	for(i=0;i<snake.node;i++)		//画蛇
		DrawBeanSnake(snake.x[i], snake.y[i]);
	//DelayNS(100);
		if(snake.x[0]==food.x&&snake.y[0]==food.y)	//吃到食物后
		{
		 food.yes=0;
		 snake.node++;
		 score+=1;
		 PrintScore(215,100,score);
		}		 
	ClearSnake(snake.x[snake.node-1], snake.y[snake.node-1]);	//清除蛇的最后一节
	for(i=0;i<300;i++)
	 { key = ZLG7290_GetKey();
	   while(key)
	   break;
	   }
	//key = ZLG7290_GetKey();
	//key = key;		
	if(key==ESC)
		break;
	else if(key==UP&&snake.direction!=4)	//判断是否往相反的方向移动
		 snake.direction=3;
		else if(key==RIGHT&&snake.direction!=2)	
			 snake.direction=1;
			else if(key==LEFT&&snake.direction!=1)	
				 snake.direction=2;
				else if(key==DOWN&&snake.direction!=3)	
					 snake.direction=4;
	}//END while
}
/****************************************************************************
* 名称:DemoLine()
* 功能:绘画直线演示。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void  DemoLine(void)
{  
   GUI_ClearSCR();
   GUI_Circle(X0, Y0, R, 1);
   GUI_Circle(X0, Y0, R+10, 1);
   GUI_PutChar  (7,61,'9');
   GUI_PutChar  (116,61,'3');
   GUI_PutString(58,6,"12");
   GUI_PutString(32,13,"11");
   GUI_PutString(11,35,"10");
   GUI_PutChar  (62,116,'6');
   GUI_PutChar  (13,87,'8');
   GUI_PutChar  (33,107,'7');
   GUI_PutChar  (89,109,'5');
   GUI_PutChar  (109,88,'4');
   VICIntEnable |= 0x2000;
   WaitAKey();						// 等待一有效按键
   VICIntEnClr  |= 0x2000;
   GUI_ClearSCR();
}


/****************************************************************************
* 名称:DemoCircle()
* 功能:绘画圆演示。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void  DemoCircle(void)
{  
   uint8 key=0, i=0, mm=10, t=0;
   uint32 value;
   GUI_ClearSCR();
	GUI_PutHZ(5, 5, (uint8 *)qing, 16, 16);		//中间显示"游戏结束"
    GUI_PutHZ(25,5, (uint8 *)shu,  16, 16);
    GUI_PutHZ(45,5, (uint8 *)ru,   16, 16);
    GUI_PutHZ(65,5, (uint8 *)pin,  16, 16);
	GUI_PutHZ(85,5, (uint8 *)lv,  16, 16);
	GUI_PutHZ(105,5, (uint8 *)maohao,  16, 16);
   //GUI_PutString(10,10,"please enter the pinlu!");
   while(1)
   {

⌨️ 快捷键说明

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