📄 main.c
字号:
/****************************************************************************************
* 文件名: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 + -