kmsj 发表于 2022-6-21 23:28 肯定是一个模块一个.C文件这样写更方便,需要哪个模块直接复制过来改一下配置 |
天ノ忆 发表于 2022-6-21 17:17 目前只有一个c文件够用了,以前程序越编越长,觉得可以分成几个模块就好了,后来发现Keil有折叠功能,我把所有程序折叠起来,需要修改哪个打开哪个,我现在编的程序不复杂,不到2000行,等到折叠都很麻烦的时候再考虑分成几个模块。 |
kmsj 发表于 2022-6-18 12:29 你的程序肯定只有一个.c文件吧 |
现在可以了,麻烦了。 |
51520 发表于 2022-6-18 12:32 你的Delay(100);是延长100us吗?如果是的话你的程序其实已经实现了流水灯的效果,只是你的眼睛不行没有看出来而已。 |
你这个是函数外的赋值代码,当然报错了。 |
51520 发表于 2022-6-18 12:32
|
kmsj 发表于 2022-6-18 12:29 学习了,学习了。出现了语法上的错误。 |
wulin 发表于 2022-6-18 07:15 那顺便帮我看下下面的代码: P1 = 0Xfe; while(1) { P1= _crol_(P1,1); Delay(100); } 为什么这个代码没有流水的效果? 我的理解是每一次循环P1里面的位都向左移一位,不知道我的理解是不是错误. 如:第一次循环后:P1 是1111 1101 第二次循环后:P1 是1111 1011 然后以此类推,产生流水的效果。 实际过程中,第一个灯亮后,第二个灯亮,然后就一直停留在第二个灯亮,第三个灯不亮,后面的灯也不亮。 下面的代码可以实现流水灯: P1 = 0xFE; while(1) { for(k = 0;k < 8;k++) { P1= _crol_(P1,1); Delay(100); } } |
这是楼主编程不规范造成的,按照我自己的理解,标准的单片机C语言,第一句是头文件,头文件到主函数之间是库文件、常量、变量、子函数声明定义、以及各种数组之类的定义,中断函数和所有子函数必须放在主函数之后,主函数之前定义的变量是全局变量,子函数内部定义的变量是局部变量,我就是这样编所有的单片机程序,所以这方面我基本没有出过问题,有人为了偷懒,把子函数放在主函数之前,免去了函数声明之类的语句,我觉得看着就不舒服,程序就像倒着放一样,P1=0xfe,这已经是实质性的赋值运算语句,怎么能放在主函数前面? |
雪玉寐影 发表于 2022-6-18 00:51 尝试了,编译通过不了。 |
aide51 发表于 2022-6-18 09:51 1.在keil软件尝试了一下,编译不通过。 2.sbit是对位进行操作的,而且是对于能位操作的寄存器才能使用。 如P1^1 = 0XFE; 这样是没有问题的 |
在主函数外要声明 sbit P1 = 0xFE; |
P1已经在头文件中被定义为寄存器的地址名:sfr P1 = 0x90;。在函数外写P1=0xfe;被编译器当变量处理当然出现语法错误。在函数内写P1=0xfe;实际是把0xfe写入地址0x90的寄存器。 |
放在main()函数前要显性指明sfr: sfr P1=0xFE; |