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语言的表示有不同?
菜鸟求助了。。看不懂啊。。。