打印

求助,会C的帮忙看下,for循环的使用哪错了?

[复制链接]
楼主: 雷影少年
手机看帖
扫描二维码
随时随地手机跟帖
21
Wayner| | 2012-8-24 10:24 | 只看该作者 回帖奖励 |倒序浏览
i变量怎么变化的?另外你的编程字体很好看,能告诉我是什么字体吗?

使用特权

评论回复
22
雷影少年|  楼主 | 2012-8-24 11:10 | 只看该作者
22# Wayner
i=0x00时,i-1=oxff;若i是无符号数那么i就是255,若i是有符号数,i就是-1;编程的字体好像就是keil默认的字体

使用特权

评论回复
23
第二道彩虹| | 2012-8-24 11:33 | 只看该作者
本帖最后由 第二道彩虹 于 2012-8-24 11:37 编辑

:P

使用特权

评论回复
24
yejin1221| | 2012-8-24 11:38 | 只看该作者
j=5;j>=0;j-- 就会一直在这个循环里面  你的J肯定是unsigned char

使用特权

评论回复
25
zsyf0918| | 2012-8-24 12:18 | 只看该作者
会软仿吗?

使用特权

评论回复
26
@三月天| | 2012-8-24 12:56 | 只看该作者
for(j=5;j>=0;j--)
要改为
for(j=0;j<=5;j++)
然后再定义一个变量X,从5变到0,来控制循环。

使用特权

评论回复
27
古道热肠| | 2012-8-24 13:26 | 只看该作者
先把程序搞得正确,文档是只显示很少的字,比如4个字,然后扩展到16个字,如果只是速度跟不上,再做局部优化。

使用特权

评论回复
28
雷影少年|  楼主 | 2012-8-24 13:42 | 只看该作者
26# yejin1221
是的

使用特权

评论回复
29
雷影少年|  楼主 | 2012-8-24 13:44 | 只看该作者
for(j=5;j>=0;j--)
要改为
for(j=0;j
@三月天 发表于 2012-8-24 12:56

这样不行的,因为我要用j作为数组的坐标,j的顺序不能变

使用特权

评论回复
30
雷影少年|  楼主 | 2012-8-24 13:49 | 只看该作者
先把程序搞得正确,文档是只显示很少的字,比如4个字,然后扩展到16个字,如果只是速度跟不上,再做局部优化。
古道热肠 发表于 2012-8-24 13:26

试过了8个字以下(包括8个)完全没问题,一旦超过8个字,在移入第九个字是就会出现点阵全亮的现象;速度问题只会造成调用左移程序时间过长会是视觉暂留效果消失,屏幕出现闪烁现象,这个问题可以通过优化程序来提高程序速度。

使用特权

评论回复
31
雷影少年|  楼主 | 2012-8-24 13:50 | 只看该作者
27# zsyf0918
会proteus

使用特权

评论回复
32
lichuanfa| | 2012-8-24 15:55 | 只看该作者
5# 雷影少年 b
不奇怪,因为是unsigned char

使用特权

评论回复
33
雷影少年|  楼主 | 2012-8-24 15:57 | 只看该作者
34# lichuanfa
"8个字以下(包括8个)完全没问题,一旦超过8个字,在移入第九个字是就会出现点阵全亮的现象 "这是什么原因呢?

使用特权

评论回复
34
生气的小鸟| | 2012-8-24 16:59 | 只看该作者
找到原因了么

使用特权

评论回复
35
雷影少年|  楼主 | 2012-8-24 18:46 | 只看该作者
没~
我在试着让数组里的数在缓冲区移位,减少移位的时间,避免要显示的数据过多的时候出现闪烁现象

使用特权

评论回复
36
chenbb8| | 2012-8-24 19:17 | 只看该作者
本帖最后由 chenbb8 于 2012-8-24 19:20 编辑

虽然LZ的编程思路和一般人不一样,但是这个BUG还是来的很古怪,因此我也很感兴趣。昨晚洗完澡已经比较迟了,并且对于C51和LZ的硬件连接都不熟悉,精神也不在状态,所以放了LZ的鸽子。

今天在上网机上观察了下LZ的程序,应该没有使用专用的驱动芯片,也没有直接使用IO口驱动,
而是使用了一个叫595的数字芯片。
程序关键的zuoyi()也没发现明显的BUG。
因此偷偷的将LZ的程序拷贝的自己的电脑上分析。


将LZ程序中的seg数组和zuoyi()程序复制到DEV-C++(GCC)这个IDE上。
取消xdata声明,因为GCC没有这些奇怪的声明,并填充22个这样的字模:
{0x40,0x00,0x50,0x00,0x48,0x3F,0x48,0x00,0x40,0x00,0xFE,0xFF,0x40,0x00,0x40,0x04,
              0x40,0x04,0x40,0x27,0x20,0x24,0x22,0x24,0x12,0x24,0x8A,0x27,0x06,0xF8,0x02,0x40},
然后将zuoyi()函数修改如下:(内部电脑的数据传输到上位机上要经过很复杂的审批,所以下面的修改是在上网机上改的
,因为没有编译器检查,也许会出现语法上的错误。另外建议LZ不要用大小写来区分变量,今天我的状态也不好,看的晕忽忽的)
void zuoyi()
{
       u8        i,j;
       u8        Bit,BIT; //定义两个位,保存移位时CY的数据
        for(i=0;i<16;i++)
        {
               Bit=BIT=0;
               for(j=22;j>0;j--)
               {

                       Bit = seg[j-1][2*i] & 0x80;                         //记录最高位
                        seg[j-1][2*i] <<= 1;                                  //左移将最高位移入CY
                        if( BIT != 0 )  seg[j-1][2*i] |= 0x01;              //将上次移出的最高位移放到最低位


                        BIT = seg[j-1][2*i+1] & 0x80;                     //记录最高位
                        seg[j-1][2*i+1]  <<= 1;                              //左移将最高位移入CY
                        if( Bit != 0 )  seg[j-1][2*i+1] |= 1;               //将上次移出的最高位移放到最低位
                }
               seg[21][2*i]=seg[21][2*i]|BIT;                  //在循环结束后将最后一次移位时的CY做第一次移位的最低位
                                                                                           //完成一行字模的一次移位
        }
}
然后在主函数中调用10次,每次调用完都将第一个字模的32个元素用printf函数打印出来。结果同样是没发现毛病,顺利的位移了。
然后又做了以下的修改,看不懂也没关系。我只是用来看下可不可以优化,等编好后才记起来:我没办法通过DEV-C++测试优化程度,在单片机里面都还可以
用定时器计算运算时间的~不过也是没有问题。
void zuoyi111()
{
        u8        i,j;
        u8        Bit,BIT; //定义两个位,保存移位时CY的数据asd

         u8        (*p)[32] = &seg[21];      //定义一个指向Seg数组第21行的指针数组
        for (i=0;i<16;i++)
        {
                Bit=BIT=0;

                p = &seg[21];
                for(j=22;j>0;j--)
                {

                       Bit = (*p) [2*i] & 0x80;                         //记录最高位
                        (*p) [2*i] <<= 1;                                  //左移将最高位移入CY
                        if( BIT != 0 )  (*p) [2*i] |= 0x01;              //将上次移出的最高位移放到最低位


                        BIT = (*p) [2*i+1] & 0x80;                     //记录最高位
                        (*p) [2*i+1]  <<= 1;                              //左移将最高位移入CY
                        if( Bit != 0 )  (*p) [2*i+1] |= 1;               //将上次移出的最高位移放到最低位



                        p--;    //指向上一行
                 }
                seg[21][2*i]=seg[21][2*i]|BIT;                    //在循环结束后将最后一次移位时的CY做第一次移位的最低位
                                                                                                //完成一行字模的一次移位
        }
}


LZ还是先将你自己的zuoyi()先调用10次,再使用595显示出来看下效果。如果没有问题的话就是别的地方导致的。


我在开始的时候说LZ的编程思路和别人不一样,原因是一般人都不会这样整个位移字模- -!!
一般人会将字模弄成code型,然后在读取需要用到的部分到内存的一个缓冲区中做位移,这样字模就是不会被破坏掉,并且由于只位移了感兴趣的部分,所以速度快。

思想灵活点的人会模糊掉行列的概念,凭什么一定要老老实实的往SEG发送行?发送列不行么?只要取模软件支持就行了。
这样的话可以省去位移这步,利用一个指针uint16_t *p = (uint16_t)&seg[0][0];将二唯数组当做一唯的来用,
并利用滑动滤波的相关概念,直接移动一个列指针就完事了。
LZ自己慢慢思考~今晚我不留下来加班了,我要去网吧玩游戏,周末晚上是本光棍唯一的休息时间,闪

使用特权

评论回复
37
雷影少年|  楼主 | 2012-8-24 20:00 | 只看该作者
这是通过对楼上各位DX指点后修改的zuoyi程序
void zuoyi()
{
        char        i,j;
        u8         temp0,temp1;
        bit        Bit,Bit0; //定义两个位,保存移位时CY的数据
        for (i=0;i<16;i++)
        {
                Bit=Bit0=0;
                temp0=2*i;
                temp1=temp0+1;
                for(j=21;j>=0;j--)
                {
                        seg[j][temp0]=seg[j][temp0]<<1;                   //左移将最高位移入CY
                        Bit=CY;                                                           //保存CY,
                        seg[j][temp0]=seg[j][temp0]|Bit0;           //将上次移出的最高位移放到最低位
                        seg[j][temp1]=seg[j][temp1]<<1;           //左移将最高位移入CY
                        Bit0=CY;                                                           //保存CY
                        seg[j][temp1]=seg[j][temp1]|Bit;   //将上次移出的最高位移放到最低位
                 }
                seg[21][temp0]=seg[21][temp0]|Bit0;                    //在循环结束后将最后一次移位时的CY做第一次移位的最低位
                                                                                                //完成一行字模的一次移位
        }
}
将左移程序执行的时间从80ms降到了50ms,但是依旧有闪烁现象,也没有解决“当数组中的汉字字模超过8个字,在移入第九个字是就会出现点阵全亮的现象 "
所以我就想建1缓冲来存即将参与移位的数据,程序个把小时就敲出来了,一次编译通过,下载到板子上发现只有右半侧的点阵能够显示,且显示几秒钟后全灭,找了一几个小时bug也没找出错在哪,纠结~
至于利用指针来调用二维数组那是我将所有bug全部干掉后的下一步计划,因为我写程序几乎没有用过指针,对指针的使用还处于纸上谈兵阶段,我要先尽可能保证程序因指针之外的原因产生BUG。

使用特权

评论回复
38
chenbb8| | 2012-8-24 20:24 | 只看该作者
你将我给的zuoyi()和 zuoyi111()代入到自己的工程中看下.
做成下面的形式:
main()
{
......
zuoyi();

zuoyi();

zuoyi();

zuoyi();

zuoyi();

zuoyi();

zuoyi();

zuoyi();

zuoyi();

zuoyi();

while (1)
{
                        for (i=0;i<16;i++)

                        {

                                write(~seg[0][2*i]);                          //第i行字模写入595

                                write(~seg[0][2*i+1]);

                                LINE=i;                                                  //选择第i行

                                STB=1;

                                STB=0;                                                  //显示

                         }


}
}

使用特权

评论回复
39
雷影少年|  楼主 | 2012-8-25 08:09 | 只看该作者
嗯~
试试看

使用特权

评论回复
40
雷影少年|  楼主 | 2012-8-25 10:46 | 只看该作者
我加了个缓冲区,总算做出来了,O(∩_∩)O谢谢各位dx的指点。
待我优化下代码再发上来请各位DX拍砖。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则