2980|1

71

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于点阵型LCD绘点函数的一个疑问 [复制链接]


我这个显示屏的控制器是T6963.

首先说说我对绘点函数的理解,看看我理解的是不是有问题:

假设我用的LCD的显示屏是 240 x 128点阵的单色屏。在纵向上,以 8 个点 为一个byte,如下图:
      列0→ 列1→ 列2→ 列3→ ………………列239 (240 x 128 点阵的屏,最后一列)
        |      |      |      |                    |
行0↓ D0    D0    D0    D0   ………………… D0     ̄ ̄|
行1↓ D1    D1    D1    D1   ………………… D1        | 注:每一列是一个byte,
行2↓ D2    D2    D2    D2   ………………… D2        |  D0,D1…D7是该byte
行3↓ D3    D3    D3    D3   ………………… D3        | 的每一位,并且是从低
行4↓ D4    D4    D4    D4   ………………… D4        | 位到高位的排列。这个
行5↓ D5    D5    D5    D5   ………………… D5        | 8行 x 240列的区域也称
行6↓ D6    D6    D6    D6   ………………… D6        | 为一个 page, 一个page行7↓ D7    D7    D7    D7   ………………… D7    __| 对应着屏幕上从左上方                                                                                                                开始 0x0点开始的8 x 240
                个点。而这个区域对应着显示
内存中的从地址 0x0000开始的240个
内存单元,地址是0x0000,0x0001,0x0002,
0x0003,……0x00EF(十进制值为239)。

因此,我们绘点就是通过找到相应的显示数据存储器DDRAM的位置,并对该位置的相应位置1,就可以点亮相应的点。譬如,我要点亮坐标为 (  行0 , 列1 )的点,该点对应的内存单元是 0x0001, 我对 0x0001这个内存单元写入数据 0000 0001 = 0x01 就行了。

=====================================================================
                            以上是我的理解
======================================================================

我在网上找到了一个T6963的一个程序,他的绘点函数是这个样子的(我用keil和proteus仿真过了,能绘点):


  1. 函数原型: void draw_dot(x,y)
  2. 功   能; T6963屏上打点
  3. 入口参数: 横坐标(x),枞坐标(y)
  4. 出口参数:
  5. ********************************************************************************/
  6. void draw_dot(  uchar x,  uchar y,  uchar mode)
  7. {
  8. uchar dat11,dat22;
  9.                           uchar n,t;
  10.           dat11=(y*32)%256 +x/8;
  11. dat22=(y*32)/256;
  12.                           delay(20);
  13.                           WriteCmd3( dat11, dat22, 0x24);        // dat11是地址低八位,dat22是高八位,0x24                                                                                // 是控制字,功能是设置显示地址
  14.                           if(mode)  n=0xf8;
  15.                                   else      n=0xf0;
  16.                           t=n|((~(x%8))&0x07);
  17.                           WriteCmd1(t);
  18. }
复制代码


======================================================================
下面就是我的疑惑了:
㈠dat11和dat22分别是显示地址的低8位和高8位,那么,这俩是怎么计算出来的?
㈡他这个n的值为什么分别去 0xf8 和0xf0?(这个也搞清楚了,是个和writecmd(t)命令有关,见附图)

我通过在keil中调试,观察内存单元,在主函数中的红色部分,当 x=0时,三条绘点命令为 :
       draw_dot( 0, 94, 1);
       draw_dot( 0, 47, 1);
       draw_dot( 0, 0, 1);
我观察了一下,相应的内存显示地址dat22 dat11(十六位地址)从上到下一次是0x0BC0, 0x05E0, 0x0000。我手算了一下,draw_dot( 0 , 0 , 1 ) 和draw_dot( 0 , 47, 1 ) 的行数差了48,每8行是在同一个page的,那(0,47)的点应该在第5个page,每个page是 240byte,(0,47)所在的显示内存的地址应该是 0x04B0啊,怎么会是0x05E0呢

最新回复

完整的程序在这儿: http://eda51.blog.hexun.com/8658091_d.html 太长了,贴不上来~~~  详情 回复 发表于 2008-7-30 11:56
点赞 关注

回复
举报

63

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
完整的程序在这儿: http://eda51.blog.hexun.com/8658091_d.html

太长了,贴不上来~~~
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表