单片机C语言基础知识

一、进制转换表

二、C语言数据类型

关键字

位数

表示范围

stdint关键字

ST关键字

char

8

-128 ~ 127

int8_t

s8

unsigned char

8

0 ~ 255

uint8_t

u8

short

16

-32768 ~ 32767

int16_t

s16

unsigned short

16

0 ~ 65535

uint16_t

u16

int

32

-2147483648 ~ 2147483647

int32_t

s32

unsigned int

32

0 ~ 4294967295

uint32_t

u32

long

32

-2147483648 ~ 2147483647

unsigned long

32

0 ~ 4294967295

long long

64

-(2^64)/2 ~ (2^64)/2-1

int64_t

unsigned long long

64

0 ~ (2^64)-1

uint64_t

float

32

-3.4e38 ~ 3.4e38

double

64

-1.7e308 ~ 1.7e308

三、位运算符

位运算符用来对二进制位进行操作,C语言中提供了如下所示的位运算符。

位运算符含义运算规则
&    (and )按位与一假即假
|      ( or )按位或一真即真
^   ( xor )按位异或同假异真
~     ( not )按位取反
<<   (  shi )左移
>>   (  shr )右移

清零取反要用与,某位置一可用或

若要取反和交换,轻轻松松用异或

假设a,b为整型数据,a=15(00000000 00001111)b=80(00000000 01010000)

a&b:  00000000 00000000   a&b=0x0

a|b : 00000000 01011111   a|b=0x5f

a^b : 00000000 01011111   a^b=0x5f

~a  : 11111111 11110000    ~a=0xfff0

与或

比如我要改变 GPIOA 的 CRL 寄存器 bit6(第 6 位)的值为 1,可以先对寄 存器的值进行&清零操作:

GPIOA->CRL &= 0XFFFFFFBF; /* 将第 bit6 清 0 */

然后再与需要设置的值进行|或运算:

GPIOA->CRL |= 0X00000040; /* 设置 bit6 的值为 1,不改变其他位的值 */

左移运算符<<

运算规则:对运算符<<左边的每一位全部左移右边表示的位数,右边空出的位补0。

【例】a<<2表示将a的各位依次向左移2位,a的最高2位移出去舍弃,空出的低2位以0填补。

例:char a=0x21;

则a<<2的过程 0010 0001<<2 = 1000 0100;即 a<<2的值为0x84。

左移1位相当于该数乘以2,左移n位相当于该数乘以2n。

乘法运算转化成位运算 (在不产生溢出的情况下)

a * (2^n) 等价于 a<< n

右移运算符>>

运算规则:对运算符>>左边的每一位全部右移右边表示的位数,右边低位被移出去舍弃掉,空出的高位补0还是补1,分两种情况:

(1)对无符号数进行右移时,空出的高位补0。这种右移称为逻辑右移。

(2)对带符号数进行右移时,空出的高位全部以符号位填补。即正数补0,负数补1。这种右移称为算术右移。

右移1位相当于除以2,同样,右移n位相当于除以2n。

按位取反~

按位取反在单片机中常用于清除某一个 /某几个位。下面是 delay_us 函数的一行代码:

SysTick->CTRL &= ~(1 << 0) ; /* 关闭 SYSTICK */

该代码可以解读为,仅设置 CTRL 寄存器的第 0 位(最低位)为 0,其他位的值保持不变。

按位异或^

该功能非常适合用于控制某个位翻转,常见的应用场景就是控制 LED 闪烁,如:

GPIOB->ODR ^= 1 << 5;

执行一次该代码,就会使 PB5 的输出状态翻转一次,如果我们的 LED 接在 PB5 上,就可 以看到 LED 闪烁了。

四、defne宏定义

define 是C语言中的预处理命令,它用于宏定义,可以提高源代码的可读性,为编程提供方 便。常见的格式:

#define 标识符 字符串

“标识符”为所定义的宏名。“字符串”可以是常数、表达式、格式串等。例如:

#define ABC 12345

引用宏定义:int a = ABC;  等效于int a = 12345;

五、条件编译

单片机程序开发过程中,经常会遇到一种情况,当满足某条件时对一组语句进行编译,而 当条件不满足时则编译另一组语句。条件编译命令最常见的形式为:

#ifdef 标识符
程序段 1 
#else 
程序段 2 
#endif 

它的作用是:当标识符已经被定义过(一般是用#define 命令定义),则对程序段 1 进行编译, 否则编译程序段 2。 其中#else 部分也可以没有。

文章源自正点原子开发指南,用作个人学习记录,以后会继续补充

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值