📄 snake.lst
字号:
C51 COMPILER V7.20 SNAKE 12/23/2007 22:27:19 PAGE 1
C51 COMPILER V7.20, COMPILATION OF MODULE SNAKE
OBJECT MODULE PLACED IN snake.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE snake.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <REG52.H>
2 sbit sound=P2^7; //这个是接峰鸣器
3 sbit rs = P2^0; //H=data; L=command;
4 sbit rw = P2^1; //H=read; L=write;
5 sbit e = P2^2; //input enable;
6 sbit busy=P0^7; //lcd busy bit
7 /*---------这里是液晶的一些命令定的控制字-----------8*/
8 #define com_expand_command 0x40
9 #define base_command 0x34
10 #define oppsite_cursor_dec 0x10
11 #define open_display_oppsite 0x0D
12 #define clear_screen 0x01
13
14 /*------下面的这些反白指令没有什么用处!--------*/
15 #define oppsite_first_line 0x04
16 #define oppsite_second_line 0x05
17 #define oppsite_third_line 0x06
18 #define oppsite_forth_line 0x07
19 /*------上面的这些反白指令没有什么用处!--------*/
20 /*-------------这里是定义那个绘图时设置地址时用的------*/
21 #define X1_ADDRESS 0x80
22 #define X2_ADDRESS 0x88
23 #define Y_ADDRESS 0x80
24 /*******-----这里用来向LCD定入数据时区分命令和数据的-----*/
25 #define comm 0 //命令
26 #define dat 1 //数据!
27
28 #define uint unsigned int
29 #define uchar unsigned char
30 #define uchar unsigned char
31 /*-----键盘扫描码定义------------------*/
32 #define DOWN_DOWN 0xe0 //第一键
33 #define UP_DOWN 0xd0 //第二键
34 #define RIGHT_DOWN 0xb0 //
35 #define LEFT_DOWN 0x70 //
36 /*------------屏上区域定义区---------------*/
37 #define RIGHT_MAX 31
38 #define DOWN_MAX 15
39 #define UP_MAX 0
40 #define LEFT_MAX 0
41 /*------------定义游戏状态--------------*/
42 #define GAME_OVER 0 //游戏结束了
43 #define GAME_RUNING 1 //游戏进行中
44 #define WAIT_FOR_USER_INPUT 3 //等待用户输入
45 #define GAME_WELCOME_SCREEN 4 //
46 #define SHOW_YOUR_RECORD 5//这个状态就是当游戏结束以后显示你的成绩
47
48
49 /*--------------方向定义----------------*/
50 #define RIGHT 0
51 #define LEFT 1
52 #define DOWN 2
53 #define UP 3
54
55 /*--------------定义屏幕序列号------------------*/
C51 COMPILER V7.20 SNAKE 12/23/2007 22:27:19 PAGE 2
56 #define WELCOME_SCREEN 0 //第一个欢迎屏
57 #define WAITE_IN_PUT 1 //这是等待玩家选关的
58 #define YOUR_RECORD 2 //这个屏是当玩家OVER后显示他分数
59 #define CONGRATULATE 3 //这个是当玩家玩完一关后进入下一关时显示的
60
61
62 /*---------------------------*/
63 #define SNAKE_LONG 16 //定义蛇长
64 #define DEFAULT_SPEED 5//定义蛇的默认速度
65 #define X_POT 0
66 #define Y_POT 1 //蛇身是一个2维数组0是放X1放Y
67 #define MAX_RECORD 15//这个是定义当多少分时就进入下一关
68 /*---------定义一种结构体---------*/
69 struct postion
70 {
71 uchar x;
72 uchar y ;
73 };//这个结构体是用来表示一些点的数据
74
75 //*-----这个结构休是用来保存一些蛇改变方向时的数据它是有蛇前进时要用来删除尾巴时要用到-----*/
76 //这三点分别是头,尾,和食物
77 struct Snake
78 {
79 uchar Snake_body[SNAKE_LONG][2]; //其0为头15为尾
80 uchar direction;
81 uchar Speed;///速度这是由用户设定的
82 uchar Game_Mode; //这个是游戏的状态如如进行中,结速了等
83 struct postion Temp_Pot_Or_Last_Trail;//这里蛇在前进时用暂存数据的移过后这个里面就是上次蛇尾所在的点
84 uchar soft_conter;//这个是软件计数器 用来计数T1的中断次数,到了一定数值时就让蛇前进一步
85 uchar Current_screen_num; //这个是用来保存当前所显示的屏
86 uchar Currrent_Position;//保存光标所在的位置
87 uchar Screen_data[2][4];//这个是更新屏上的数据时,重构数据所使用的缓存
88 struct postion Food_Postion;//这个是食物的位置
89 uchar Record;//游戏得分数
90 } ;
91 uchar code NO_Data[10]={"0123456789"};//{"0","1","2","3","4","5","6","7","8","9"};
92 /*----------------这个地方是输出到屏上面的数据--------------*/
93 uchar code screen_data[][64]={
94 {" 综合程序 "
95 "开发:Crasyboye "
96 " 游戏--贪吃蛇 "
97 " 按任意键继续 "
98 },//第一屏
99 {
100 " "
101 " 第: 关"
102 " 请您选关 "
103 "增加/ 减少 确定"
104 },
105 ///////////////////////////
106 {"您的得分为: "
107 " 继续努力 "
108 " "
109 " 按任意键继续 "
110 },
111 {" "
112 "恭喜!您顺利过关"
113 " 马上进下一关 "
114 " 按任意键继续 "
115 }
116
117 };
C51 COMPILER V7.20 SNAKE 12/23/2007 22:27:19 PAGE 3
118
119
120
121 /*-----变量定义--------*/
122 struct Snake My_snake;
123
124 unsigned char KEY_WORD;
125 bit KEY_DOWN; //这个用来表示键位有按下了
126
127
128 /*----------函数声明-------------*/
129 void inicial_timer () ; /*--------初始化两个定时器----------*/
130 void voice_function() ; /*------发音子程序-------*/
131 /*---------确认某一点是否有有障碍物-----------*/
132 bit Sure_Postion_Have_pot(uchar row,uchar line); //row是行line是列
133 void Go_Ahead(); //这个函数用来使蛇向前前进一步
134 bit Sure_Pot_Empty(uchar x,uchar y); /*------------ 确认某一点是否是空点------------------*/
135 void One_Step();///这个函数里蛇走一步的
136 void wr_lcd (bit dat_comm,uchar content); /*-------------------写数据或指令到LCD-------------*/
137 void init_lcd (void); //初始化定时器
138 void chk_busy (void); /*---------------检测忙信号----------------*/
139 void Erasure(); //擦除屏幕函数 这是在绘图模式下
140 void delay_ms(unsigned int ms);////延时毫秒级的
141 void Erasure_Trail(); //擦尾
142 void Draw_Head();//画头
143 void Creat_Food();//产生一个食物并且检测食物是不是产生在蛇的身上如果是重新产生
144 void Re_Build_Food_Buffer(uchar x,uchar y);//这个是用来重构缓存数据
145 void Write_Food();//把食物画到屏上
146 void Inicial_Game();////p初始化游戏
147 void display_all_screen (uchar screen_num);//显示一整屏
148 void Show_Your_Record();//显示你的成绩
149
150 /*------键盘扫描也是中T0中断函数--------*/
151 void inter_timer0() interrupt 1
152 {
153 1 unsigned char b;
154 1 TR0=0;
155 1 P1=0xff;
156 1 b=P1;
157 1 b=b&0xf0;
158 1 if(b!=0xf0)
159 1 {
160 2 KEY_DOWN=1;
161 2 KEY_WORD=b;
162 2 voice_function();
163 2 }
164 1
165 1 while(b!=0xf0) //这个地方是用来消抖的
166 1 {
167 2 b=P1;
168 2 b=b&0xf0;
169 2 }
170 1 TR0=1;
171 1
172 1 }
173 /*--------初始化定时器----------*/
174 void inicial_timer ()
175 {
176 1 TMOD=0x11;
177 1 EA=1;
178 1 TR0=1;
179 1 TR1=1;
C51 COMPILER V7.20 SNAKE 12/23/2007 22:27:19 PAGE 4
180 1 ET0=1;
181 1 ET1=1;
182 1 }
183 /*=----------这是定时器1的中断用来做为游戏的系系时钟------*/
184 void inter_timer1() interrupt 3
185 {
186 1 TR1=0;
187 1 TR0=0;
188 1 if(My_snake.soft_conter>=9-My_snake.Speed)
189 1 {
190 2 My_snake.soft_conter=0;
191 2 if(My_snake.Game_Mode==GAME_RUNING)
192 2 {
193 3
194 3 One_Step();
195 3 Erasure_Trail();
196 3 Draw_Head();
197 3 // Write_Food();
198 3 if(My_snake.Snake_body[0][Y_POT]==My_snake.Food_Postion.y&&My_snake.Snake_body[0][X_POT]==My_snake.F
-ood_Postion.x)
199 3 {
200 4 Creat_Food();//产生一个食物并且检测食物是不是产生在蛇的身上如果是重新产生
201 4 Write_Food();
202 4 My_snake.Record++;
203 4
204 4 }
205 3
206 3 }
207 2 else My_snake.soft_conter++;
208 2
209 2 }
210 1 else My_snake.soft_conter++;
211 1
212 1 if(My_snake.Game_Mode==GAME_OVER)
213 1 {
214 2 Show_Your_Record();
215 2 }
216 1 TR1=1;
217 1 TR0=1;
218 1 }
219 /*------发音子程序-------*/
220 void voice_function()
221 {
222 1 int c,e,d;
223 1 for(d=0;d<1;d++)
224 1 {
225 2
226 2 for (c=0;c<50;c++)
227 2 for(e=0;e<100;e++)
228 2 sound=0;
229 2 }
230 1 sound=1;
231 1 }
232 /*---------确认某一点是否有有障碍物-----------*/
233 bit Sure_Postion_Have_pot() //row是行line是列
234 {
235 1
236 1
237 1 return 1;
238 1
239 1 }
240 /**-------------------这个是用来让蛇向前面一步-------------------**/
C51 COMPILER V7.20 SNAKE 12/23/2007 22:27:19 PAGE 5
241 void Go_Ahead()
242 {
243 1 uchar i,temp_x,temp_y;
244 1 switch (My_snake.direction)
245 1 {
246 2 case RIGHT:
247 2 {
248 3 for(i=0;i<SNAKE_LONG;i++)
249 3 {
250 4 if(i==0)
251 4 {
252 5 My_snake.Temp_Pot_Or_Last_Trail.x=My_snake.Snake_body[0][X_POT];
253 5 My_snake.Temp_Pot_Or_Last_Trail.y=My_snake.Snake_body[0][Y_POT];
254 5 My_snake.Snake_body[0][X_POT]++;
255 5 } //如果是第一个点就X++
256 4 else
257 4 {
258 5 temp_x=My_snake.Snake_body[i][X_POT];
259 5 temp_y=My_snake.Snake_body[i][Y_POT];
260 5 My_snake.Snake_body[i][Y_POT]=My_snake.Temp_Pot_Or_Last_Trail.y;
261 5 My_snake.Snake_body[i][X_POT]=My_snake.Temp_Pot_Or_Last_Trail.x;
262 5 My_snake.Temp_Pot_Or_Last_Trail.x=temp_x;
263 5 My_snake.Temp_Pot_Or_Last_Trail.y=temp_y;
264 5 }
265 4
266 4
267 4 }
268 3 return;
269 3 }
270 2 /*----------------------------------------------------------------------------*/
271 2 case LEFT:
272 2 {
273 3 for(i=0;i<SNAKE_LONG;i++)
274 3 {
275 4 if(i==0)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -