KEYKING‘S STM32笔记 GPIO——LED灯

GPIO——LED灯

第一课 点灯大师

推挽模式放入while函数中,用于GPIO高低电平调整和延时

	  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET);
	  HAL_Delay(500);
	  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET);
	  HAL_Delay(500);
	  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
	  HAL_Delay(500);
	  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);

第二课 点灯宗师

通过state实现流水灯, C语言部分基础

	  int state;  // 声明一个整数变量state
	  if (state <= 2 ||  state==5){
		  HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, GPIO_PIN_SET);
	  }else{
		  HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, GPIO_PIN_RESET);
	  }
	  if (state >= 1 && state<=3){
		  HAL_GPIO_WritePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin, GPIO_PIN_SET);
	  }else{
		  HAL_GPIO_WritePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin, GPIO_PIN_RESET);
	  }
	  if (state >= 2 && state<=5){
		  HAL_GPIO_WritePin(LED_BLUE_GPIO_Port, LED_BLUE_Pin, GPIO_PIN_SET);
	  }else{
		  HAL_GPIO_WritePin(LED_BLUE_GPIO_Port, LED_BLUE_Pin, GPIO_PIN_RESET);
	  }
	  HAL_Delay(300);

	  state++;
	  if (state > 5){
		  state = 0;
	  }
	  }

条件语句

常见的条件语句包括 if 语句、else 语句、else if 语句以及 switch 语句。下面是这些条件语句的详细讲解。

1. if 语句

if 语句根据一个布尔表达式(条件)的值来决定是否执行一个代码块。如果条件为真(非零值),则执行代码块;否则不执行。

if (condition) {
    // 当condition为真时,执行这段代码
}
2. if-else 语句

if-else 语句在 if 条件为假(零值)时执行 else 代码块。

if (condition) {
    // 当condition为真时,执行这段代码
} else {
    // 当condition为假时,执行这段代码
}
3. if-else if-else 语句

if-else if-else 语句用于检查多个条件。在 ifelse if 条件都为假时,执行 else 代码块。

if (condition1) {
    // 当condition1为真时,执行这段代码
} else if (condition2) {
    // 当condition1为假,condition2为真时,执行这段代码
} else {
    // 当condition1和condition2都为假时,执行这段代码
}
4. 嵌套的 if 语句

可以在一个 ifelse 代码块中再使用 if 语句,这就是嵌套的 if 语句。

if (condition1) {
    // 当condition1为真时,执行这段代码
    if (condition2) {
        // 当condition1和condition2都为真时,执行这段代码
    }
}
5. switch 语句

switch 语句根据一个变量或表达式的值,选择一个 case 代码块执行。break 语句用于结束当前 case 代码块,防止继续执行后面的 case

switch (expression) {
    case constant1:
        // 当expression等于constant1时,执行这段代码
        break;
    case constant2:
        // 当expression等于constant2时,执行这段代码
        break;
    // 可以有多个case
    default:
        // 当expression不等于任何一个constant时,执行这段代码
}
关键点
  1. if 条件可以是任何布尔表达式,包括比较操作和逻辑操作。
  2. if-else 提供了二选一的逻辑分支
  3. if-else if-else 允许检查多个条件,但只执行第一个为真的条件代码块。
  4. 嵌套 if 语句 允许复杂条件检查。
  5. switch 语句 允许基于变量的多个值执行不同的代码块,适合用于检查一个变量的多个具体值。

在C语言中,运算符是用于执行各种操作的符号。运算符可以分为几类,包括算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符、条件运算符和其他运算符。下面是对每一类运算符的详细讲解。

运算符

1. 算术运算符

算术运算符用于执行基本的算术运算,如加减乘除等。

运算符描述示例
+加法a + b
-减法a - b
*乘法a * b
/除法a / b
%取模(取余)a % b
2. 关系运算符

关系运算符用于比较两个值,结果为真或假(即1或0)。

运算符描述示例
==等于a == b
!=不等于a != b
>大于a > b
<小于a < b
>=大于等于a >= b
<=小于等于a <= b
3. 逻辑运算符

逻辑运算符用于进行逻辑操作,结果为真或假。

运算符描述示例
&&逻辑与a && b
双竖杠逻辑或a双竖杠b
!逻辑非!a
4. 位运算符

位运算符用于按位操作二进制数。

运算符描述示例
&按位与a & b
竖杠按位或a 竖杠b
^按位异或a ^ b
~按位取反~a
<<左移a << 2
>>右移a >> 2
示例
int a = 5, b = 3; // a = 0101, b = 0011 in binary
int result1 = a & b; // result1 = 1 (0001)
int result2 = a | b; // result2 = 7 (0111)
int result3 = a ^ b; // result3 = 6 (0110)
int result4 = ~a;    // result4 = -6 (1111...1010 in 2's complement)
int result5 = a << 1; // result5 = 10 (1010)
int result6 = a >> 1; // result6 = 2 (0010)
5. 赋值运算符

赋值运算符用于将值赋给变量。

运算符描述示例
=赋值a = b
+=加后赋值a += b
-=减后赋值a -= b
*=乘后赋值a *= b
/=除后赋值a /= b
%=取模后赋值a %= b
&=按位与后赋值a &= b
竖杠 =按位或后赋值a竖杠b
^=按位异或后赋值a ^= b
<<=左移后赋值a <<= b
>>=右移后赋值a >>= b
示例
cint a = 10;
a += 5; // a = a + 5 = 15
a -= 3; // a = a - 3 = 12
a *= 2; // a = a * 2 = 24
a /= 4; // a = a / 4 = 6
a %= 5; // a = a % 5 = 1
6. 条件运算符(三元运算符)

条件运算符是一种简写的 if-else 语句。

运算符描述示例
?:条件表达式condition ? expr1 : expr2
示例
int a = 5, b = 10;
int max = (a > b) ? a : b; // max = 10
7. 其他运算符
运算符描述示例
sizeof返回变量或数据类型的大小(以字节为单位)sizeof(a)
&取地址运算符,返回变量的地址&a
*间接寻址运算符,访问指针所指向的变量*ptr
.结构体成员访问运算符structVar.member
->结构体指针成员访问运算符ptr->member
示例
int a = 10;
int *ptr = &a; // ptr 指向 a 的地址
int size = sizeof(a); // size = 4 (假设 int 是 4 个字节)

第三课 按键控制小灯

不上拉不下拉浮空输入模式

在while中使用轮询方式读取按键

  while (1)
  {
	  HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin);//高电平返回GPIO_PIN_SET,低高电平返回GPIO_PIN_RESET,该行代码无用
	  if (HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == GPIO_PIN_RESET){
		  HAL_GPIO_WritePin(LED_BLUE_GPIO_Port, LED_BLUE_Pin, GPIO_PIN_SET);
	  }else{
		  HAL_GPIO_WritePin(LED_BLUE_GPIO_Port, LED_BLUE_Pin, GPIO_PIN_RESET);
	  }
	  if (HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin) == GPIO_PIN_RESET){
          HAL_Delay(10);//由于按键抖动,因此需要进行10ms延迟消抖
          if (HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin) == GPIO_PIN_RESET){
              HAL_GPIO_TogglePin(LED_RED_GPIO_Port, LED_RED_Pin);//用于切换(翻转)指定GPIO引脚状态的函数。
              while (HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin) == GPIO_PIN_RESET){}
          }

	  }

第四课(重点)GPIO内部的电路原理

推挽输出电路

由来自芯片的电压驱动

推挽输出

开漏输出电路

依靠外部的电压来进行驱动

开漏输出

两种输出模式的对比

在这里插入图片描述

八大模式在这里插入图片描述

  • 15
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值