
小白求助,51单片机c语言用数组,指针实现倒计时,用pretues仿真无法实现功能,大神帮我看看这段程序
#define zero 0x40
#define one 0xF9
#define two 0xA4
#define three 0XB0
#define four 0x99
#define five 0x92
#define six 0x82
#define seven 0xF8
#define eight 0x80
#define nine 0x90
int a[10]={zero,one,two,three,four,five,six,seven,eight,nine},*p,n;
void delay(float t)
{
unsigned int j,i;
j=t*100;
while(j--)
{
for(i=1505;i;i--);
}
}
void main()
{ *p=&a[0];
while(1)
{
for(n=0;n>10;n++)
{P1=*(p+n);
delay(0.1);}
}
} 展开
程序中明显错误为三处,一一指出。
j=t*100;t是浮点型,100为整数型,运算时候会发生隐式类型转换,按照类型转换规则进行转换,具体规则我已经忘了,说下大概,浮点型t会被转换成整形进行运算,如不进行强制类型转换则,t被转换成了我们不期望看见的数。所以运算一定发生了问题,具体自己用c语言编译器printf就知道。
关于隐式类型转换看下这个:http://www.aidianying123.net/article/?41.html
*p=&a[0]; 指针使用错误,&a[0]确实取得了数组首地址,但是不应赋值给*p而是p,否则你的程序将会在单片机中跑飞,或者在操作系统中如windows上面出现内存不能为read字样
for(n=0;n>10;n++)该语句不会正确执行,因为条件不符合,应为n<10
正确的实例,并没有放在单片机上运行,用电脑模拟下,你可以从中提取程序格式写法和编程套路
#include<windows.h>
#include<stdio.h>
/*整理代替你的define部分 只是演示 */
int NumRegs[10]={0x40,0xF9,0xA4,0XB0,0x99,0x92,0x82,0xF8,0x80,0x90};
void DelayMs(int iMs)
{
while(iMs--)
{
/*单片机nop函数位置 或者其他*/
}
}
void PrintNum(iNum)
{
/*单片机对应 P1=NumRegs[iNum]*/
}
int main(void)
{
int num=0;
while(1)
{
DelayMs(500);
PrintNum(num++);
if(num==9)
num=0;
}
return 0;
}
-------------------------------------------------------------------------------------------
当然以后会遇到其他情况,如三位四位的数码管显示,虽然大家都不怎么用,我还是得提及用结构体,省的写一些简单的东西,别人花好长时间才把变量对号入座。
typedef struct
{
int Hundred;/*百位*/
int Ten;/*十位*/
int Abit;/*个位*/
}NUM_DISPALY_BUF_t;
void Fuc(NUM_DISPALY_BUF_t *p)
{
/*.....*/
}
void main(void)
{
NUM_DISPALY_BUF_t NumDBuf;
/*.....*/
Fuc(&NumDBuf);
/*.....*/
}
*p=&a[0]; 改成p=&a[0];或p&a;都行&a和&a[]都是指的a数组的首地址
*p是取指针指向地址的内容如x=*p
p=&a是吧a的地址存进指针变量。