@Xin
编程小结
标志位
利用标志位可以减少变量的声明,这样可以减少内存的使用。
实例:两个按键控制两个灯,A建按下切换是控制LED1还是LED2,B键切换LED亮灭。
假设0为灭,1为亮。
u8 flag_state = 0x00; //定义初始状态为0x00
#define state_1 0x00
#define state_2 0x10
#define state_3 0x01
#define state_4 0x11 //0x作为16进制,占四个位,这里是位4作为A键按下与否的标志位
//位0作为B键按下与否的标志位
这样就可以实现一个变量里面含有多个状态,可以减少程序的变量区的大小,做到储存变小的效果。
if(flag)判断flag是0还是非0,不仅仅是判断0和1。
比如flag为4,那么判断则是:4非0为真,则会执行下一条语句。
基本位运算
计算机中变量、函数等都会转换为0和1进行运算,在某些情况使用位运算可以极大的缩减代码,使代码变得简洁起来。
常见的位运算有:
运算符 | 作用 |
---|---|
! | 取反(只在0和非0中取反) |
I | 或(按位或) |
& | 与(按位与) |
` | 取反(按位取反) |
>> | 右移 |
<< | 左移 |
实例: 8个灯跑马灯的效果,第一个灯的地址为0x0100,后续每一个灯的地址为下一位。
u16 i ;
u32 j =0;
i = 0x0100;
while(1)
{
LED_Bit(i,0); //点亮i灯
for(j = 0;j < 800000;j++); //延时
LED_Bit(i,1); //熄灭i灯
if(i == 0x8000)
i = 0x0100;
else
i <<= 1; //左移灯
for(j = 0;j < 800000;j++);
}
一般是用|将某一位置或几个位置为1,其他位要为0;用&将某一位或几位清0,其他位为1。
取某一位或者几位用&取出即可,取出的相关位为1,其他位为0。
框架小技巧
对于有多种条件的情况,可以先处理特殊情况,然后一般情况在else里写,这样让逻辑更加清晰,更加易于维护;当然也可以先处理一般情况再对特殊情况进行处理。
实例: 时、分、秒的进位。
u8 sec,min,hour
sec = 59;
hour = 23;
min = 59; //初始值,下面的为sec加1该执行的操作
if(sec == 59)
{
sec = 0;
if(min == 59)
{
min = 0;
if(hour == 23)
hour =0;
else
hour++;
}
else
min++;
}
else
sec++;