星星点灯(一)-LED点灯初阶

是不是大多数学习单片机开发的人都是从一个点亮LED的程序开始的?你也是从这里开始掉进坑里的?
what?如此简单,还有坑,我不信!
不急,容我慢慢给你道来,把这个简单的LED点灯程序给你分析一下,看看我们在那些地方踩了坑,而自己还一无所知。同时,我们使用两种进阶的方式,来告诉你正确的点灯姿势,最后你将学会如何大气磅礴的设计出高效率的,模块化的,移植性强的点灯程序。
要点亮一颗二颗…N颗LED,我们需要完成以下基本步骤:

  1. 建立一个工程,编译通过,并且正确的运行到int main(void)程序的开始。参考《快速搭建最小Keil MDK最小开发环境》
  2. 灯是通过I/O口来控制的,所以要初始化对应的I/O口(CTRL+C来的__)。
  3. 然后调用点亮LED灯的语句(第一个坑)
  4. 为了让灯看起来闪闪发光,需要眨巴眨巴几下,那就需要开一会,关一会,也就是延时(第二个坑)。
  5. 要点亮更多的灯,你需要定义更多的点亮LED的语句(第三个坑)
  6. 好了,现在我们要玩流水灯了,不同的花样,不同的闪烁方式,你傻眼了,这咋搞啊?程序如果完善,如何移植啊?一顿CTRL+C,CTRL+V,终于堆砌出来了,已经是大汗淋漓了。(第四个坑)
  7. 不好意思,老板心情不好,说再增加几个灯,多玩几个花样。Oh,my god,不行了,不行了。。。
    后面所有的代码都以STM32F103VCT6芯片为操作对象,其他芯片自行移植参考。
    最后代码大概是这样子的:
#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)
	{
		LEDON
		Delay500ms();
		LEDOFF
		Delay500ms();
	}
}

嗯,看起来没有毛病,中规中矩,嘿,我也是这样开始的。
挑一挑毛病:
1.LEDON: 这个东西放在代码中,显得有点不伦不类的。我们知道,C语言的一条语句都是以分号’;’结束的,这个定义放在这里是不是看起来特别别扭???是宏吗?是缺少了结束的分号’;’吗?总总疑惑搞得脑门子冒汗!!!!!
2. Delay500ms():使用软件延时没有错,但是我们要延时200ms呢?再写一个函数?
我们是不是应该把延时时间作为一个参数传递进去?写一个诸如void delay(int ms)的函数来提供调用?
3. IO口的初始化究竟要做哪些工作?一脸懵逼,他们都没有告诉你?都是copy过来的?
4. 现在我们要控制更多的LED,再定义一堆宏吗?不累死你才怪。
如何来解决这些看起来很简单和低级的问题?其实,这涉及到一个良好的编码习惯的养成,还有涉及思维的改变,模块化,可移植性开发思维和模式的建立。冰冻三尺非一日之寒,万丈高楼平地起,我们下一章就从这个简单的例子开始来学习如何设计看起来优雅而且高效的代码,并且具有极好的模块化和可移植性,可以面对老板的朝令夕改的挑战。
原创文章,欢迎转载,请注明来源,未经书面允许,请勿用于商业用途。
在这里插入图片描述

发布了18 篇原创文章 · 获赞 7 · 访问量 5656

猜你喜欢

转载自blog.csdn.net/huangbinvip/article/details/104910962