[经验] 继解决画直线问题,今晚再搞定12864画任意方框大小图片的问题

bobde163   2013-12-17 23:58 楼主
上次画完直线后,白天就没有时间弄了,今天晚上又拿出来,想到上一次画图都是整屏画,如果要画一个小时钟界面,要怎么办呢,于是就想到搞个画任意大小的方框的图片就OK了。开始动手,写到将点数据一一对应显示的时候,突然发现真正的问题来了:如果这个框不是8bit对齐的怎么办,这就意味着由取模软件取得的8bit数据就无法一次性写完一个字节,而且如果从第一个设定的起点开始一个字节一个字节的画,那么剩下的不满8bit的那几位要怎么办,还有如何控制换行,想了好久好久,代码写到这就卡住了。于是满屋子来回走,一边思考,我想这个肯定是可以解决的,只是这个程序的流程要怎么走才能兼顾不破坏其他点数据的情况能画出正确的图,想啊想,我才猛然想到,一次写入数据必须是8bit啊,那我只需要确定一行有多少个8bit和多出来多少个bit,将多出的那部分的点跳过不操作就OK了?一下问题就迎刃而解,20几行代码就解决了。马上用电脑自带的画图工具随便画了两个图,显示正常,又让我激动了一会,嘿嘿~~上个图:
P31217-233728.jpg

回复评论 (8)

顶楼主啊,,20几行代码就搞定了,能不能把代码贴上来看看啊
点赞  2013-12-18 09:55

回复 沙发el756 的帖子

这个函数是只有这么多代码,当然其中还有调用画点程序的,我先实现了功能,代码还没有来得及整理和添加注释什么的,先将就看吧,代码如下:
LCD_DispPic_Any(uchar x,uchar y,uchar width,uchar height,const uchar *s,uchar color)
{
        if((x > 127)||(y > 63))
                return;
        int i,j,m,n,k;
        uchar tmp = 7;
        m = ((width - 1) >> 3) + 1;
        for(i = 0;i < height;i++)
        {
                for(j = 0;j < m;j++)
                {
            if((m - j) == 1)
                    k = (width - 1) % 8 + 1;
            else k = 8;
                        for(n = 0;n < k;n++)
            {
                    tmp = ((1 << n) & (*s)) >> n;
                    if(tmp == 1)
                    {
                            LCD_Display_Dot(x + j*8 + n,y + i,1);
                    }
                    else LCD_Display_Dot(x + j*8 + n,y + i,0);
            }
            s++;
                }
        }
点赞  2013-12-18 12:16

回复 楼主bobde163 的帖子

加油。
一别四五年,变化万千。https://home.eeworld.com.cn/static/image/smiley/comcom/5.gif[/img]
点赞  2013-12-18 12:49

回复 4楼jqh_111 的帖子

谢谢
点赞  2013-12-18 17:39
询问一下:你的液晶是 串行方式连接 还是 并行4线方式连接 的?
网上得到一个结论 ST7920带字库串行方式无法读数据……对这个问题我疑惑比较久了
点赞  2014-1-5 13:08
我是把原来写入的数据读出来,然后对比下,只更新变化的,就可以画图了,楼主是怎么实现的?
点赞  2015-9-11 16:32
楼主有时间吧源码传上来交流下吧
点赞  2015-9-11 16:35
这是我自己写的12864的相关驱动在CCS下的测试工程,包含有画直线,显示图片等功能

点赞  2017-8-21 08:41
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复