搜索
bottom↓
回复: 43

C51仿真12864LCD,GUI任意位置汉字,反白,总线操作

[复制链接]

出0入0汤圆

发表于 2013-5-31 22:25:01 | 显示全部楼层 |阅读模式
本帖最后由 nicksean 于 2013-6-2 15:03 编辑

Keil C51编译,89s52,用总线式连接LCD(不用地址锁存芯片),
使用了Proteus自带的PG12864F液晶(T6963C驱动)
带简易GUI,可在任意位置显示汉字字模及图标,可画线,画矩形,可反白(不依赖于LCD驱动,但要求可读显存内容)有图有真相。
同时也使用了RTX51-Tiny OS,但是因为初学,没有用到任务通信,只用了时间片轮转调度。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

 楼主| 发表于 2013-6-1 07:37:20 | 显示全部楼层
图片怎么没了?重新补上

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出20入70汤圆

发表于 2013-6-1 07:52:15 | 显示全部楼层
标记一下

我一直想找一个简易的GUI,多谢LZ。

出20入70汤圆

发表于 2013-6-1 07:57:01 | 显示全部楼层
靠,连接不存在。

LZ可或重新上传一下。

出0入0汤圆

发表于 2013-6-1 09:16:10 | 显示全部楼层
不错!!!!!楼主牛逼!!!!

出0入0汤圆

发表于 2013-6-1 09:42:15 | 显示全部楼层
UsingRTX51 TNY.zip


Sorry,网页不存在...欢迎来到 ourDEV.cn 我们的电子开发网(原ourAVR.com)
逛逛我们的其它站点
阿莫电子

出0入0汤圆

 楼主| 发表于 2013-6-1 09:46:25 来自手机 | 显示全部楼层
现在在外面,早上发现图没了,没看附件。明天才回家,再上传。

出0入0汤圆

 楼主| 发表于 2013-6-2 14:58:24 | 显示全部楼层
附件来喽attach://116279.zip
觉得好的,别忘了顶贴呀!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出20入70汤圆

发表于 2013-6-2 22:20:52 | 显示全部楼层
感谢!

先研究一下再说。

出0入0汤圆

发表于 2013-6-2 22:45:53 来自手机 | 显示全部楼层
谢谢  很有用

出0入0汤圆

发表于 2013-6-19 22:21:37 | 显示全部楼层
运气真好,正好要用ST7565R驱动的一块12864,同样想做的任意点显示指定块大小的驱动。

看了你的代码,实在不错,想问你注释中的横屏是不是指屏内部结构 “横向的写操作最小单位是字节纵向最小单位是像素”而竖屏是不是指屏内部结构 “纵向的写操作最小单位是字节横向最小单位是像素”?

不知道理解是不是正确的。楼主有竖屏的相应代码吗。能否也奉献出来啊。懒得去折腾了。

出0入0汤圆

 楼主| 发表于 2013-6-20 12:54:06 | 显示全部楼层
楼上的理解正确。但是即使同是横屏,也有低位在左还是在右的区别吧?
这几天感冒了,好几天没开电脑。我更懒得去折腾了。

出0入0汤圆

发表于 2013-7-15 20:09:38 | 显示全部楼层
nicksean 发表于 2013-6-20 12:54
楼上的理解正确。但是即使同是横屏,也有低位在左还是在右的区别吧?
这几天感冒了,好几天没开电脑。我更 ...

发现你的代码有bug,你设置一个宽为29高为2的图片试试。
        else
        {
            stuff = T6963_ReadData(No_move);        //第一块数据
   
            dataB = stuff & (~(0xFF >> ra0));       //第一块的前半部分从屏中读出
            dataA = (*pFont >> ra0) | dataB;        //字模数据前半部分与上次的后半部分合并
            dataB = (*pFont++) << (8 - ra0);        //字模数据后半部分(这里假设了字模空白区填充0)
        
            T6963_WriteData(dataA, Increase);
            
            for(i = pos0 + 1; i < pos1; ++i)
            {
                //移动字模
                dataA = (*pFont >> ra0) | dataB;        //字模数据前半部分与上次的后半部分合并
                dataB = (*pFont++) << (8 - ra0);        //字模数据后半部分(这里假设了字模空白区填充0)

                T6963_WriteData(dataA, Increase);
            }

            if(ra1 != 0)
            {
                stuff = T6963_ReadData(No_move);        //最后一块数据
               
                if(bytes <= 1 || ra0 == ra1)            //当宽度为整字节时, ra0 == ra1
                {
                    dataA = stuff & (0xFF >> ra1) | dataB;
                }
                else
                {
                    dataA = (*pFont >> ra0) | dataB;
                    dataB = stuff & (0xFF >> ra1);
                    dataA = dataB | dataA;
                }
        
                T6963_WriteData(dataA, Increase);
            }
        }
这部分有问题。
移植到我的(竖屏、低位在前)上有问题,刚刚直接在你的(横屏、高位在前)代码里改也不行。

出0入0汤圆

 楼主| 发表于 2013-7-17 12:37:52 | 显示全部楼层
zyw19987 发表于 2013-7-15 20:09
发现你的代码有bug,你设置一个宽为29高为2的图片试试。
        else
        {

最近家里事多,老婆要生孩子,家里要换暖气...
不知道有孩子之后还有没有业余时间写代码了

出0入0汤圆

 楼主| 发表于 2013-7-26 12:54:31 | 显示全部楼层
nicksean 发表于 2013-7-17 12:37
最近家里事多,老婆要生孩子,家里要换暖气...
不知道有孩子之后还有没有业余时间写代码了  ...

借此地一用,把几种情况画出来

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2013-7-26 16:24:31 | 显示全部楼层
本帖最后由 nicksean 于 2013-7-26 21:38 编辑

改成这样试试:
  1. void ShowBMPOneStreamXOR(const BYTE *pFont, BYTE bytes, BYTE pos0, BYTE pos1, BYTE ra0, BYTE ra1)
  2. {
  3.     BYTE i;
  4.     BYTE dataA, dataB, stuff;
  5.    
  6.     if(pos1 == pos0)                            //ÆðÖ¹µãÔÚͬһ¸ö¿éÄÚ
  7.     {
  8.         stuff = T6963_ReadData(No_move);        //½ö´ËÒ»¿éÊý¾Ý
  9.         dataA = (*pFont >> ra0) ^ stuff;        //×ÖÄ£Êý¾ÝÓëÔ­Êý¾ÝÔËËã
  10.         T6963_WriteData(dataA, Increase);
  11.     }
  12.     else
  13.     {
  14.         if(ra0 == 0)
  15.         {
  16.             for(i = pos0; i < pos1; ++i)
  17.             {
  18.                 stuff = T6963_ReadData(No_move);
  19.                 T6963_WriteData(stuff ^ *pFont++, Increase);
  20.             }
  21.          
  22.             if(ra1 != 0)
  23.             {
  24.                 stuff = T6963_ReadData(No_move);//×îºóÒ»¿éÊý¾Ý
  25.                 T6963_WriteData(stuff ^ *pFont, Increase);               
  26.             }         
  27.         }
  28.         else
  29.         {
  30.             dataB = 0;
  31.             for(i = 0; i < bytes; ++i)
  32.             {
  33.                stuff = T6963_ReadData(No_move);

  34.                dataA = *pFont >> ra0 | dataB;          //×ÖÄ£Êý¾ÝÇ°°ë²¿·ÖÓëÉϴεĺó°ë²¿·ÖºÏ²¢
  35.                dataB = (*pFont++) << (8 - ra0);        //×ÖÄ£Êý¾Ýºó°ë²¿·Ö(ÕâÀï¼ÙÉèÁË×ÖÄ£¿Õ°×ÇøÌî³ä0)
  36.                
  37.                T6963_WriteData(stuff ^ dataA, Increase);
  38.             }
  39.             
  40.             if(i <= pos1 - pos0 && ra1 != 0)            // the last RAM byte
  41.             {
  42.                 stuff = T6963_ReadData(No_move);        //×îºóÒ»¿éÊý¾Ý
  43.                
  44.                 dataA = dataB;
  45.                
  46.                 T6963_WriteData(stuff ^ dataA, Increase);
  47.             }
  48.         }
  49.     }
  50. }
复制代码

出0入0汤圆

 楼主| 发表于 2013-7-26 22:07:18 | 显示全部楼层
经过简化后的函数:
  1. void ShowBMPOneStreamXOR(const BYTE *pFont, BYTE bytes, BYTE pos0, BYTE pos1, BYTE ra0, BYTE ra1)
  2. {
  3.     BYTE i;
  4.     BYTE dataA, dataB, stuff;
  5.    
  6.     if(ra0 == 0)                           
  7.     {
  8.         for(i = 0; i < bytes; ++i)
  9.         {
  10.             stuff = T6963_ReadData(No_move);
  11.             T6963_WriteData(stuff ^ pFont[i], Increase);
  12.         }
  13.     }
  14.     else
  15.     {
  16.         dataB = 0;
  17.         for(i = 0; i < bytes; ++i)
  18.         {
  19.             stuff = T6963_ReadData(No_move);
  20.             
  21.             dataA = pFont[i] >> ra0 | dataB;
  22.             dataB = pFont[i] << (8 - ra0);

  23.             T6963_WriteData(stuff ^ dataA, Increase);
  24.         }
  25.         
  26.         if(i <= pos1 - pos0 && ra1 != 0)
  27.         {
  28.             stuff = T6963_ReadData(No_move);
  29.             T6963_WriteData(stuff ^ dataB, Increase);
  30.         }
  31.     }
  32. }
复制代码

出0入0汤圆

发表于 2013-7-26 23:21:26 | 显示全部楼层
nicksean 发表于 2013-7-26 22:07
经过简化后的函数:

在楼主提供的仿真文件中测试了一下楼主的新代码,没发现异常。其他几个运算的函数好像都有类似的问题。
看楼主提供了两个函数,一个是化简的,没看懂是如何化简的?化简的思路是什么?有没有办法让这个底层支持竖屏,横屏,高位在前,低位在前这几个不同组合?
我的屏没法读,现在是开了一个1k的缓存和屏一一对应。

出0入0汤圆

 楼主| 发表于 2013-7-27 07:57:17 来自手机 | 显示全部楼层
思路就是把首字节处理代码合并到循环里。谢谢ls帮助测试。昨天下午对着那张图想了一下午才发现之前的思路有问题。

出0入0汤圆

发表于 2013-7-27 08:01:47 | 显示全部楼层
学习,mark,
谢谢

出0入0汤圆

发表于 2013-7-27 08:04:07 | 显示全部楼层
注意,t6963 驱动 的12864现在很少吧,,12864多用 ks0107/8 或者 串行 st7920,,而t6963常用于 240x320 、240x128

出0入0汤圆

 楼主| 发表于 2013-7-27 10:38:47 来自手机 | 显示全部楼层
是的原来的代码是240x128的用M16驱动的,后来发现proteus里面的的这个屏刚好一样的驱动,就转过来了,顺便试试51的总线驱动。
其他几个函数过几天看看改下。手里没有竖屏,不知proteus里有没有。等这个版本稳定了在说吧。

出0入0汤圆

 楼主| 发表于 2013-7-30 22:52:46 | 显示全部楼层
本帖最后由 nicksean 于 2013-7-31 20:28 编辑

再更新一个,帮忙测试一下,复盖方式填充字模:
  1. void LCD_ShowStreamCVR(const BYTE *pFont, BYTE bytes, BYTE pos0, BYTE pos1, BYTE ra0, BYTE ra1)
  2. {
  3.     BYTE i;
  4.     BYTE dataA, dataB, stuff;
  5.    
  6.     if(ra0 == 0)                           
  7.     {
  8.         if(ra1 != 0)
  9.         {
  10.             --bytes;
  11.         }
  12.         
  13.         for(i = 0; i < bytes; ++i)
  14.         {
  15.             T6963_WriteData(pFont[i], Increase);
  16.         }
  17.         
  18.         if(ra1 != 0)
  19.         {
  20.             stuff = T6963_ReadData(No_move) & (0xFF >> ra1);
  21.             T6963_WriteData(pFont[i] | stuff, Increase);
  22.         }
  23.     }
  24.     else
  25.     {
  26.         stuff = T6963_ReadData(No_move);
  27.         dataB = stuff & (~(0xFF >> ra0));
  28.         
  29.         pos1 -= pos0;        
  30.         for(i = 0; i < pos1; ++i)
  31.         {   
  32.             dataA = (pFont[i] >> ra0) | dataB;
  33.             dataB = pFont[i] << (8 - ra0);
  34.             T6963_WriteData(dataA, Increase);
  35.         }
  36.             
  37.         if(ra1 != 0)
  38.         {
  39.             stuff = T6963_ReadData(No_move);
  40.             stuff &= 0xFF >> ra1;
  41.             
  42.             if(i < bytes)
  43.             {
  44.                 dataA = (pFont[i] >> ra0) | dataB;
  45.             }
  46.             else
  47.             {
  48.                 dataA = dataB;
  49.             }
  50.             T6963_WriteData(stuff | dataA, Increase);               
  51.         }
  52.     }
  53. }
复制代码

出0入0汤圆

 楼主| 发表于 2013-7-31 21:09:14 | 显示全部楼层
本帖最后由 nicksean 于 2013-7-31 21:10 编辑

“或”填充
  1. void ShowBMPOneStreamOR(const BYTE *pFont, BYTE bytes, BYTE pos0, BYTE pos1, BYTE ra0, BYTE ra1)
  2. {
  3.     BYTE i;
  4.     BYTE dataA, dataB, stuff;
  5.    
  6.     if(ra0 == 0)
  7.     {
  8.         for(i = 0; i < bytes; ++i)
  9.         {
  10.             stuff = T6963_ReadData(No_move);
  11.             T6963_WriteData(stuff | pFont[i], Increase);
  12.         }
  13.     }
  14.     else
  15.     {
  16.         dataB = 0;
  17.         for(i = 0; i < bytes; ++i)
  18.         {
  19.             stuff = T6963_ReadData(No_move);
  20.             
  21.             dataA = pFont[i] >> ra0 | dataB;
  22.             dataB = pFont[i] << (8 - ra0);

  23.             T6963_WriteData(stuff | dataA, Increase);
  24.         }
  25.         
  26.         if(i <= pos1 - pos0 && ra1 != 0)
  27.         {
  28.             stuff = T6963_ReadData(No_move);
  29.             T6963_WriteData(stuff | dataB, Increase);
  30.         }
  31.     }
  32. }
复制代码

出0入0汤圆

发表于 2013-7-31 21:12:51 | 显示全部楼层
直接写入函数测试没有发现问题

出0入0汤圆

 楼主| 发表于 2013-8-5 21:32:22 | 显示全部楼层
"与”填充
  1. void ShowBMPOneStreamAND(const BYTE *pFont, BYTE bytes, BYTE pos0, BYTE pos1, BYTE ra0, BYTE ra1)
  2. {
  3.     BYTE i;
  4.     BYTE dataA, dataB, stuff;
  5.    
  6.     if(ra0 == 0)                           
  7.     {
  8.         if(ra1 != 0)
  9.         {
  10.             --bytes;
  11.         }
  12.         
  13.         for(i = 0; i < bytes; ++i)
  14.         {
  15.             stuff = T6963_ReadData(No_move);
  16.             T6963_WriteData(stuff & pFont[i], Increase);
  17.         }
  18.         
  19.         if(ra1 != 0)
  20.         {
  21.             stuff = T6963_ReadData(No_move);
  22.             dataA = (0xFF >> ra1) | pFont[i];
  23.             T6963_WriteData(stuff & dataA, Increase);
  24.         }
  25.     }
  26.     else
  27.     {
  28.         dataB = ~(0xFF >> ra0);
  29.         
  30.         pos1 -= pos0;        
  31.         for(i = 0; i < pos1; ++i)
  32.         {   
  33.             stuff = T6963_ReadData(No_move);
  34.             dataA = (pFont[i] >> ra0) | dataB;
  35.             dataB = pFont[i] << (8 - ra0);
  36.             T6963_WriteData(stuff & dataA, Increase);
  37.         }
  38.             
  39.         if(ra1 != 0)
  40.         {
  41.             stuff = T6963_ReadData(No_move);
  42.             dataB |= (0xFF >> ra1);
  43.             
  44.             if(i < bytes)
  45.             {
  46.                 dataA = (pFont[i] >> ra0) | dataB;
  47.             }
  48.             else
  49.             {
  50.                 dataA = dataB;
  51.             }
  52.             T6963_WriteData(stuff & dataA, Increase);               
  53.         }
  54.     }
  55. }
复制代码

出0入0汤圆

 楼主| 发表于 2013-8-5 21:35:32 | 显示全部楼层
15楼图片怎么没了?再补上

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2013-8-5 21:40:32 | 显示全部楼层
看了傻孩子的贴子,我的代码有点像他留的作业哈。
http://www.amobbs.com/thread-591361-1-1.html

出0入0汤圆

 楼主| 发表于 2013-8-5 21:42:08 | 显示全部楼层
zyw19987 发表于 2013-7-26 23:21
在楼主提供的仿真文件中测试了一下楼主的新代码,没发现异常。其他几个运算的函数好像都有类似的问题。
...

大侠要是能提供屏,倒是可以考虑一下。

出0入0汤圆

发表于 2013-8-5 22:27:38 | 显示全部楼层
很不错,谢谢楼主分享

出0入0汤圆

发表于 2013-11-29 00:58:14 | 显示全部楼层
nicksean 发表于 2013-8-5 21:35
15楼图片怎么没了?再补上

项目做完了,回头来看你的这个图,还不是很懂这里的思路。只知道你的代码试用了大量的位操作,大大提高了执行效率。
望楼主讲解一下下面几个宏试用出思路
#define _SET_BIT(target, bit) ((target) |= (1 << (bit)))
#define _CLR_BIT(target, bit) ((target) &= ~(1 << (bit)))
#define _GET_BIT(target, bit) ((target) & (1 << (bit)))
#define _FLP_BIT(target, bit) ((target) ^= (1 << (bit)))

#define _BIT(bit) (1 << (bit))
#define BIT(bit)   _BIT(bit)
#define _SET_BITS(target, bits) ((target) |= (bits))
#define _CLR_BITS(target, bits) ((target) &= ~(bits))
#define _GET_BITS(target, bits) ((target) & (bits))
#define _FLP_BITS(target, bits) ((target) ^= (bits))

比如:
_FLP_BIT(tempD, 7 - (Px & 0x07));
PX&0X07是获取PX所在字节中的点的偏移量

这个思路是怎么来的呢?

出0入0汤圆

 楼主| 发表于 2013-12-1 21:57:13 | 显示全部楼层
楼上还没忘这个贴子,这个连个酷贴都不是。我现在都快失业了,人生不如意呀。
“Px & 0x07“ 是求 Px 除8后的余数,一种快速算法。
void LCD_Point(BYTE Px, BYTE Py, BYTE mode)
{
    BYTE tempD;
   
    if(Px >= _SCREEN_X_DOTS || Py >= _SCREEN_Y_DOTS)
    {
        return;
    }
        
    LCD_MoveCursorToChar(Px >> 3, Py);                                  //这个假设屏幕是一个字节显示水平8个点的,并且高位在最左边。先将光标移到点所在的字节

    if(mode == _GUI_MODE_CVR || mode == _GUI_MODE_OR)  
    {
        T6963_CMD(_CMD_BIT_SET(7 - (Px & 0x07)));
    }
    else if(mode == _GUI_MODE_FLP)
    {
        tempD = T6963_ReadData(No_move);           //读出该位置中的显存数据
        _FLP_BIT(tempD, 7 - (Px & 0x07));                //将该数据中的相应位取反。
                                              //“Px & 0x07”是得到该点在这个字节中的位置,高位在右。比如在(9, 0)处画点,则在第一行第1字节的左数第2位取反,对应显存位下标为7(最低位为0)
                                              //可是显存中的数据是高位在左,所以这里用7减去这个余数实现转换。9 除以8余数为1,转换为显存位下标为位6.
        T6963_WriteData(tempD, No_move);            //将处理后的结果写回到显存中。
    }
}

关于那几个位操作的宏就没有必要说了。

出0入0汤圆

发表于 2013-12-1 21:59:03 | 显示全部楼层
mark mark ,感谢分享

出0入0汤圆

发表于 2014-3-31 11:34:57 | 显示全部楼层
mark                                                                                                                                

出0入0汤圆

发表于 2014-4-22 20:40:13 | 显示全部楼层
不错不错,这个好极了。

出0入0汤圆

发表于 2014-5-2 16:01:43 | 显示全部楼层
真是高效率的代码,好多没看懂!收藏了慢慢消化

出0入0汤圆

 楼主| 发表于 2015-10-29 23:13:32 | 显示全部楼层
再看这个贴子有些感慨。回贴时我还健康,可现在已是肺癌晚期了,在此对那些辛勤工作的朋友提个醒,当心身体,多运动,找朋友多聊聊天释放压力,定期体检,多买保险,远离污染。保重身体!

出20入118汤圆

发表于 2017-5-19 20:36:02 来自手机 | 显示全部楼层
找12864的gui看到这个,楼主珍重!

出0入0汤圆

发表于 2017-5-20 10:34:56 | 显示全部楼层
nicksean 发表于 2015-10-29 23:13
再看这个贴子有些感慨。回贴时我还健康,可现在已是肺癌晚期了,在此对那些辛勤工作的朋友提个醒,当心身体 ...

又两年过去了,楼主,安好么?

出0入0汤圆

发表于 2017-5-20 13:08:28 | 显示全部楼层
nicksean 发表于 2015-10-29 23:13
再看这个贴子有些感慨。回贴时我还健康,可现在已是肺癌晚期了,在此对那些辛勤工作的朋友提个醒,当心身体 ...

lz看到你的帖子感慨多多,愿你安好!

出0入0汤圆

发表于 2018-9-25 13:51:36 | 显示全部楼层
楼主辛苦,不知道恢复得怎样了。

出0入0汤圆

发表于 2018-9-25 15:59:17 | 显示全部楼层
用户组  高级会员
在线时间1174 小时注册时间2007-12-7 09:52最后访问2017-3-23 17:08上次活动时间2017-3-23 15:44上次发表时间2017-1-17 16:27所在时区使用系统默认
楼主很长时间没来了  

出0入0汤圆

发表于 2018-10-10 21:12:05 | 显示全部楼层
不错,可以用这个GUI把自己的工程重新构造一翻~

出0入0汤圆

发表于 2019-4-19 21:25:16 | 显示全部楼层
谢谢,可能会用12864
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-24 10:09

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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