习学发开 发表于 2013-2-4 17:42:34

请问这段控制单元板的函数什么意思?

红色为我标注的问题



unsigned char PLAYBUF;


void point(unsigned char x,unsigned char y,bit c)
{
        unsigned char i;

        if(x>=32) return; //这两行是干什么的?怕画点画出点阵的范围吗?
        if(y>=16) return; //这两行是干什么的?怕画点画出点阵的范围吗?
        i=0x80; //这个变量准备干啥?
        i>>=x-((x>>3)<<3); //这是干什么的?为什么先向右移,又向左移?不是等于没移?

        if(c)
                PLAYBUF[(y<<1)+((x>>4)<<5)+((x>>3)&0x01)] |= i;//这句彻底看不懂...
        else
                PLAYBUF[(y<<1)+((x>>4)<<5)+((x>>3)&0x01)] &= ~i;
}




问题挺多的,请各位高人赐教!给08口的规范更好,先谢谢了!

hhxb 发表于 2013-2-4 17:46:33

这两行是干什么的?怕画点画出点阵的范围吗?
      if(y>=16) return; //这两行是干什么的?怕画点画出点阵的范围吗?嗯,是的
不是等于没移? 右边三位清零

习学发开 发表于 2013-2-4 19:34:41

请帮帮忙啊,挺急的

HeP028 发表于 2013-2-4 22:56:55

本帖最后由 HeP028 于 2013-2-4 23:24 编辑

void point(unsigned char x,unsigned char y,bit c)
{
      unsigned char i;
      if(x>=32) return; //这两行是干什么的?怕画点画出点阵的范围吗?
      if(y>=16) return; //这两行是干什么的?怕画点画出点阵的范围吗?(你说的对)
      i=0x80; //这个变量准备干啥?(这个是准备进行移位的值)
      i>>=x-((x>>3)<<3); //这是干什么的?为什么先向右移,又向左移?不是等于没移??(这个是计算到底是第Y行的第X位)


      if(c)
                PLAYBUF[(y<<1)+((x>>4)<<5)+((x>>3)&0x01)] |= i;//这句彻底看不懂...(根据C的值来让Y行X位亮与不亮)
      else
                PLAYBUF[(y<<1)+((x>>4)<<5)+((x>>3)&0x01)] &= ~i;
}

、、把全部程序发上来研究研究啊

你的程序跟下面这段差不多,不过我这个是双色的。/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Function      :void LEDWritePoint(unsigned char X,unsigned char Y,unsigned char Color,unsigned char bitHIGHorLOW)
* Description   :函数功能、性能描述
* Calls         :被本函数调用的函数清单
* Called By   :调用本函数的函数清单
* Table accessed:被访问的表(数据库操作用)
* Tabled Updated:被修改的表(数据库操作用)
* Input         :输入参数、取值说明与关系
* Output      :输出参数、类型说明
* Return      :函数返回值说明
* Others      :(Screen sequence)
*                                       X1 ·····→X10
*                                  ·                        ·
*                                      ↓                          ↓
*                                      ·                          ·
*                                        Y32·····→Y32                       
*              
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void LEDWritePoint(unsigned char X,unsigned char Y,unsigned char Color,unsigned char bitHIGHorLOW)
{
        unsigned char dataR = 0x00;
        unsigned char dataG = 0x00;
        unsigned char Bite= 0x00;

        if ((X < X_MAX) && (Y < Y_MAX))
        {
                switch (Color)
                {
                        case 0:        dataR = LEDBUFFer[(Y*10) + (X/8)];
                                        break;
                        case 1: dataG = LEDBUFFer[(Y*10) + (X/8) + (Y_MAX * (X_MAX / 8))];
                                        break;
                        case 2: dataR = LEDBUFFer[(Y*10) + (X/8)];
                                        dataG = LEDBUFFer[(Y*10) + (X/8) + (Y_MAX * (X_MAX / 8))];
                                        break;
                        default:
                                break;
                }
                Bite = 0x01 << (X >> 3); //Bite = 0x01 << (X%8);Bite = 0x01 << (X>>3);Bite = 0x01 << (X&0x07);
                switch (Color)
                {
                        case 0: if (0 == bitHIGHorLOW)        {        dataR &= (~Bite);        }
                                        if (1 == bitHIGHorLOW)        {        dataR |=   Bite ;        }
                                        LEDBUFFer[(Y*10) + (X/8)] = dataR;
                                        break;
                        case 1: if (0 == bitHIGHorLOW)        {        dataG &= (~Bite);        }
                                        if (1 == bitHIGHorLOW)        {        dataG |=   Bite ;        }
                                        LEDBUFFer[(Y*10) + (X/8) + (Y_MAX * (X_MAX / 8))] = dataG;
                                        break;
                        case 2: if (0 == bitHIGHorLOW)       
                                        {
                                                dataG &= (~Bite);
                                                dataR &= (~Bite);
                                        }
                                        if (1 == bitHIGHorLOW)       
                                        {
                                                dataG |=   Bite ;
                                                dataR |=   Bite ;
                                        }
                                        LEDBUFFer[(Y*10) + (X/8)] = dataR;
                                        LEDBUFFer[(Y*10) + (X/8) + (Y_MAX * (X_MAX / 8))] = dataG;
                                        break;
                        default:
                                break;
                }
        }
}

proteldxp 发表于 2013-2-4 23:04:42

12864吧?12864液晶第一行第一个的地址就是0x80.楼主看看12864的技术文档。

hhxb 发表于 2013-2-4 23:13:51

习学发开 发表于 2013-2-4 19:34 static/image/common/back.gif
请帮帮忙啊,挺急的

帮得了这次,帮不了下次,C语言操作符就那几个,自己推敲一下就明白了

HeP028 发表于 2013-2-4 23:18:40

proteldxp 发表于 2013-2-4 23:04 static/image/common/back.gif
12864吧?12864液晶第一行第一个的地址就是0x80.楼主看看12864的技术文档。

明显是LED点阵屏的!!

习学发开 发表于 2013-2-5 09:44:39

HeP028 发表于 2013-2-4 22:56 static/image/common/back.gif
void point(unsigned char x,unsigned char y,bit c)
{
      unsigned char i;


虽然没有解决偶的问题,但是还是非常感谢你的帮助!希望能再帮帮我。

程序不是我写的,我不敢贴,但是链接可以给你,也是我们坛子上的:

http://www.amobbs.com/forum.php?mod=viewthread&tid=4475654&highlight=P10%E5%8D%95%E5%85%83%E6%9D%BF%E9%A9%B1%E5%8A%A8%E6%88%90%E5%8A%9F

i_kkyu 发表于 2013-2-5 13:13:55

是很基本的程序语句。实在看不懂的话,仿真一下。软仿真即可。

习学发开 发表于 2013-2-5 13:29:49

i_kkyu 发表于 2013-2-5 13:13 static/image/common/back.gif
是很基本的程序语句。实在看不懂的话,仿真一下。软仿真即可。

语句看懂了,可惜带来的效果不知道。现在我搞不清硬件输出情况是怎么样的。这个画点的函数怎么和led显示对应起来。

习学发开 发表于 2013-2-5 13:30:48

本帖最后由 习学发开 于 2013-2-5 13:31 编辑

HeP028 发表于 2013-2-4 22:56 static/image/common/back.gif
void point(unsigned char x,unsigned char y,bit c)
{
      unsigned char i;


你好!我又看了遍程序,现在发现一开始定义的PLAYBUFF对应的是每一行要亮的led,问题是这个数组是如何跟接口对应上的?或者说,这怎么体现到单元板上?

另外能否告诉我08口的各脚定义?

ABCD是对应的LED点;
STB是什么?
CLK又是啥?
OE?
G1、G2、R1、R2这些是双色才要都连的吧?但是为什么同是有两个?
单色屏是不是只要连R1即可?

望能相助!

HeP028 发表于 2013-2-5 14:08:53

如果你是单红色的话那么连接的时候ABCD是控制行的。STB是锁存端口.CLK是时钟端口。R1是红色数据接口。OE是显示允许端口

HeP028 发表于 2013-2-5 14:13:11

习学发开 发表于 2013-2-5 13:30 static/image/common/back.gif
你好!我又看了遍程序,现在发现一开始定义的PLAYBUFF对应的是每一行要亮的led,问题是这个数组是如 ...

如果你是单红色的话那么连接的时候ABCD是控制行的。STB是锁存端口.CLK是时钟端口。R1是红色数据接口。OE是显示允许端口

logsoft 发表于 2013-2-10 15:18:58

i>>=x-((x>>3)<<3); //这是干什么的?为什么先向右移,又向左移?不是等于没移?
//x-((x>>3)<<3)可以看成x%8,x>>3 即x/8求商,商<<3即 商*8,即x在最后一个字节中的位置,现在明白了吧?
PLAYBUF[(y<<1)+((x>>4)<<5)+((x>>3)&0x01)] |= i;//这句彻底看不懂...
//(y<<1)+((x>>4)<<5)+((x>>3)&0x01)计算x,y对应的位置在playbuf中的字节数。
if这两句,一句是点亮,一句是清除。
页: [1]
查看完整版本: 请问这段控制单元板的函数什么意思?