是不是大多数学习单片机开发的人都是从一个点亮LED的程序开始的?你也是从这里开始掉进坑里的?
what?如此简单,还有坑,我不信!
不急,容我慢慢给你道来,把这个简单的LED点灯程序给你分析一下,看看我们在那些地方踩了坑,而自己还一无所知。同时,我们使用两种进阶的方式,来告诉你正确的点灯姿势,最后你将学会如何大气磅礴的设计出高效率的,模块化的,移植性强的点灯程序。
要点亮一颗二颗…N颗LED,我们需要完成以下基本步骤:
#define LEDON GPIOB->BRR = GPIO_Pin_14;
#define LEDOFF GPIOB->BSRR = GPIO_Pin_14;
void main(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_Init(GPIOB, &GPIO_InitStructure); while(1){LEDONDelay500ms();LEDOFFDelay500ms();}
}
嗯,看起来没有毛病,中规中矩,嘿,我也是这样开始的。
挑一挑毛病:
1.LEDON: 这个东西放在代码中,显得有点不伦不类的。我们知道,C语言的一条语句都是以分号’;’结束的,这个定义放在这里是不是看起来特别别扭???是宏吗?是缺少了结束的分号’;’吗?总总疑惑搞得脑门子冒汗!!!!!
2. Delay500ms():使用软件延时没有错,但是我们要延时200ms呢?再写一个函数?
我们是不是应该把延时时间作为一个参数传递进去?写一个诸如void delay(int ms)的函数来提供调用?
3. IO口的初始化究竟要做哪些工作?一脸懵逼,他们都没有告诉你?都是copy过来的?
4. 现在我们要控制更多的LED,再定义一堆宏吗?不累死你才怪。
如何来解决这些看起来很简单和低级的问题?其实,这涉及到一个良好的编码习惯的养成,还有涉及思维的改变,模块化,可移植性开发思维和模式的建立。冰冻三尺非一日之寒,万丈高楼平地起,我们下一章就从这个简单的例子开始来学习如何设计看起来优雅而且高效的代码,并且具有极好的模块化和可移植性,可以面对老板的朝令夕改的挑战。
原创文章,欢迎转载,请注明来源,未经书面允许,请勿用于商业用途。
本文发布于:2024-01-31 04:44:52,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170664749325592.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |