您的位置: OpenADSP社区论坛 -> Blackfin专区 -> 新手上路 -> [求助]关于ADSP-EDU-BF592的BF592_LED8_4程... 
本帖共有506个阅读者
发表帖子 发表投票 回复主题
[求助]关于ADSP-EDU-BF592的BF592_LED8_4程序中的一个问题
下划线(论坛新手)
下划线
头衔:社区公民
帮派:无帮无派
帖数:12
金钱:233
积分:19
注册时间:2013/9/2
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
[求助]关于ADSP-EDU-BF592的BF592_LED8_4程序中的一个问题
led8.c文件
#include <cdefBF592-A.h>
#include <ccblkfn.h>
#include "cpu.h"
#define LATCH1 PG8
#define LATCH2 PG9
unsigned char DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9
unsigned char WeiMa[]={0xf7,0xfb,0xfd,0xfe,0x7f,0xbf,0xdf,0xef};//分别对应相应的数码管点亮,即位码
unsigned char TempData[8]; //存储显示值的全局变量
/*------------------------------------------------
显示函数,用于动态扫描数码管
输入参数 FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示
如输入0表示从第一个显示。
Num表示需要显示的位数,如需要显示99两位数值则该值输入2
------------------------------------------------*/
void Display(unsigned char FirstBit,unsigned char Num)
{
unsigned char i;   
for(i=0;i<Num;i++)
{
   *pPORTGIO &= 0x00;   //清空数据,防止有交替重影
   *pPORTGIO_SET = LATCH1;     
   *pPORTGIO_CLEAR =LATCH1;
       *pPORTGIO |= WeiMa[i+FirstBit]; //取位码
   *pPORTGIO_SET = LATCH2;     
   *pPORTGIO_CLEAR =LATCH2;
       *pPORTGIO &= 0x00;
       *pPORTGIO |= TempData[i]; //取显示数据,段码
   *pPORTGIO_SET = LATCH1;     
   *pPORTGIO_CLEAR =LATCH1;    
   Delay(3000); // 扫描间隙延时,时间太长会闪烁,太短会造成重影
    }
}
main.c文件
#include <cdefBF592-A.h>
#include <ccblkfn.h>
#include "cpu.h"
#include "led8.h"

/*------------------主函数---------------------*/
main()
{
unsigned int i=0,k=0,j=0;
unsigned char s;
Set_PLL(16,4); //内核时钟:25MHz*16=400MHz,系统时钟:400MHz/4=100MHz
Init_gpio();        //初始化GPIO口
while(1)
    {
j++;
if(j==200)  
{
j=0;
if(0==k)
     {
     for(s=0;s<8;s++) //完全循环完成后清零所有缓冲区
TempData[s]=0;
   }
           TempData[8-i]=DuanMa[k]; //把需要显示的字符依次送缓冲区
           TempData[8+1-i]=0;  //不需要显示的区域清零
   if(i==(8-k))
    {
    i=0;
            k++;
if(k==8)
k=0;
}
   i++;
}
   Display(0,8);//从第一位显示,共显示8位
}
}
    红色的地方,是我不懂的地方。
    既然led8.c中已经定义了tempdata[8]是个有8个元素的一维数组。为什么 TempData[8-i]=DuanMa[k]; //把需要显示的字符依次送缓冲区
           TempData[8+1-i]=0;  //不需要显示的区域清零
中,如果刚开始i=0,那么tempdata[8]=duanma[0],那岂不是tempdata是九个元素的一维数组了。而且TempData[8+1-i]=0,这句岂不是成了tempdata[9]=0了。。还是说。。这两句话与c语言的表示有不同?
菜鸟求助了。。看不懂啊。。。

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2014/10/19 22:39:24
下划线(论坛新手)
下划线
头衔:社区公民
帮派:无帮无派
帖数:12
金钱:233
积分:19
注册时间:2013/9/2
1信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
刚才拿开发板试了一下。。unsigned char TempData[8]; //存储显示值的全局变量

不论是【8】或者【10】或者【1】都可以正确运行。
是不是说。给全局变量tempdata分配内存的时候,固定分配了几个字节,有些虽然没定义,但是是空的。是可以使用的。。

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2014/10/20 11:54:09
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
2信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
从严格的C语言角度,数组肯定溢出了,但编译器会从指针角度去考虑,溢出的数组地址会超出定义的数组范围,自动向后延续,所以代码没有报错。
实际上不建议这样用,这样可能会造成与其他定义的变量冲突。
谢谢你细心发现。

这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2014/10/24 23:14:38
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.160073 Call, 1 Queries, Processed in 0.031250 second(s),