找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8831|回复: 13
打印 上一主题 下一主题
收起左侧

带字库12864 显示汉字 指定汉字反白 共享给新手 老鸟飞过

  [复制链接]
跳转到指定楼层
楼主
本帖最后由 dely2009 于 2015-6-29 19:12 编辑

     刚入手1284  写了个时钟在字显示用了16X32  字模大字显示时间 , 用于清屏时才发现, 绘图模式下汉字不会被清屏, 图形错位打时会出现在汉字的底层, 故此写了个指定汉字可以反白的程序代码(其实就是在打字汉字位置画个白条)   共享给新手,老鸟飞过吧  勿喷



如图所示的代码如下

//*****************************************************************************
//           带字库,汉字区反白打底(画白条)
//     参数:x(0-8)   y(0-3)  width(0-16)   12864屏是4行每行8个汉字
//
//*****************************************************************************
void Set_Reverse(unsigned char x,unsigned char y,unsigned char width)
{
    unsigned char i,j;
    Clear_GDRAM();
    LCD_Write_Cmd(0x34);
    LCD_Write_Cmd(0x36);
    switch(y)
   {   
       case 0:y=0X80;break;
       case 1:y=0X90;break;
       case 2:y=0X88;break;
       case 3:y=0X98;break;
    }


     for(i=0;i<16;i++)
    {
          if (y==0X80||y==0X88)   
              { LCD_Write_Cmd(0X80+i);}
         else
              { LCD_Write_Cmd(0x90+i);}

          LCD_Write_Cmd(y+x);
          for(j=0;j<width;j++)
         {
                 LCD_Write_Data(0XFF);
         }
    }
    LCD_Write_Cmd(0x36);
}  

如果想满屏打白底,实现任意 字符反白可参考下面的代码(要区分 奇偶行 和奇偶位的)



//******************************************************************
//            任意位置打白底  ( 反白)
//     参数:x(0 - 15)  y(0 - 3),反白长度(1 - 16)
// ******************************************************************/   
void Set_Reverse(unsigned char x,unsigned char  y,unsigned char width)               
{
         unsigned char i,j,flag= 0;
         unsigned char real_x,real_width;
        Clear_GDRAM();
         if(y>1)
         {
                 flag=0x08;
                 y=y-2;
         }
         LCD_Write_Cmd(0x34);      

        if(x % 2 == 0 && width % 2 == 0)        //开始为偶数,长度偶数
         {
                 real_x = x / 2;
                 real_width = width / 2;

                for(i=0;i<16;i++)
                 {
                         LCD_Write_Cmd(0x80+(y<<4)+i);
                         LCD_Write_Cmd(0x80+flag+real_x);            

                        for(j=0;j<real_width;j++)
                         {
                                 LCD_Write_Data(0xff);
                                 LCD_Write_Data(0xff);                           // 全偶数  写2个字符位的白底
                         }
                 }
         }

        if(x % 2 == 0 && width %2 != 0)                        //开始偶数,长度奇数
         {
                 real_x = x / 2;
                 real_width = width / 2;

                for(i=0;i<16;i++)
                 {
                         LCD_Write_Cmd(0x80+(y<<4)+i);         
                         LCD_Write_Cmd(0x80+flag+real_x);           

                        for(j=0;j<real_width;j++)
                         {
                                 LCD_Write_Data(0xff);
                                 LCD_Write_Data(0xff);                        
                         }
                         LCD_Write_Data(0xff);
                         LCD_Write_Data(0x00);                                //这个要在最后面打一竖排 黑底
                 }
         }

        if(x % 2 != 0 && width % 2 == 0)                //开始奇数,长度偶数
         {
                 real_x = x / 2;
                 real_width = width / 2 - 1;

                for(i=0;i<16;i++)
                 {
                         LCD_Write_Cmd(0x80+(y<<4)+i);
                         LCD_Write_Cmd(0x80+flag+real_x);               

                        LCD_Write_Data(0x00);
                         LCD_Write_Data(0xff);
                         for(j=0;j<real_width;j++)
                         {
                                 LCD_Write_Data(0xff);
                                 LCD_Write_Data(0xff);                              
                         }
                         LCD_Write_Data(0xff);
                         LCD_Write_Data(0x00);                                //  前后都要 打一竖排 黑底         
                 }
         }
        if(x % 2 != 0 && width % 2 != 0)                                //开始奇数,长度奇数
         {
                 real_x = x / 2;
                 real_width = width / 2;

                for(i=0;i<16;i++)
                 {
                         LCD_Write_Cmd(0x80+(y<<4)+i);
                         LCD_Write_Cmd(0x80+flag+real_x);                        

                         LCD_Write_Data(0x00);                          // 只需要在前面多打一竖排黑底
                         LCD_Write_Data(0xff);                                                

                        for(j=0;j<real_width;j++)
                         {
                                 LCD_Write_Data(0xff);
                                 LCD_Write_Data(0xff);                                          
                         }
                 }
         }

        LCD_Write_Cmd(0x36);      
        LCD_Write_Cmd(0x30);      
}





对于无字库的12864直接使用输出字符时取反就可以,    写在这里与新手共享,老鸟飞过, 请勿喷

评分

参与人数 2威望 +55 黑币 +55 收起 理由
absflash + 5 + 5 厉害楼主这水平已经成精了
admin + 50 + 50 共享资料的积分奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏8 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:59048 发表于 2015-6-29 22:33 | 只看该作者
什么驱动的?7920?
回复

使用道具 举报

板凳
ID:84495 发表于 2015-7-1 19:22 | 只看该作者
厉害楼主这水平已经成精了
回复

使用道具 举报

地板
ID:84144 发表于 2015-7-1 21:12 | 只看该作者
我也想做一个,试试
回复

使用道具 举报

5#
ID:73650 发表于 2015-11-29 11:23 | 只看该作者
谢谢,正需要
回复

使用道具 举报

6#
ID:97673 发表于 2015-11-30 12:45 | 只看该作者
这么厉害还是新手那?
回复

使用道具 举报

7#
ID:97673 发表于 2015-11-30 12:46 | 只看该作者
我也想做一个
回复

使用道具 举报

8#
ID:149266 发表于 2017-4-25 08:10 | 只看该作者
有完整程序吗
回复

使用道具 举报

9#
ID:163099 发表于 2017-5-2 23:45 | 只看该作者
反白区域后拖着一些亮点,什么原因?
回复

使用道具 举报

10#
ID:195884 发表于 2017-7-21 16:02 | 只看该作者
是呀,把完整程序亮出来吧
回复

使用道具 举报

11#
ID:165291 发表于 2019-11-15 13:12 | 只看该作者
不好使呢? Clear_GDRAM();这个是什么意思?
回复

使用道具 举报

12#
ID:644149 发表于 2019-12-4 09:08 | 只看该作者
我的12864不带字库,反白的时候要乱跳是什么个情况。就是本来是显示2它却要显示3,本来是3它却要显示1
???
回复

使用道具 举报

13#
ID:414522 发表于 2020-11-27 15:28 | 只看该作者
非常感谢楼主分享!正发愁反白的问题,看到后就参考了一下。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表