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

📄 abc.c

📁 单片机89s52与12864a液晶驱动及动画演示
💻 C
📖 第 1 页 / 共 2 页
字号:
   y1=y;
         y=y-e*i;
         x=x-(a1*i/b1)*d;
         point(x,y);
   x=x1;
   y=y1;

         }
         };

}

void clean ()//清全屏函数
{
uchar i,j;
//set_adr(0,0);
for (j=0;j<8;j++)
   {
   set_adr(j,0);
   for(i=0;i<64;i++)
      {
      cs1=1;  //两个屏幕同时执行//速度会快很多
      cs2=1;
      di=1;
      rw=0;
      P2=0xff;
      e=0;
      delay(5);
      e=1;
//      delay(5);    //没必要加这个延时
      e=0;
      }
   }
}

void cls(uchar a,uchar b,uchar c,uchar d)//对指定的范围进行清屏//肯定还有简洁的方法//这里写太匆忙了
    {
uchar i,j;
bit e=0;
bit f=0;
uchar d1;

if(b<63){e=1;};   //如果a,b在左半屏的话e=1;
if((d<127)&&(d>63)){f=1;}; //如果c,d,在右半屏的话f=1;
d1=d;
while(e)////////////////////写左半屏
{
if (d>63){d=63;}

for (i=a;i<=c;i++)
   {
   set_adr(i,b);
   for (j=b;j<=d;j++)
     {
        wdata(0xff,1,0);
      }
    }
   e=0;
}

while(f)////////////////////写右半屏
{
if (d1>63){d1=d1-64;};
if (b<64){b=0;};
if (b>63){b=b-64;};
for (i=a;i<=c;i++)
    {
 set_adr(i,b);
    for (j=b;j<=d1;j++)
      {
       
         wdata(0xff,0,1);
      }
    }
   f=0;
}
}

//画一个指定位置的图,xy为起点坐标q为横向宽度,s为纵向长度
//应该可以加上不同的数据组以显示不同的图画
 void found(uchar x,uchar y,uchar q,uchar s)
    {
    
  uint k=0;
  uchar y1,i,j;
  bit e=1;
  bit f=0;
  y1=y;
    for (i=0;i<q;i++)
       {
    set_adr(x+i,y);
       for (j=0;j<s;j++)
          {
    if (y1>63){set_adr((x+i),0);y1=y1-64;e=0;f=1;}
          wdata(a[k],e,f);
          y1++;
          k++;
          }
        e=1;f=0;y1=y;
        }
    }
//写一个指定位置的图//反色 其他同上
void found1(uchar x,uchar y,uchar q,uchar s)
    {
    
  uint k=0;
  uchar y1,i,j;
  bit e=1;
  bit f=0;
  y1=y;
    for (i=0;i<q;i++)
       {
    set_adr(x+i,y);
       for (j=0;j<s;j++)
          {
    if (y1>63){set_adr((x+i),0);y1=y1-64;e=0;f=1;}
          wdata(~a[k],e,f);
          y1++;
          k++;
          }
        e=1;f=0;y1=y;
        }
    }

void found2(uint s,bit t)//写英语字母ascii码//t=0;左半屏//反色
    {
  uchar i;
  bit e=1;
  bit f=0;
  if (t==1){e=0;f=1;}
     for (i=0;i<5;i++)
         {
         wdata(~asc[s++],e,f);//要置反写上去。因为在屏幕上1是白色,0是蓝色,而初始化后是全部为1的;
         };
       
    }

void zhimu(uchar a,uchar d,uchar c)//把 b[] 中的数按行写//可以加入指针使得函数更加通用
            //0        4       174
//a为起始行,d为起始列//c为写入数组长度
{
uchar i;
bit e=0;
for (i=0;i<=c;i++)
{
if (b[i]=='/'&&b[i+1]=='0')//遇到 /0 就换行,且跳过/0;
{
a++;
	if (a==8){clean();a=0;}//说明长度已经超过8行//清屏并且换行
set_adr(a,4);
///////////////////////////产生动画的效果,m没有用循环,便于修改///////////可以去掉
found2(75,0);
delay2(10);
set_adr(a,4);
found2(65,0);
delay2(10);
set_adr(a,4);
found2(300,0);
delay2(10);
set_adr(a,4);
found2(205,0);
delay2(10);
set_adr(a,4);

found2(75,0);
delay2(10);
set_adr(a,4);
found2(65,0);
delay2(10);
set_adr(a,4);
found2(300,0);
delay2(10);
set_adr(a,4);
found2(205,0);
delay2(10);
set_adr(a,4);

////////////////////////////////////////////////////
d=4;i++;i++;e=0;
};
if (d>123)//当d>123时,//说明已经写不下一个字母了//要换行。
{
a++;
if (a==8){clean();a=0;}//a=8;说明已经写不下了清屏并且换行,换到首行地址
//设定行开始地址
//前面空4个,因为64列能写12个,还剩4个,在首行空出来防止中间左右屏连接处出现空白间隔
set_adr(a,4);d=4;e=0;};

if (d<64){set_adr(a,d);e=0;};//进行换行操作小于64的话在左屏,63-123的话,在右屏。
if (d>63&&d<124){set_adr(a,d-64);e=1;};
//d=d+5;
found2((b[i]-32)*5,e);//b[i]-32是为了把ascii码转换成本地码  *5是为了寻址,因为每个字母用5个uchar;
d=d+6;//内部自定义地址自动加5,然后再加一个空格,其实可以精简成d+=5;呵呵,其实没关系的,因为keil优化后一样看待

}
}


void windows(uchar x,uchar y,uchar x1,uchar y1,uchar g,uchar h,uchar m,uchar n)
//指定位置xy起点,x1y1终点   ,gh,mn分别是清除的起始坐标和终止坐标,
//有点复杂,注意各个值的取值范围不一样;
{
uchar i;
uchar a;
uchar b;///////把此函数中的所有数字用char可能会提高一些速度。///////
uchar c;//中间值
uint a1;
uint b1;

char d=1;//标志位,1表示x大,-1表示x1大
char e=1;//标志位,1表示y大,-1表示y1大
bit f=0;//标志位,0表示a大,1表示b大

if (x1>x){a=(x1-x);d=-1;}
    else a=(x-x1); 

if (y1>y){b=(y1-y);e=-1;}
    else b=(y-y1);  
a1=a;b1=b;

if (b>a) {c=b;b=a;b=c;f=1;}  

if(f==0){                      
         for (i=0;i<=a;i++)
         {
   x1=x;
   y1=y;
         x=x-d*i;
         y=y-(b1*i/a1)*e;
         line(x,y,x,y1); //1
   line(x,y1,x1,y1); //2
   line(x,y,x1,y); //3
   line(x1,y,x1,y1); //4
   x=x1;
   y=y1;
   i++;//为了提高速度//不得不4格跳一次,描一次线//所以注意窗口的长宽像素值与当前相符
   i++;
    i++;
    i++;
         }
         };

if(f==1){
         for (i=0;i<=b;i++)   
         {   
   x1=x;
   y1=y;

         y=y-e*i;
         x=x-(a1*i/b1)*d;
         line(x,y,x,y1); //1
   line(x,y1,x1,y1); //2
   line(x,y,x1,y); //3
   line(x1,y,x1,y1); //4
   x=x1;
   y=y1;
   cls(g,h,m,n);
   i++;
   i++;
    i++;
    i++;
         }
         };

}

void main()
{

//reset();//重启
dison_off(0);//关闭
dison_off(1);//开启

while(1)
{
set_startline(0);//设起始行
set_adr(0,0);//设地址

while(1)
{

//
 //windows(12,13,45,34);
 //clean();
 //windows(2,53,55,14);
clean();
zhimu(0,4,174);
//delay2(20); 
//clean();
//windows(7,17,49,113,1,18,5,111);
//found1(1,18,5,92);
 //clean();
 //set_adr(0,0);
 //windows(15,35,48,120,2,36,5,119);
//while(1);
}
while(1);
}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -