C语言有哪些实用的函数
以下文章来源于:公众号:开源电子网,读取更多技术文章,请扫码关注C语言有哪些实用的函数
01. 程序断言:用来调试代码是否满足条件
#define
FILE_ASSERT(term)
do
{
if (!(term))
{
printf("Assert failed. Condition(%s). [%s][%d]\r\n",
term, __FUNCTION__, __LINE__); \
while(1) { ; }
}
} while (0)
02. 获取指定地址上的一个字节或字
<font size="2">#define SITE_B( x ) ( *( (byte *) (x) ) )
#define SITE _W( x ) ( *( (word *) (x) ) )</font>
03. 计算最大值和最小值<font size="2">#define LV_MAX( x, y ) ( ((x) > (y)) ? (x) : (y) )
#define LV_MIN( x, y ) ( ((x) < (y)) ? (x) : (y) )</font>
04. 将一个字母转换为大写<font size="2">#define CAPITAL( c ) ( ((c) >= 'a' && (c) <= 'z') ? ((c) - 0x20) : (c) )</font>
05. 获取数组元素的个数
<font size="2">#define MY_SIZE( x ) ( sizeof( (x) ) / sizeof( (x) ) )</font>
06. 颜色转换
#define RGB888_turn_monochrome(color) ((color)?0:1)
#define RGB888_turn_RGB233(color) ((((color&0xff0000)>>22) << 6) +
(((color&0xff00)>>13) << 3) +
(((color&0xff)>>5)))
#define RGB888_turn_RGB565(color) ((((color&0xff0000)>>19) << 11) +
(((color&0xff00)>>10) << 5) +
(((color&0xff)>>3)))
int LV_RGB888(uint32_t color)
{
int ret=0;
switch(cfgColorDepth)
{
case 1: // 颜色深度1,单色
{
ret= RGB888_turn_monochrome(color);
break;
}
case 8: // 颜色深度8,RGB233
{
ret= RGB888_turn_RGB233(color);
break;
}
case 16: // 颜色深度16,RGB565
{
ret= RGB888_turn_RGB565(color);
break;
}
case 24: // 颜色深度24,RGB888
{
ret= color;
break;
}
default:
break;
}
return ret;
}
07. 二进制字符串转换为十进制整数
<font size="2">/**
* @brief 二进制字符串转换为十进制整数
* @param str:待反转的字符串
* @retval 反转字符串
*/
static void lv_atk_bit_str_reverse(char str[])
{
int n=strlen(str);
int i;
char temp;
for (i = 0;i < (n/2); i++)
{
temp = str;
str = str;
str = temp;
}
}</font>
08. 把二进制字符串转换为十进制
<font size="2">/**
* @brief 把二进制字符串转换为十进制
* @param pbin:二进制
* @retval 二进制字符串转换为十进制整数的结果
*/
static long lv_atk_bit_bin_to_dec(const char *pbin)
{
int ii=0;
long result=0;
while (pbin != 0)
{
result = result * 2 + (pbin - '0');
ii++;
}
return result;
}</font>
09. 将十进制转换为八进制
/**
* @brief 将十进制转换为八进制
* @param n:十进制
* @retval 返回八进制
*/
long lv_atk_dec_to_oct(long dec)
{
int oct = 0, i = 0;
i = 1;
while (dec != 0)
{
oct += (dec % 8) * i;
dec /= 8;
i *= 10;
}
return oct;
}
10
十进制转二进制
/**
* @brief 十进制转二进制
* @param n:十进制
* @retval 返回二进制
*/
long lv_atk_bec_to_bin(long n)
{
long result=0,k=1,i,temp;
temp = n;
while(temp)
{
i = temp%2;
result = k * i + result;
k = k*10;
temp = temp/2;
}
printf("%ld\n", result);
return result;
}
11. 十六进制转十进制
<font size="2">/**
* @brief 十六进制转十进制
* @param n:十六进制
* @retval 返回十进制
*/
long lv_atk_hex_to_dex(char*s)
{
int i,t;
long sum=0;
for(i=0;s;i++)
{
if(s>= '0'&&s<='9')/* 当字符是'0'--'9'时,*-‘0'就行了 */
{
t=s-'0';
}
if(s>='a'&&s<='z')
{
t=s-'a'+10;/* 当字符是 abcdef 时,*-‘a’+10 就行了 */
}
if(s>='A'&&s<='Z')
{
t=s-'A'+10;/* 当字符是 ABCDEF 时,*-‘A’+10 就行了 */
}
sum=sum*16+t;
}
return sum;
}</font>
12. 八进制转十进制
<font size="2">/**
* @brief 八进制转十进制
* @param n:八进制的数值
* @retval 返回十进制
*/
long lv_atk_oct_to_dex(long n)
{
int i=0,tmp,sum=0;
while(n)
{
tmp=n%10;
n=n/10;
sum+=tmp*pow(8,i);
i++;
}
printf("%d",sum);
return sum;
}</font>
13. RAM计算前导零指令(__clz)使用C语言编写
<font size="2">int lv_clz(unsigned intapp_readly_list[])
{
int bit = 0;
for (int i = 0; i < 32; i++)
{
if (app_readly_list == 1)
{
break;
}
bit ++ ;
}
return bit;
}</font>
14. 获取一个字的高位和低位字节
<font size="2">#define VALUE_L(x) ((byte) ((word)(x) & 255))
#define VALUE_H(x) ((byte) ((word)(x) >> 8))</font>
15. 从一个结构的成员指针找到其容器的指针
<font size="2">#define os_container_of(ptr, type, member) \
((type *)((char *)(ptr) - (unsigned long)(&((type *)0)->member)))</font>
16. 获取按指定宽度对齐的向下数
<font size="2">#define ALIGN_DOWN(size, align) ((size) & ~((align) - 1))</font>
17. 获取按指定宽度对齐的向上数
#define ALIGN_UP(size, align) (((size) + (align) - 1) & ~((align) - 1))
18. 程序定位断言
能不能用论坛code功能编辑一下,方便后人阅读 确实排版看着比较难受
页:
[1]