常见的输入设备:
1、按键:
按键原理:按下导通,松手断开。
按键特性:按键会产生抖动,在按下的一瞬间,电压会发生变化如图:
按键程序处理:
程序需要过滤掉这段抖动,最简单就是通过增加延时来过滤掉这段抖动。
2、增加电压比较器模块的光敏电阻模块
模块原理:
光敏电阻的电阻会随外界模拟量的变化而变化,通过与蓝色可调电阻分压即可得到模拟电压输出,再通过电压比较器进行二值化为数字0或1即可得到数字电压输出。
电路原理图:
硬件电路:
推荐有两种接法:一般采用左上图的导通低电平接法,PA0使用上拉输入模式。或者也可以采用右上角的接法,PA0可以配置为浮空输入或上拉输入,对应高电平更稳定,同时当引脚拉低时,损耗也会增强。
左下角的接法,引脚需要配置为下拉输入模式,按键按下为高电平,右下角引脚可以配置为浮空输入模式或下拉输入模式。
数据类型:
需要更好地编写代码,我们需要理解标准库里代码的原理,就需要学会并理解以下一些内容,数据类型,宏定义,结构体等。下面给出详细介绍:
例如char,通常单片机用来存放整数,而不是字符,一般单片机采用stdint这一列的数据类型
int8_t就是8位整型数据,t代表typedef重定义的名字
uint8_t就是无符号8位整形数据,下面的16、32同理
ST关键字这一列是先前版本的数据类型,新版本也支持这种数据类型,兼容老版本。
宏定义:
宏定义就是简单的文本替换,会在编译时进行文本替换。
作用:将复杂的值替换为便于理解的字符串或其他类型的值。
#define ABC 12345//表示将ABC替换为12345
int a = ABC;//表示a = 12345
typedef:
typedef为C语言的关键字,为一种数据类型定义一个新名字
作用:将一个比较长的变量类型名换个名字,便于使用
对于变量类型重命名,使用typedef更安全,它会对命名进行检查。
typedef unsigned char uint8_t;
uint8_t a; //等效于unsigned char a;
结构体:
结构体定义:结构体可以将多个相同或不同的数据类型组合到一个数据类型中:
例如:
struct{int a; char b; double c;} c;
c.a = 1;
c.b = 'B';
c.c = 3.14;
在结构体使用时,通常采用typedef加结构体的方式进行重命名,这样能提高代码的简洁性和灵活性。例如:
typedef struct{
int a;
char b;
double c;
}Struct_Name;
Struct_Name aStruct;
aStruct.a = 1;
aStruct.b = 'B';
aStruct.c = 3.14;
结构体指针访问结构体内部变量时采用->符号例如:
typedef struct{
int a;
char b;
double c;
}Struct_Var;
void modifyStruct(Struct_Var* bStruct) {
bStruct->a = 2;
bStruct->b = 'b';
bStruct->c = 2.71;
}
int main(){
Struct_Var aStruct;
modifyStruct(&aStruct);
}
枚举:
关键字:enum
用途:定义一个取值受限制的整形变量,用于限制变量的范围;
enum{
Monday = 1,
Tuseday = 2,
Wednesday = 3,
} week;
week = Monday;//week=1
week = Tuseday;//week = 2
同样也可以使用typedef来重新命名。
typedef enum{
Monday = 1,
Tuseday = 2,
Wendsday = 3,
}enum_Var;
enum_Var week;
week = Monday;//week=1
week = Tuseday;//week = 2
枚举也是一个宏定义的集合,可以这样定义:
enum{
Monday = 1,
Tuseday = 2,
Wednesday = 3,
} week;
week = Monday;//week=1
week = Tuseday;//week = 2
int main() {
int a = Monday;//枚举里的宏定义
}
在stm32的标准库中,可以看到GPIOSPEED、GPIOMODE等枚举变量。