微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 常用性便携语法语句使用

常用性便携语法语句使用

时间:10-02 整理:3721RD 点击:
/******************************程序编写者:周朝辉***************************/
对于熟练的家电开发程序员来说都知道,有一些便携性的语法使用习惯和技巧,可以非常方便的提高程序代码开发效率,在此我会将一些非常典型的语法列示出来并加以解释
#define      uchar      unsigned char                                                        //无符号char类型      
#define      uint       unsigned int                                                            //无符号int类型
/********************************************************************/
#define    set_bit(x,y)                  (x|=(1<<y))                                        //位置1              
#define    clr_bit(x,y)                   (x&=~(1<<y))                                     //位清0
#define    get_bit(x,y)                  (x&(1<<y))                                         //位查询
#define    xor_bit(x,y)                  (x^=(1<<y))                                       //位取反
备注: set_bit(x,y)该函数作用为将x变量的第y位字节置位为1(51系列单片机可以直接定义位变量如bit a=0,而对于很多其它单片机,列如ht,三星等,是不能直接进行位变量定义,因而只能借助于字节变量的位来作为位变量),同理clr_bit(x,y) ;get_bit(x,y) ;xor_bit(x,y);也是这个道理。并且为了提高程序移植性建议可以普遍采用这种方法来进行程序模块的编写,从而避免在不同芯片编译环境下会有是否可以直接定义位变量而修改程序的尴尬问题。
/********************************************************************/
#define    MAKEWORD(v1,v2)            (((uint)(v1)<<8) + (uint)(v2))          //高低位字节组合为一个字v1高,v2低
#define    HIBYTE(v1)                       ((uchar)((v1)>>8))                         //取高位字节
#define    LOBYTE(v1)                      ((uchar)((v1)&0xff))                        //取低位字节
备注: MAKEWORD(v1,v2) 作用为将v1*256+v2;比如a=1;b=2;c=MAKEWORD(a,b)=1*256+2=258; HIBYTE(v1) 作用为获取v1高位字节,即相当于v1/256;LOBYTE(v1)  作用为获取v1低字节,即相当于v1%256;
/********************************************************************/
#define LongToBin(n) \
(                    \
((n >> 21) & 0x80) | \
((n >> 18) & 0x40) | \
((n >> 15) & 0x20) | \
((n >> 12) & 0x10) | \
((n >>  9) & 0x08) | \
((n >>  6) & 0x04) | \
((n >>  3) & 0x02) | \
((n      ) & 0x01)   \
)
#define Bin(n) LongToBin(0x##n##l)                                                       //write binary charactor set,exsample : Bin(11111111) = 0xff
备注:该宏定义可以体现的作用为,假如当想表达数值0xff时,可以用Bin(11111111)来代替,这样把每一位都直观的体现出来便于阅读和修改参数。在这里举个实用的例子
         当希望io口初始化的时候每个io口的初始状态可能不一样,因而这个时候Bin(n)就能体现的很直观  
         P0 = Bin(00000001);                                
         P1 = Bin(11110000);
/********************************************************************/
struct bitDefine0{                                                                                 //结构体定义位变量
                    unsigned char bit0:1;
                    unsigned char bit1:2;
                    unsigned char bit2:2;
                    unsigned char bit3:3;
                 }    r_flag1;
#define    bianliang1    r_flag1.bit0                                                         //bianliang1代表一个只有1位的变量,可以用来作为位变量,数值范围是0-1
#define    bianliang2    r_flag1.bit1                                                         //bianliang2代表一个只有2位的变量,可以用来作为位变量,数值范围是0-3
#define    bianliang3    r_flag1.bit2                                                         //bianliang3代表一个只有2位的变量,可以用来作为位变量,数值范围是0-3
#define    bianliang4    r_flag1.bit3                                                         //bianliang4代表一个只有3位的变量,可以用来作为位变量,数值范围是0-8
备注:这里是结构体的应用,具体的结构体我就不给大家做阐述了,不懂得大家可以自己去查阅书籍,在这里我只强调其在开发中的应用和好处。大家可能经常会遇到这样一个问题,芯片的ram空间不够,经常定义的一     个变量(假如是uchar型)在程序中只用到范围是0-2,利用位变量范围不够,利用uchar变量又太浪费,这个时候这种结构体的优势就非常有效的体现出来了,它可以将一个变量的内部字节进行拆分从新定义以满足需求。对于现在的很多mcu来说,尤其是arm,它的内部ram空间非常充足,因而几乎从来遇不到这种空间紧张的情况,但对于小家电开发来说,非常讲究成本效益问题,因而很多时候ram空间资源和rom空间资源的利用就要非常珍惜,有可能程序写完后到最后面就要为省一个字节的ram空间或者一两天指令的程序空间二纠结郁闷

备注:以上内容都是家电开发行业的程序编写之精华所在。后续还有很多其它的个人非常经典的程序内容与各位分享 ,相互交流学习可加个人qq 1044340359。另外我想说的是,如果单纯在家电开发行业来说,我不是最牛,但自认为还不错,但关键是我愿意与大家分享交流

自己先占个沙发,同时非常希望各位路过的同行能发表一下建议

顶一下 愿意分享精华的辉哥

辉哥在以自己的能力向大家传播知识,尽己所能,服务大众呢

顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶

感谢支持!

不错。值得学习!

希望能对你学习起到作用!

这样的帖子应力顶!

辉哥的目的就是希望能给大家学习的过程中提供一定的帮助

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top