单片机编程小技巧之宏三目运算符的巧用

关键词: C语言  keil 单片机 STM32

鹅鹅鹅,为什么我会想写这个文章呢????

因为最近要督促自己学习了,好吧也不废话了,开始上干货。

1.先看一段代码

这是一个9选1的舵机选择器,选中其中一个舵机,其中一个舵机转向90度,其他舵机保持不变,唉有人一想我用  if else 不是轻轻松松,不不不,我想你错了,这样写的代码很长可读性也很差,我也犯过这样的错误,下面是用switch语句来写的,是不是也很繁琐,更何况 if  else ,而且这里有一个编程的小知识点,很多人在争论if else 和 switch 那个好用,很多人说if else 啊,switch好维护,其实都有优缺点,我个人的建议是三个以上的判断用switch,三个以下及三个用if else,这是我在一本书上看到的,如果你觉得有用,就给我点个赞,没用就当我瞎扯淡。

/*
函数说明: 舵机 91 选择器
返回值: 无
*/
void Servo_91Selectors(uint8_t Random_Number)
{
	switch(Random_Number)
    	{
		case 1:
	    	Set_Servo_Angle(A1,90);
	   		Set_Servo_Angle(A2,0);
	   		Set_Servo_Angle(A3,0);
	
	   		Set_Servo_Angle(B1,0);
	   		Set_Servo_Angle(B2,0);
	   		Set_Servo_Angle(B3,0);
	
	   		Set_Servo_Angle(C1,0);
	   		Set_Servo_Angle(C2,0);
	   		Set_Servo_Angle(C3,0);
			break;
		case 2:
	    	Set_Servo_Angle(A1,0);
	   		Set_Servo_Angle(A2,90);
	   		Set_Servo_Angle(A3,0);
	
	   		Set_Servo_Angle(B1,0);
	   		Set_Servo_Angle(B2,0);
	   		Set_Servo_Angle(B3,0);
	
	   		Set_Servo_Angle(C1,0);
	   		Set_Servo_Angle(C2,0);
	   		Set_Servo_Angle(C3,0);
			break;
		此处省略一万行
		default :
			Set_Servo_Angle(A1,0);
	   		Set_Servo_Angle(A2,0);
	   		Set_Servo_Angle(A3,0);
	
	   		Set_Servo_Angle(B1,0);
	   		Set_Servo_Angle(B2,0);
	   		Set_Servo_Angle(B3,0);
	
	   		Set_Servo_Angle(C1,0);
	   		Set_Servo_Angle(C2,0);
	   		Set_Servo_Angle(C3,0);
			break;
	}
}

2.再看我一段代码

这是经过优化后的代码,利用了三目运算符来简化代码,增加可读性,减少了代码的重复性,更加简洁,这段代码先定义了两个宏,一个是选择状态(90度),一个是非选择状态(0度),这又是一个小技巧了,现实往往会因为每个人的安装方式不同(比如说开门,有些门能0到90为开和关,有些门因为安装的比较特殊,可以0到75度,可能是挡着了等等因素),选择和非选择的角度也不同,难道一个个改?显然是不可能的,改宏的值即可,这样就不用一个个改了。第二个就是三目运算符了,这是一个判断id 是否相等于随机数的宏,如果相等就给选择的舵机id输出90度,反之为0度。 

#define Initial_Angle   			    0
#define Angle_in_selection				90


#define Equal_To(id,Random_Number)     (id == Random_Number ? Angle_in_selection : Initial_Angle)
/*
函数说明: 舵机 91 选择器
返回值: 无
*/
void Servo_91Selectors(uint8_t Random_Number)
{
	static uint8_t a=0;
	Set_Servo_Angle(A1,a=Equal_To(DJ_A1,Random_Number));
	Set_Servo_Angle(A2,a=Equal_To(DJ_A2,Random_Number));
	Set_Servo_Angle(A3,a=Equal_To(DJ_A3,Random_Number));
	
	Set_Servo_Angle(B1,a=Equal_To(DJ_B1,Random_Number));
	Set_Servo_Angle(B2,a=Equal_To(DJ_B2,Random_Number));
	Set_Servo_Angle(B3,a=Equal_To(DJ_B3,Random_Number));
	
	Set_Servo_Angle(C1,a=Equal_To(DJ_C1,Random_Number));
	Set_Servo_Angle(C2,a=Equal_To(DJ_C2,Random_Number));
	Set_Servo_Angle(C3,a=Equal_To(DJ_A1,Random_Number));
}

 看不懂三目运算符的可以看这段代码

#define Equal_To(id,Random_Number)     (id == Random_Number ? Angle_in_selection : Initial_Angle)


if (id == Random_Number)
{
   return 90;
}
else
{
    return 0;
}

eee,到这里就结束了,离点灯大师又进了一步,哈哈哈哈哈哈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值