|
我这个显示屏的控制器是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仿真过了,能绘点):
- 函数原型: void draw_dot(x,y)
- 功 能; T6963屏上打点
- 入口参数: 横坐标(x),枞坐标(y)
- 出口参数:
- ********************************************************************************/
- void draw_dot( uchar x, uchar y, uchar mode)
- {
- uchar dat11,dat22;
- uchar n,t;
- dat11=(y*32)%256 +x/8;
- dat22=(y*32)/256;
- delay(20);
- WriteCmd3( dat11, dat22, 0x24); // dat11是地址低八位,dat22是高八位,0x24 // 是控制字,功能是设置显示地址
- if(mode) n=0xf8;
- else n=0xf0;
- t=n|((~(x%8))&0x07);
- WriteCmd1(t);
- }
复制代码
======================================================================
下面就是我的疑惑了:
㈠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呢
|
|