📄 formula.lst
字号:
217 1 temp=~((temp>>4)|0xF0);
218 1 if(temp==1)
219 1 key=key+0;
220 1 else if(temp==2)
221 1 key=key+4;
222 1 else if(temp==4)
223 1 key=key+8;
224 1 else if(temp==8)
225 1 key=key+12;
226 1 else
227 1 key=16;
228 1
229 1 key_buf = key; //键值入显示缓存
230 1 key_buf = key_buf & 0x0f;
231 1 }
232
233 /*************************************************************
234
235 判断键是否按下
236
237 *************************************************************/
238 void keydown(void)
239 {
240 1 P1=0xF0;
241 1 while(P1==0xf0);
C51 COMPILER V8.02 FORMULA 01/04/2007 09:53:28 PAGE 5
242 1 {
243 2 keyscan();
244 2 beep();
245 2 }
246 1 }
247
248 /**********************************************************
249
250 随机出题函数
251
252 **********************************************************/
253 void rubric()
254 {
255 1 uchar num1,num2,temp1;
256 1
257 1 TR1=0;
258 1 temp1=TL1; //取T1当前的计数值
259 1 temp1=~temp1; //取反得到对应的题号
260 1 num2=temp1/9; //就题目分成9组
261 1 num2++; //将组号0~8转换为被乘数1~9
262 1 testdata[3]=num2+0x30; //保存被乘数
263 1 num1=temp1%9;
264 1 num1++; //将组号0~8转换为乘数1~9。
265 1 testdata[2]=num1+0x30; //保存乘数
266 1
267 1 temp1=num2*num1; //计算乘积
268 1 testdata[1]=temp1/10+0x30; //乘积的高位
269 1 testdata[0]=temp1%10+0x30; //乘积的低位
270 1 TR1=1;
271 1 }
272
273 /**********************************************************
274
275 键入正确答案函数
276
277 **********************************************************/
278 void right()
279 {
280 1 if(testdata[1]==0x30)
281 1 {
282 2 testdata[1]=0x20;
283 2 }
284 1
285 1 lcd_pos(0x4b);
286 1 in_data[1]=testdata[1];
287 1 in_data[0]=testdata[0];
288 1 lcd_wdat(in_data[1]);
289 1 lcd_wdat(in_data[0]);
290 1 }
291
292 /**********************************************************
293
294 键入答案函数
295
296 **********************************************************/
297 void key_input()
298 {
299 1 if(testdata[1]==0x30) //先判断十位数是否为0
300 1 {
301 2 in_data[1]=0x30;
302 2 key_num=1;
303 2 }
C51 COMPILER V8.02 FORMULA 01/04/2007 09:53:28 PAGE 6
304 1 else
305 1 {
306 2 keydown();
307 2 if(key_buf==0x0c) //C 键显示正确答案
308 2 {
309 3 right();
310 3 key_num=0;
311 3 }
312 2 if(key_buf<10)
313 2 {
314 3 key_buf=key_buf+0x30; //转换为ASCII码
315 3 in_data[1]=key_buf; //输入乘积高位
316 3 lcd_pos(0x4b);
317 3 lcd_wdat(in_data[1]); //显示乘积高位
318 3 lcd_wdat(0x20);
319 3 key_num=1;
320 3 }
321 2 }
322 1
323 1 if(key_num==1)
324 1 {
325 2 keydown();
326 2 if(key_buf==0x0c) //C 键显示正确答案
327 2 {
328 3 right();
329 3 key_num=0;
330 3 }
331 2 if(key_buf<10)
332 2 {
333 3 key_buf=key_buf+0x30; //转换为ASCII码
334 3 in_data[0]=key_buf; //输入乘积低位
335 3 lcd_pos(0x4c);
336 3 lcd_wdat(in_data[0]); //显示乘积低位
337 3 key_num=0;
338 3 }
339 2 }
340 1 }
341 /**********************************************************
342
343 数据比较函数
344
345 **********************************************************/
346 void datacomp()
347 {
348 1 if(testdata[1]-in_data[1]==0) //比较乘积高位
349 1 {
350 2 if(testdata[0]-in_data[0]==0) //比较乘积低位
351 2 {
352 3 beep(); //计算正确蜂鸣器响3声
353 3 beep();
354 3 beep();
355 3 truer=1; //比较正确
356 3 F_in=0; //可以重新出题
357 3 }
358 2 else truer=0; //比较错误
359 2 }
360 1 else truer=0; //比较错误
361 1
362 1 if(truer==0)
363 1 {
364 2 lcd_pos(0x4B); //清除错误答案
365 2 lcd_wdat(0x20);
C51 COMPILER V8.02 FORMULA 01/04/2007 09:53:28 PAGE 7
366 2 lcd_wdat(0x3f);
367 2 F_in=1; //禁止重新出题
368 2 }
369 1 }
370
371 /**********************************************************
372
373 主函数
374
375 **********************************************************/
376 main()
377 {
378 1 uchar m;
379 1 lcd_init(); //初始化LCD
380 1
381 1 lcd_pos(0x00); //设置显示位置为第一行
382 1 for(m=0;m<16;m++)
383 1 lcd_wdat(cdis1[m]);
384 1
385 1 lcd_pos(0x40); //设置显示位置为第二行
386 1 for(m=0;m<16;m++)
387 1 lcd_wdat(cdis2[m]);
388 1
389 1 TMOD=0x21; //将T1设置为8位自动重装工作方式。
390 1 TH1=175; //对T1定时常数进行预置。
391 1 TL1=175;
392 1 TR1=1; //启动T1。
393 1
394 1 while(1)
395 1 {
396 2 keydown();
397 2 if(key_buf==0x0f) //F 键为模拟出题开关
398 2 {
399 3 rubric();
400 3 lcd_pos(0x47);
401 3 lcd_wdat(testdata[3]); //显示被乘数
402 3 lcd_pos(0x49);
403 3 lcd_wdat(testdata[2]); //显示乘数
404 3
405 3 lcd_pos(0x4B);
406 3 lcd_wdat(0x20);
407 3 lcd_wdat(0x3f); //显示 ?
408 3 key_buf=0x00;
409 3 F_in=1; //出题目完毕标志
410 3 }
411 2
412 2 while(F_in==1)
413 2 {
414 3 key_input();
415 3 datacomp();
416 3 }
417 2 }
418 1 }
419
420 /*********************************************************/
421
422
423
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 726 ----
C51 COMPILER V8.02 FORMULA 01/04/2007 09:53:28 PAGE 8
CONSTANT SIZE = 34 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 11 ----
IDATA SIZE = ---- ----
BIT SIZE = 2 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -