新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 浅谈用单片机控制12864液晶

浅谈用单片机控制12864液晶

作者: 时间:2012-09-03 来源:网络 收藏


这样基本的函数便写好了,关于12864的操作是这样的:首先需要对其进行配置,即执行初始化函数,然后就可以进行进行显示字符了。如果我们要在屏幕上显示汉字“好”,需要这样操作:首先写入命令,内容为显示地址(第一行首空间为0x80),然后写入数据,内容为我们要显示的字符(内容为“好”),于是我们的代码这样写:
    init_12864();
    write_cmd(0x80);
    write_dat(“好”);

本文引用地址:https://www.eepw.com.cn/article/170933.htm


这样我们进行代码编译,将文件下载到就可以在12864上看见在屏幕最左上角的“好”字了。下面进行一些更加复杂一点的操作。即在屏幕任意的地方显示任意的字符串(当然需要的显示空间要够,不然会没有地方显示的),代码如下:
    void set_xy(uchar row,uchar line) //设置显示地址为第x行y列
    {
        switch(row) //对行进行判断
        {
             case 1: {write_cmd(0x80|line);break;} //第一行,则设定列位置
            case 2: {write_cmd(0x90|line);break;} //第二行,则设定列位置
            case 3: {write_cmd(0x88|line);break;} //第三行,则设定列位置
            case 4: {write_cmd(0x98|line);break;} //第四行,则设定列位置
        }
    }    
    
    void write_xy(uchar row,uchar line,uchar *string) //在坐标为x行y列的地方显示出字符串string
    {
        uchar lcd_temp; //定义显示数据暂存变量
        set_xy(row,line); //设定显示地址为第x行y列    
        lcd_temp=*string; //将string的内容赋给lcd_temp    
         while(lcd_temp!=0x00) //判断字符串截止标志
        {
             write_dat(lcd_temp); //写入字符串的相应内容
            lcd_temp=*(++string); //读取字符串下一位字符
        }
    }


这样,一个函数就编写好了,如果我们想在第三行第二列的位置显示“我爱电子”,则这样进行操作:行x=3,列y=2,字符串为“我爱电子”,于是我们在主函数里面写这样的代码:
    unsigned char string=“我爱电子”;
    write_xy(3,2,uchar *string);   

 
这样我们进行代码编译,将文件下载到就可以在12864上看见在屏幕第三行第二列的位置显示“我爱电子”。下面介绍一下在12864上进行局部显示图片,在显示图片之前我们需要获得所显示图片的二进制编码。这个可以借助字模提取软件>来进行,然后在函数中定义一下(我定义为logo[ ]={ }),下面是局部显示图片的函数
    void lcd12864_display(uchar code *img)/*显示函数*/
    {
     uchar x,y;
    uint i=0;//不可定义为uchar,数量不够用
     for(y=24;y=31;y++) //我们可以更改y的最小值和最大值来显示区域
    {
         for(x=1;x3;x++)//每个x对应于2个字节,我们可以更改x的最小值和最大值来显示区域
        {
             write_cmd(0x36); //扩充指令,同时开通图形显示
            write_cmd(0x80+y);//垂直地址
             write_cmd(0x80+x);//水平地址
            write_cmd(0x30);//改为基本指令,进而进行基本输入
             write_dat(img[i++]); //数据写入
            write_dat(img[i++]);
        }
    }
    for(y=0;y=23;y++) //我们可以更改y的最小值和最大值来显示区域
    {
         for(x=1;x3;x++) //我们可以更改x的最小值和最大值来控制显示区域
        {
             write_cmd(0x36);//扩充指令,同时开通图形显示
             write_cmd(0x80+y);//垂直地址
            write_cmd(0x88+x); //显示下半屏,y的坐标不变,x的坐标加8(看datasheet上的图)
             write_cmd(0x30);//改为基本指令,进而进行基本输入
            write_dat(img[i++]); //数据写入
            write_dat(img[i++]);
        }
     }
    }


这样,一个函数就编写好了,如果我们就可以在任意区域显示自己想要的图片了(当然写入的区域不要有汉字或字符内容,不然会重叠到一起的,关于这部分的解决方案,下面即将介绍)
笔者在应用12864的时候,由基本模式切换到绘图模式时,会出现屏幕花屏的情况,始终无法解决,最后编写了一段清除图片内容的函数,其代码如下:
    void clear_img()
    {
     uchar p,q;
    write_cmd(0x34);
    write_cmd(0x36);
    for(p=0;p32;p++)
    {
    write_cmd(0x80|p);
    write_cmd(0x80);
     for(q=0;q32;q++)
     write_dat(0);
    }
    } 


仔细研究一下这段代码,其实大家可以发现没有什么特别的东西,主要是为了给图片区域的部分全部写入0,屏蔽其显示内容,由此便可以解决模式切换后的花屏现象。然后在主函数中,调用初始化函数后,执行上面的clear_img()函数即可避免模式切换后的花屏现象。效果还是不错的,只是占用的时间比较长。笔者最初用普通51时候选用11.05926M晶振,经12分频后清屏速度还是很慢的(接近8秒钟时间),后换用24M不分频的51单片机,清屏速度加快了很多(大概在0.4秒左右),所以这种方法并不适用普通51,否则光清屏的时间就会让人抓狂的。只建议不分频的单片机使用这种方法。


做比赛之前从来没有用过12864,从头学起,最后在12864上做出了一个简单的操作界面,花了整整两天时间。其中图像清屏的问题占用了很多时间,所以在此写下此文,为后来者提供问题的解决方案。最后欢迎大家多多交流~~

万能遥控器相关文章:万能遥控器代码


51单片机相关文章:51单片机教程


单片机相关文章:单片机教程


单片机相关文章:单片机视频教程


单片机相关文章:单片机工作原理


led显示器相关文章:led显示器原理



上一页 1 2 下一页

评论


相关推荐

技术专区

关闭