搜索
bottom↓
回复: 13

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

[复制链接]

出0入0汤圆

发表于 2013-2-4 17:42:34 | 显示全部楼层 |阅读模式
红色为我标注的问题



unsigned char PLAYBUF[64];


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口的规范更好,先谢谢了!

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

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入17汤圆

发表于 2013-2-4 17:46:33 | 显示全部楼层
这两行是干什么的?怕画点画出点阵的范围吗?
        if(y>=16) return; //这两行是干什么的?怕画点画出点阵的范围吗?嗯,是的
不是等于没移? 右边三位清零

出0入0汤圆

 楼主| 发表于 2013-2-4 19:34:41 | 显示全部楼层
请帮帮忙啊,挺急的

出0入0汤圆

发表于 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;
}

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

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

  24.         if ((X < X_MAX) && (Y < Y_MAX))
  25.         {
  26.                 switch (Color)
  27.                 {
  28.                         case 0:        dataR = LEDBUFFer[(Y*10) + (X/8)];
  29.                                         break;
  30.                         case 1: dataG = LEDBUFFer[(Y*10) + (X/8) + (Y_MAX * (X_MAX / 8))];
  31.                                         break;
  32.                         case 2: dataR = LEDBUFFer[(Y*10) + (X/8)];
  33.                                         dataG = LEDBUFFer[(Y*10) + (X/8) + (Y_MAX * (X_MAX / 8))];
  34.                                         break;
  35.                         default:
  36.                                 break;
  37.                 }
  38.                 Bite = 0x01 << (X >> 3); //Bite = 0x01 << (X%8);Bite = 0x01 << (X>>3);Bite = 0x01 << (X&0x07);
  39.                 switch (Color)
  40.                 {
  41.                         case 0: if (0 == bitHIGHorLOW)        {        dataR &= (~Bite);        }
  42.                                         if (1 == bitHIGHorLOW)        {        dataR |=   Bite ;        }
  43.                                         LEDBUFFer[(Y*10) + (X/8)] = dataR;
  44.                                         break;
  45.                         case 1: if (0 == bitHIGHorLOW)        {        dataG &= (~Bite);        }
  46.                                         if (1 == bitHIGHorLOW)        {        dataG |=   Bite ;        }
  47.                                         LEDBUFFer[(Y*10) + (X/8) + (Y_MAX * (X_MAX / 8))] = dataG;
  48.                                         break;
  49.                         case 2: if (0 == bitHIGHorLOW)       
  50.                                         {
  51.                                                 dataG &= (~Bite);
  52.                                                 dataR &= (~Bite);
  53.                                         }
  54.                                         if (1 == bitHIGHorLOW)       
  55.                                         {
  56.                                                 dataG |=   Bite ;
  57.                                                 dataR |=   Bite ;
  58.                                         }
  59.                                         LEDBUFFer[(Y*10) + (X/8)] = dataR;
  60.                                         LEDBUFFer[(Y*10) + (X/8) + (Y_MAX * (X_MAX / 8))] = dataG;
  61.                                         break;
  62.                         default:
  63.                                 break;
  64.                 }
  65.         }
  66. }
复制代码

出0入0汤圆

发表于 2013-2-4 23:04:42 | 显示全部楼层
12864吧?12864液晶第一行第一个的地址就是0x80.楼主看看12864的技术文档。

出0入17汤圆

发表于 2013-2-4 23:13:51 | 显示全部楼层
习学发开 发表于 2013-2-4 19:34
请帮帮忙啊,挺急的

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

出0入0汤圆

发表于 2013-2-4 23:18:40 | 显示全部楼层
proteldxp 发表于 2013-2-4 23:04
12864吧?12864液晶第一行第一个的地址就是0x80.楼主看看12864的技术文档。

明显是LED点阵屏的!!

出0入0汤圆

 楼主| 发表于 2013-2-5 09:44:39 | 显示全部楼层
HeP028 发表于 2013-2-4 22:56
void point(unsigned char x,unsigned char y,bit c)
{
        unsigned char i;

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

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

http://www.amobbs.com/forum.php? ... 8%E6%88%90%E5%8A%9F

出0入0汤圆

发表于 2013-2-5 13:13:55 | 显示全部楼层
是很基本的程序语句。实在看不懂的话,仿真一下。软仿真即可。

出0入0汤圆

 楼主| 发表于 2013-2-5 13:29:49 | 显示全部楼层
i_kkyu 发表于 2013-2-5 13:13
是很基本的程序语句。实在看不懂的话,仿真一下。软仿真即可。

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

出0入0汤圆

 楼主| 发表于 2013-2-5 13:30:48 | 显示全部楼层
本帖最后由 习学发开 于 2013-2-5 13:31 编辑
HeP028 发表于 2013-2-4 22:56
void point(unsigned char x,unsigned char y,bit c)
{
        unsigned char i;


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

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

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

望能相助!

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2013-2-5 14:08:53 | 显示全部楼层
如果你是单红色的话那么连接的时候ABCD是控制行的。  STB是锁存端口.CLK是时钟端口。R1是红色数据接口。OE是显示允许端口

出0入0汤圆

发表于 2013-2-5 14:13:11 | 显示全部楼层
习学发开 发表于 2013-2-5 13:30
你好!我又看了遍程序,现在发现一开始定义的PLAYBUFF[64]对应的是每一行要亮的led,问题是这个数组是如 ...

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

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-5-18 11:39

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

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