论坛风格切换切换到宽版
  • 5584阅读
  • 23回复

51C的迷惑 [复制链接]

上一主题 下一主题
离线BG4UVR
发帖
11288
只看该作者 20楼 发表于: 2007-12-19
看来keil比gcc聪明
离线邓福强
发帖
34
只看该作者 21楼 发表于: 2007-12-19
初学者个人意见

首次通电是会闪-下,将改为以下程序,就不会每一次循环都会使P2口闪一下,主要是你的主程式终止了。你要在主程最后加一句while(1);。你的for也有问题。


#include <reg52.h>

void main()
{
unsigned char flw[]={0x0f,0xee,0xcc,0xf0};
unsigned char *fl;
unsigned int m;
while(1)
{
fl=&flw;
for(m=0;m<4;m++) //for(m=0;m<=3;m++)
{
p0=*fl;
mdelay(1000);
fl++;
}
}
}
离线xidongs
发帖
149
只看该作者 22楼 发表于: 2007-12-19
'
void main(void)
{
char i;
i=0;
while (i<10)
{
// place your code here
i+=1;
};
}
在KEIL中生成的汇编指令整理如下:
ljmp c:0003
c[表情] mov r0,#0x7f
clr a
c[表情] mov @r0,a
djnz r0,c:0006
mov sp,#0x07
ljmp main(c:000f)
main
c:000f:clr a
mov r7,a
c[表情]inc r7
cjne r7,#0x0a,c:0011
ret
可能是先入为主,年龄又大了,暑假前想学AVR和C,结果一头雾水,看似懂了一点,能编些简单的小程序,但一忙起来两个月后再看AVR又是茫然,想想是战略性失误,因为不熟悉AVR的硬件结构,拿51的思路去学AVR的C语言更是对不上号,最近几天回到51上来,经过包括丛老师在内的朋友们的指点和批评,显然又领悟了不少东西,现在能自己写些器件的应用文件,并引用到自己的编程实验代码中来,感到C的确比汇编功能强大,效率高!不过我还是感觉学生开头学某型号的汇编极为重要,不知道看法是否偏激?
'

我个人很赞同您的这个观点,从技术上来说,汇编语言和机器语言有一一对应关系,在编程语言极大发展的今天,汇编主要是用来调试程序和窥探某个程序到底做了什么,所以掌握汇编语言是极其有用的。我个人已经几年不用汇编写程序了,生疏了,但现在普通的还是可以看懂的,对调试程序有利。
离线xidongs
发帖
149
只看该作者 23楼 发表于: 2007-12-19
'
看了您的测试后,我也用winavr编译了一个简单的测试程序。经过查看汇编代码,结果和您所说的相同,即执行完主程序后,代码进入了一个跳转到本身地址的死循环。
但请注意,这只是一个跳转到本身地址的死循环,它并不会反复执行main函数。所以大家在写程序的时候,为了能使您的代码能一直按照你设计的逻辑工作,主程序循环,请一定要使用死循环。不然后果就是,每次上电,你的代码只执行一次,这实际正是我们大多数时候不想要的。
'

请注意,我并没有表达过主函数会反复执行的意思,具体要不要加例如

while(1)
{
;
}

这类循环的问题,要看程序具体是做什么的。
但可以明确的说,就楼主这个问题而言,应该加。