STC8A—基于JLX12864的简易图形编辑器

发布时间:2024-08-14  

  STC8A小制作:基于JLX12864的简易图形编辑器,本文将介绍JLX12864的驱动程序,以及Bresenham直线算法和画圆算法的实现。

  一、制作背景:

  在学习12864显示屏时,经常会使用取模软件,对于字符,取模软件可以说相当方便;对于图片,如果有合适的图片进行转换,也挺方便的,但是有一种情况,使用取模软件相当不方便,那就是需要自己进行规则图形的绘制时,在电脑上使用大像素点进行绘制没有那么直观,而且操作上也只能一个点一个点的绘制,于是可以制作一个图形编辑器,直接在12864上操作,并像取模软件一样输出字模。

  二、功能:

  1)设置光标的坐标值,并移动到设定值;

  2)绘制点、直线、圆;

  3)绘制和擦除模式;

  4)通过串口将字模数据按照规定格式输出;

  三、驱动程序:

  1)JLX12864的SPI时序;

ixel(x,y,color);

        }

    }

    else

    {

        for(y=y1;y<=y0;y++)

        {

            cog_drawpixel(x,y,color);

        }

    }

}


void cog_drawstraight(uchar x0,uchar y0,uchar x1,uchar y1,uchar color)        //draw straight line(x : 0~127 , y : 0~63) , color : 0/1

{

    int err=0,x,y,dx,dy;

    int incx,incy;

    if(x1>x0)

        incx=1;

    else if(x1==x0)

        incx=0;

    else

        incx=-1;

    if(y1>y0)

        incy=1;

    else if(y1==y0)

        incy=0;

    else

        incy=-1;

    if(incx==0)

        cog_drawcolumn(x0,y0,y1,color);

    else if(incy==0)

        cog_drawline(x0,x1,y0,color);

    else

    {

        dx=abs((int)x1-(int)x0);

        dy=abs((int)y1-(int)y0);

        if(dx>=dy)

        {

            dx=(int)x1-(int)x0;

            dy=(int)y1-(int)y0;

            dx=dx*incx;

            dy=dy*incy;

            err=0-dx;

            for(x=(int)x0,y=(int)y0;x!=(int)x1+incx;x=x+incx)

            {

                cog_drawpixel((uchar)x,(uchar)y,color);

                err=err+2*dy;

                if(err>0)

                {

                    y=y+incy;

                    err=err-2*dx;

                }

            }

        }

        else

        {

            dx=(int)x1-(int)x0;

            dy=(int)y1-(int)y0;

            dx=dx*incx;

            dy=dy*incy;

            err=0-dy;

            for(x=(int)x0,y=(int)y0;y!=(int)y1+incy;y=y+incy)

            {

                cog_drawpixel((uchar)x,(uchar)y,color);

                err=err+2*dx;

                if(err>0)

                {

                    x=x+incx;

                    err=err-2*dy;

                }

            }

        }

    }

}


void cog_drawcircle(uchar x0,uchar y0,uchar r,uchar color)        //draw circle(x : 0~127 , y : 0~63) , r : 1~32 , color : 0/1

{

    int x=0,y=r,d;

    d=3-2*r;

    while(x<=y)

    {

        cog_drawpixel(x0+x,y0+y,color);

        cog_drawpixel(x0-x,y0+y,color);

        cog_drawpixel(x0+x,y0-y,color);

        cog_drawpixel(x0-x,y0-y,color);

        cog_drawpixel(x0+y,y0+x,color);

        cog_drawpixel(x0-y,y0+x,color);

        cog_drawpixel(x0+y,y0-x,color);

        cog_drawpixel(x0-y,y0-x,color);

        if(d<0)

            d=d+4*x+6;

        else

        {

            d=d+4*(x-y)+10;

            y--;

        }

        x++;

    }

}


  8)显示字符和字符串;


    字符可以用取模软件生成,可以生成不同大小的字符,一般都是遵循ASCII码的顺序,这样方便编程。


void cog_showchar(uchar x,uchar y,uchar size_char,uchar chr)        //show char(x : 0~127 , y : 0~7) , size_char : 8/16/32

{

    uchar i;

    chr=chr-' ';

    if(size_char==8)

    {

        cog_setposition(x,y);

        for(i=0;i<6;i++)

        {

            display_cache[y*128+x+i]=font6x8[chr*6+i];

            cog_writebyte(font6x8[chr*6+i],COG_DATA);

        }

    }

    else if(size_char==16)

    {

        cog_setposition(x,y);

        for(i=0;i<8;i++)

        {

            display_cache[y*128+x+i]=font8x16[chr*16+i];

            cog_writebyte(font8x16[chr*16+i],COG_DATA);

        }

        cog_setposition(x,y+1);

        for(;i<16;i++)

        {

            display_cache[(y+1)*128+x+i-8]=font8x16[chr*16+i];

            cog_writebyte(font8x16[chr*16+i],COG_DATA);

        }

    }

    else

    {

        cog_setposition(x,y);

        for(i=0;i<16;i++)

        {

            display_cache[y*128+x+i]=font16x32[chr*4][i];

            cog_writebyte(font16x32[chr*4][i],COG_DATA);

        }

        cog_setposition(x,y+1);

        for(i=0;i<16;i++)

        {

            display_cache[(y+1)*128+x+i]=font16x32[chr*4+1][i];

            cog_writebyte(font16x32[chr*4+1][i],COG_DATA);

        }

        cog_setposition(x,y+2);

        for(i=0;i<16;i++)

        {

            display_cache[(y+2)*128+x+i]=font16x32[chr*4+2][i];

            cog_writebyte(font16x32[chr*4+2][i],COG_DATA);

        }

        cog_setposition(x,y+3);

        for(i=0;i<16;i++)

        {

            display_cache[(y+3)*128+x+i]=font16x32[chr*4+3][i];

            cog_writebyte(font16x32[chr*4+3][i],COG_DATA);

        }

    }

}


void cog_showstring(uchar x,uchar y,uchar size_char,uchar *string)        //show string(x : 0~127 , y : 0~7) , size_char : 8/16

{

    uchar i=0;

    while(string[i]!='')

    {

        cog_showchar(x,y,size_char,string[i]);

        x=x+8;

        if(x>120)

        {

            if(size_char==8)

            {

                x=0;

                y=y+1;

            }

            else

            {

                x=0;

                y=y+2;

            }

        }

        i++;

    }

}


  既然是要进行图形编辑,那么在进行设置等需要显示其他内容是,显示缓存里关于图形的内容就被覆盖掉了,最直接的解决方法就是再建一个缓存数组,实时保存编辑的图形,在设置完需要切回图形时显示这个数组就可以了。


  整个程序不是很复杂,但是也无法在这里一一介绍,所以将程序整个打包,需要的自取。


 https://files.cnblogs.com/files/sk3241/%E5%9F%BA%E4%BA%8EJLX12864%E7%9A%84%E7%AE%80%E6%98%93%E5%9B%BE%E5%BD%A2%E7%BC%96%E8%BE%91%E5%99%A8.rar


  最后将电路板用木板包装装饰一下,就是以下的样子:

   

  接上USB线后就可以进行图形编辑,比如画一个温度计;

  绘制完成之后,在电脑端打开任意串口调试工具,设置波特率115200,打开串口,按下图形编辑器的“上传”按钮,绘制的图形就以字符形式发送到了电脑;

  将接收到的图形数据保存为txt文件,就可以用在别的程序里了,很方便。


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>