📄 abc.lst
字号:
243
244 void point (uchar x1,uchar y1)//写一个点,读到后与现在的数合并,重新写回去//
245 {
246 1
247 1 uchar m=0x01;
248 1 uchar x2;
249 1 uchar s1=1;
250 1 uchar s2=0;
251 1 uchar x3;
252 1
253 1 if (y1>63){s1=0;s2=1;y1-=64;};
254 1 x2=x1/8;
255 1 x1=x1%8;
256 1 x1=m<<x1;
257 1 x1=~x1;
258 1 set_adr(x2,y1);//设置地址
259 1 x3=rdata(s1,s2);//读出数
260 1 set_adr(x2,y1);//重新设地址
261 1 x3&=x1;//与现在的数相与传给x3
262 1 wdata(x3,s1,s2);//把数写回去
263 1 }
264
265 void line(uchar x,uchar y,uchar x1,uchar y1)//画一条任意两点间的直线 ,用了我几天阿
266 {
267 1 uchar i;
268 1 uchar a;
269 1 uchar b;/////////////////把此函数中的所有数字用char可能会提高一些速度。///////////
270 1 uchar c;//中间值
271 1 uint a1;
272 1 uint b1;
273 1
274 1 char d=1;//标志位,1表示x大,-1表示x1大
275 1 char e=1;//标志位,1表示y大,-1表示y1大?
276 1 bit f=0;//标志位,0表示a大,1表示b大
277 1 if (x1>x){a=(x1-x);d=-1;}
278 1 else a=(x-x1); ///
279 1 if (y1>y){b=(y1-y);e=-1;}
280 1 else b=(y-y1); ///
281 1 a1=a;
282 1 b1=b;
283 1
284 1 if (b>a) {c=b;b=a;b=c;f=1;} //保证a>b容易对数进行操作
285 1
286 1 if(f==0){ //分为两种情况 a>b的时候
287 2 for (i=0;i<=a;i++)
288 2 {
289 3 x1=x;
290 3 y1=y;
291 3 x=x-d*i;
292 3 y=y-(b1*i/a1)*e;
293 3 point(x,y);
294 3 x=x1;
295 3 y=y1;
296 3 }
297 2 };
298 1
299 1 if(f==1){ //a<b的时候;以空间换时间算法//
300 2 for (i=0;i<=b;i++)
301 2 {
302 3 x1=x;
C51 COMPILER V6.12 ABC 11/14/2008 17:49:05 PAGE 6
303 3 y1=y;
304 3 y=y-e*i;
305 3 x=x-(a1*i/b1)*d;
306 3 point(x,y);
307 3 x=x1;
308 3 y=y1;
309 3
310 3 }
311 2 };
312 1
313 1 }
314
315 void clean ()//清全屏函数
316 {
317 1 uchar i,j;
318 1 //set_adr(0,0);
319 1 for (j=0;j<8;j++)
320 1 {
321 2 set_adr(j,0);
322 2 for(i=0;i<64;i++)
323 2 {
324 3 cs1=1; //两个屏幕同时执行//速度会快很多
325 3 cs2=1;
326 3 di=1;
327 3 rw=0;
328 3 P2=0xff;
329 3 e=0;
330 3 delay(5);
331 3 e=1;
332 3 // delay(5); //没必要加这个延时
333 3 e=0;
334 3 }
335 2 }
336 1 }
337
338 void cls(uchar a,uchar b,uchar c,uchar d)//对指定的范围进行清屏//肯定还有简洁的方法//这里写太匆忙了
339 {
340 1 uchar i,j;
341 1 bit e=0;
342 1 bit f=0;
343 1 uchar d1;
344 1
345 1 if(b<63){e=1;}; //如果a,b在左半屏的话e=1;
346 1 if((d<127)&&(d>63)){f=1;}; //如果c,d,在右半屏的话f=1;
347 1 d1=d;
348 1 while(e)////////////////////写左半屏
349 1 {
350 2 if (d>63){d=63;}
351 2
352 2 for (i=a;i<=c;i++)
353 2 {
354 3 set_adr(i,b);
355 3 for (j=b;j<=d;j++)
356 3 {
357 4 wdata(0xff,1,0);
358 4 }
359 3 }
360 2 e=0;
361 2 }
362 1
363 1 while(f)////////////////////写右半屏
364 1 {
C51 COMPILER V6.12 ABC 11/14/2008 17:49:05 PAGE 7
365 2 if (d1>63){d1=d1-64;};
366 2 if (b<64){b=0;};
367 2 if (b>63){b=b-64;};
368 2 for (i=a;i<=c;i++)
369 2 {
370 3 set_adr(i,b);
371 3 for (j=b;j<=d1;j++)
372 3 {
373 4
374 4 wdata(0xff,0,1);
375 4 }
376 3 }
377 2 f=0;
378 2 }
379 1 }
380
381 //画一个指定位置的图,xy为起点坐标q为横向宽度,s为纵向长度
382 //应该可以加上不同的数据组以显示不同的图画
383 void found(uchar x,uchar y,uchar q,uchar s)
384 {
385 1
386 1 uint k=0;
387 1 uchar y1,i,j;
388 1 bit e=1;
389 1 bit f=0;
390 1 y1=y;
391 1 for (i=0;i<q;i++)
392 1 {
393 2 set_adr(x+i,y);
394 2 for (j=0;j<s;j++)
395 2 {
396 3 if (y1>63){set_adr((x+i),0);y1=y1-64;e=0;f=1;}
397 3 wdata(a[k],e,f);
398 3 y1++;
399 3 k++;
400 3 }
401 2 e=1;f=0;y1=y;
402 2 }
403 1 }
404 //写一个指定位置的图//反色 其他同上
405 void found1(uchar x,uchar y,uchar q,uchar s)
406 {
407 1
408 1 uint k=0;
409 1 uchar y1,i,j;
410 1 bit e=1;
411 1 bit f=0;
412 1 y1=y;
413 1 for (i=0;i<q;i++)
414 1 {
415 2 set_adr(x+i,y);
416 2 for (j=0;j<s;j++)
417 2 {
418 3 if (y1>63){set_adr((x+i),0);y1=y1-64;e=0;f=1;}
419 3 wdata(~a[k],e,f);
420 3 y1++;
421 3 k++;
422 3 }
423 2 e=1;f=0;y1=y;
424 2 }
425 1 }
426
C51 COMPILER V6.12 ABC 11/14/2008 17:49:05 PAGE 8
427 void found2(uint s,bit t)//写英语字母ascii码//t=0;左半屏//反色
428 {
429 1 uchar i;
430 1 bit e=1;
431 1 bit f=0;
432 1 if (t==1){e=0;f=1;}
433 1 for (i=0;i<5;i++)
434 1 {
435 2 wdata(~asc[s++],e,f);//要置反写上去。因为在屏幕上1是白色,0是蓝色,而初始化后是全部为1的;
436 2 };
437 1
438 1 }
439
440 void zhimu(uchar a,uchar d,uchar c)//把 b[] 中的数按行写//可以加入指针使得函数更加通用
441 //a为起始行,d为起始列//c为写入数组长度
442 {
443 1 uchar i;
444 1 bit e=0;
445 1 for (i=0;i<=c;i++)
446 1 {
447 2 if (b[i]=='/'&&b[i+1]=='0')//遇到 /0 就换行,且跳过/0;
448 2 {
449 3 a++;
450 3 if (a==8){clean();a=0;}//说明长度已经超过8行//清屏并且换行
451 3 set_adr(a,4);
452 3 ///////////////////////////产生动画的效果,m没有用循环,便于修改///////////可以去掉
453 3 found2(75,0);
454 3 delay2(10);
455 3 set_adr(a,4);
456 3 found2(65,0);
457 3 delay2(10);
458 3 set_adr(a,4);
459 3 found2(300,0);
460 3 delay2(10);
461 3 set_adr(a,4);
462 3 found2(205,0);
463 3 delay2(10);
464 3 set_adr(a,4);
465 3
466 3 found2(75,0);
467 3 delay2(10);
468 3 set_adr(a,4);
469 3 found2(65,0);
470 3 delay2(10);
471 3 set_adr(a,4);
472 3 found2(300,0);
473 3 delay2(10);
474 3 set_adr(a,4);
475 3 found2(205,0);
476 3 delay2(10);
477 3 set_adr(a,4);
478 3
479 3 ////////////////////////////////////////////////////
480 3 d=4;i++;i++;e=0;
481 3 };
482 2 if (d>123)//当d>123时,//说明已经写不下一个字母了//要换行。
483 2 {
484 3 a++;
485 3 if (a==8){clean();a=0;}//a=8;说明已经写不下了清屏并且换行,换到首行地址
486 3 //设定行开始地址
487 3 //前面空4个,因为64列能写12个,还剩4个,在首行空出来防止中间左右屏连接处出现空白间隔
488 3 set_adr(a,4);d=4;e=0;};
C51 COMPILER V6.12 ABC 11/14/2008 17:49:05 PAGE 9
489 2
490 2 if (d<64){set_adr(a,d);e=0;};//进行换行操作小于64的话在左屏,63-123的话,在右屏。
491 2 if (d>63&&d<124){set_adr(a,d-64);e=1;};
492 2 //d=d+5;
493 2 found2((b[i]-32)*5,e);//b[i]-32是为了把ascii码转换成本地码 *5是为了寻址,因为每个字母用5个uchar;
494 2 d=d+6;//内部自定义地址自动加5,然后再加一个空格,其实可以精简成d+=5;呵呵,其实没关系的,因为keil优化后一
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -