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

📄 abc.lst

📁 单片机89s52与12864a液晶驱动及动画演示
💻 LST
📖 第 1 页 / 共 2 页
字号:
 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 + -