5786|14

77

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

点阵液晶驱动的问题(基于RA8835)…… [复制链接]

小弟初识,描点函数W_DOT

void __fastcall TForm1:: W_DOT(int O_X,int O_Y)
  {
    unsigned char i,j,dat;
    unsigned int k;
      j=PARA;//PARA=0x30;
      i=O_X%8;
      O_X=O_X/8;
      k=j*O_Y+O_X+0x4000;  /* 显示一区所控制的显示屏行熟 如为320240屏k=j*O_Y+O_X+0x04ce*/
                            /*写入位地址的表达式*/
      i=7-i;
      O_Y=0x01 <       SendCommand( 0x43);  /* MREAD 代码 */
      SendCommand( 0x46);  /* 设置光标地址 */
      SendData( k%256);  /* 计算光标地址 */
      SendData( k/256);
      SendCommand( 0x42);  /* MWRITE 代码 */
      SendData(O_Y);  /* 写入合成数据 */
  }


读不懂求余运算在什么意思,以及k=j*O_Y+O_X+0x4000

(我为什么无权给更多的分了啊?)

最新回复

void __fastcall TForm1:: W_DOT(int O_X,int O_Y)   {     unsigned char i,j,dat;     unsigned int k;       j=PARA;       i=O_X%8;       O_X=O_X/8;       k=j*O_Y+O_X+0x4000;   /* 显示一区所控制的显示屏行熟 如为320240屏k=j*O_Y+O_X+0x04ce*/                             /*写入位地址的表达式*/        SendCommand( 0x4f);        SendCommand( 0x46);  /* 设置光标地址 */       SendData( k%256); /* 计算光标地址 */       SendData( k/256);       i=7-i;       O_Y=0x01  详情 回复 发表于 2009-8-3 17:05
点赞 关注

回复
举报

86

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
汗,没人知道么?
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
求余,可以是因为它一个字节显示8个点...
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

4
 
.............你这屏控制好麻烦...........
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

5
 
求余是因为你的点阵的每行的高度为8个点,以便一行一行的填充。
k=j*O_Y+O_X+0x4000; 这应该是在确定地址,好麻烦的公式。

强烈要求楼主好好看看《高质量C编程》
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

6
 
现在搞不懂的就是怎么确定的地址,k=j*O_Y+O_X+0x4000和k%256
相当无语中……
 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(初级)

7
 
void __fastcall TForm1::SendData(BYTE iData)
{
  DWORD  *buf = (DWORD  *)buffer;
  DWORD dwError,dWAddr;
  ULONG iReadNum;
  if ( PLX9054[0].hDevice != INVALID_HANDLE_VALUE ){
    ULONG nRead = 0;
    ULONG i;
    *buf = 0x1700 + iData;
    nRead = PLX9054[0].P9054_WriteBlockLocal (  0, buf, 4, 3);
    Sleep(0);
    *buf = 0x1300 + iData;
    nRead = PLX9054[0].P9054_WriteBlockLocal (  0, buf, 4, 3);
    Sleep(0);

    *buf = 0x1200 + iData;
    nRead = PLX9054[0].P9054_WriteBlockLocal (  0, buf, 4, 3);
    Sleep(0);
}




void __fastcall TForm1::SendCommand(BYTE iData)
{
  DWORD  *buf = (DWORD  *)buffer;
        DWORD dwError,dWAddr;
  ULONG iReadNum;
        if ( PLX9054[0].hDevice != INVALID_HANDLE_VALUE )
        {
                ULONG nRead = 0;
    ULONG i;
    *buf = 0x1f00 + iData;
    nRead = PLX9054[0].P9054_WriteBlockLocal (  0, buf, 4, 3);
    Sleep(1);
    *buf = 0x1B00 + iData;
    nRead = PLX9054[0].P9054_WriteBlockLocal (  0, buf, 4, 3);
    Sleep(1);

    *buf = 0x1A00 + iData;
    nRead = PLX9054[0].P9054_WriteBlockLocal (  0, buf, 4, 3);
    Sleep(2);
}
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

8
 
DWORD P9054_WriteBlockLocal (  DWORD dwLocalAddr, PVOID buf, DWORD dwBytes, P9054_MODE mode);
函数描述: 从局部总线写数据
参数   输入 DWORD dwLocalAddr   局部总线开始地址
       输入 PVOID buf   数据缓冲区地址
       输入 DWORD dwBytes   写的数据字节数
       输入 P9054_MODE mode

返回值   成功返回寄实际读的字节数



***********************************************************************/
DWORD TPLX9054::P9054_WriteBlockLocal (  DWORD dwLocalAddr, PVOID buf, DWORD dwBytes, P9054_MODE mode)

{
                                                // Count written to bufOutput

  ULONG InData[100];
        ULONG        nOutput = 0;
        //ULONG        nValue = -1;
//输入缓冲区 0 4字节  局部地址  1 4字节  读的长度  2 4字节  读的模式
  InData[0] = dwLocalAddr;
  InData[1] = dwBytes;
  InData[2] = (ULONG)mode;                                           //
        if ( !DeviceIoControl(hDevice, PLX9056_IOCTL_OutLocal        , InData, 4*sizeof(ULONG), buf, dwBytes, &nOutput, NULL) )
        {
                return -1;
        }
  else
  {

                        return  nOutput;
  }

}
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

9
 
目前已经知道:
       SendData( k%256);  /* 计算光标地址低字节 */
      SendData( k/256);  /* 计算光标地址高字节 */
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

10
 
k=j*O_Y+O_X+0x4000,这句的意思,很难理解,得借住数据手册才行。
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

11
 
引用 5 楼 spomu 的回复:
现在搞不懂的就是怎么确定的地址,k=j*O_Y+O_X+0x4000和k%256
相当无语中……


j=PARA=0x30=48

如果O_Y指的是列坐标,就是说一列有48行,如果是行坐标就是说一行有48列

先假设是列坐标,O_Y列的第一行地址是  (列)乘以(一列总行数),再加上O_X(行)就是当前坐标的地址,然后再加上显示区首地址就对应到显存地址了

0x4000应该是显示区的首地址,至于什么是显示区,怎样分配的,只能看数据手册

另外设计液晶显示程序必须搞清楚你的液晶是什么控制芯片,显存是如何对应屏幕上的点的
显存一个字节的数据显示在液晶上是横向8个点还是纵向8个点
如果搞不清楚这些,想显示汉字或者ASCII字符,怎么送字模
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

12
 
最近看手册看懂了,这个程序写的时候,设置屏幕行地址单元数是AP=0x30,屏幕地址是按字节行增长,满一行就跳行,所以首地址0x4000每加一个0x30相当于纵坐标加一,而加o_X/8,则是超过八个光标地址就加1,在一个字节内,描点是由 O_Y=0x01<
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

13
 
SendData( k%256);  
SendData( k/256);

无非是把计算出的屏幕光标地址k的高低字节分开……
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

14
 
引用楼主 spomu 的回复:
小弟初识,描点函数W_DOT

void __fastcall TForm1:: W_DOT(int O_X,int O_Y)  //这里的0_X,0_Y应该都是点坐标
? {
? ? unsigned char i,j,dat;
? ? unsigned int k;
? ? ? j=PARA;//PARA=0x30;
? ? ? i=O_X%8;
? ? ? O_X=O_X/8;           //点坐标转化成显示坐标(8个点的高度是一行)
? ? ? k=j*O_Y+O_X+0x4000;? /* 显示一区所控制的显示屏行熟 如为320240屏k=j*O_Y+O_X+0x04ce*/
? ? ? ? ? ? ? ? ? ? ? ? ? ? /*写入位地址的表达式*/
? ? ? i=7-i;                //一行8个点中的第几个点
? ? ? O_Y=0x01 < //不知道能不能省略i=7-i,此行换成0_Y=0x10>>i
? ? ? SendCommand( 0x43);? /* MREAD 代码 */  读液晶命令
? ? ? SendCommand( 0x46);? /* 设置光标地址 */设置显存指针命令
? ? ? SendData( k%256);? /* 计算光标地址 */显存指针低字节
? ? ? SendData( k/256);                    显存指针高字节
? ? ? SendCommand( 0x42);? /* MWRITE 代码 */写数据命令
? ? ? SendData(O_Y);? /* 写入合成数据 */写入液晶数据
? }


读不懂求余运算在什么意思,以及k=j*O_Y+O_X+0x4000

(我为什么无权给更多的分了啊?)


这个程序写的很外行
1.变量dat没用到,编译时是会warning的
2.设置了读数据命令,也设置了显存指针,但是没有读当前显存指针的语句,白白送了一次读数据命令


 
 
 

回复

54

帖子

0

TA的资源

一粒金砂(初级)

15
 
void __fastcall TForm1:: W_DOT(int O_X,int O_Y)
  {
    unsigned char i,j,dat;
    unsigned int k;
      j=PARA;
      i=O_X%8;
      O_X=O_X/8;
      k=j*O_Y+O_X+0x4000;   /* 显示一区所控制的显示屏行熟 如为320240屏k=j*O_Y+O_X+0x04ce*/
                            /*写入位地址的表达式*/
       SendCommand( 0x4f);
       SendCommand( 0x46);  /* 设置光标地址 */
      SendData( k%256); /* 计算光标地址 */
      SendData( k/256);
      i=7-i;
      O_Y=0x01<        SendCommand( 0x43);  /* MREAD 代码 */
      //dat=rdadd1;   /* 读取当前显示数据 */
       SendCommand( 0x46);  /* 设置光标地址 */
      SendData( k%256);  /* 计算光标地址 */
      SendData( k/256);
       SendCommand( 0x42);  /* MWRITE 代码 */
      SendData( dat|O_Y);  /* 写入合成数据 */
  }


本来是这样的,这个应该是从51的demo中一直的代码,所以rdadd1没定义,只有注销那句才能编译,现在遇到问题是不晓得怎么读取显示内容了,rdadd1对我没用
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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