程序的模块化的一些见解5-移植性-实例说明

时间:2022-06-24 19:14:34
       我一直以来认为技术性的文档很重要,但事实上我做得不好,主要是我想做,但我做得不够仔细,不够清晰,不够完整。不过,我一直在改善着,希望各位多多指点。
  今天我想表达的是一个关于程序模块化的移植性,通过一个实例来描述。说得好,大家顶一下,说得不好,大家顶两下,嘻嘻。
       函数功能很简单:扫描LED  LED的显示有不亮、闪烁、常亮 3种方式,其中闪烁次数是有规定的,我的是3次(具体是 闪烁3次,周期是0.5秒,即亮0.25秒 灭0.25秒)

F_FlsLock = 1;//启动时闪烁3次
F_FlsLock =0; F_LockEn =0;//LED不亮
F_FlsLock = 0; F_LockEn =1;//LED常亮

这是我第一次写的程序,5毫秒扫描一次。

void LedLock(void)
{
	static uint8 TimeFlash = 0;//闪烁时间
	static uint8 FlashTimes = 0;//闪烁次数

	
	if(F_FlsLock)
	{
	  if(++TimeFlash <= 50)
	  {
	  	 P_LED = 1;
	  }
	  else if(++TimeFlash <= (100-1))
	  {
	  	  P_LED = 0;
	  }
	  else
	  {
	  	TimeFlash = 0;

		if(++FlashTimes >= 3)
		{
		  FlashTimes = 0;
		  F_FlsLock = 0;
		}

	  }
	}
	else
	{ 
	   
	   if(F_LockEn)
	   {
		P_LED = 1;
	   }
	   else
	   {
	       P_LED = 0;
	   }
	}
}


这是我第二次写的程序,5毫秒扫描一次。


void LedLock(void)
{
	static uint8 TimeFlash = 0;//闪烁时间
	static uint8 FlashTimes = 0;//闪烁次数

	if(F_FlsLock)
	{//需要闪烁
	  if(++TimeFlash <= 50)
	  {
	  	 F_LedLockEn = 0;
	  }
	  else if(++TimeFlash <= (100-1))
	  {
	  	 F_LedLockEn = 1;
	  }
	  else
	  {
	  	TimeFlash = 0;

		if(++FlashTimes >= 3)
		{
		  FlashTimes = 0;
		  F_FlsLock = 0;
		}

	  }
	}
	else
	{ 
	   F_LedLockEn = F_LockEn;
	}
}
//
	if(F_LedLockEn)
	{
	  	P_LED = 1;
	}
	else
	{
		P_LED = 0;
	}


表面可以看出,第2次的程序比第一次多了I个标志位F_LedLockEn 。

更深一点:如果这两个程序的移植性是那个好呢?这就是我今天主要说的,如果

这两个程序都用在一个相同的驱动电路,即VDD-LED-电阻-GND,那么
就没有什么区别。但如果用在复用,即按键和LED共用一个IO或者LED共
用COM,这时功能相同,LED驱动更改肯定要的,但判断是否显示和闪烁是
时间和次数可以不改,对此,如果抑制第一个程序,那得大改了,哈哈,
那又得浪费时间了,但第二个程序,只需要更改LED驱动方式,再通过
F_LedLockEn来确定是否亮与不亮即可。
总的来说,这里就是将判断LED是否亮的模块和LED驱动模块完全区分开,
这样,两个模块就可以单独移植和修改却不相互影响。


此篇见解至此已完,说得不好,欢迎扔砖。




点点滴滴的努力着!!!