技能梳理37@stm32+按键+光耦+锁存+串行转并行+继电器
1、项目简介
2、实现逻辑
3、应用场景
#主从机有线控制
#开关操作
4、核心代码梳理
void handle_key_press(int key)
{
char buf[20];
sprintf(buf, "Key %d pressed", key);
oled_print(0, 4, buf);
CAN_TX(buf);
}
void control_relay(uint8_t position, GPIO_PinState state) {
if (position < 1 || position > 14) {
return;
}
GPIO_TypeDef* port = GPIOC;
uint16_t pin;
switch (position) {
case 1:
port = GPIOC;
pin = GPIO_PIN_14;
break;
case 2:
port = GPIOC;
pin = GPIO_PIN_15;
break;
case 3:
port = GPIOA;
pin = GPIO_PIN_0;
break;
case 4:
port = GPIOA;
pin = GPIO_PIN_1;
break;
case 5:
port = GPIOA;
pin = GPIO_PIN_2;
break;
case 6:
port = GPIOA;
pin = GPIO_PIN_3;
break;
case 7:
port = GPIOA;
pin = GPIO_PIN_4;
break;
case 8:
port = GPIOA;
pin = GPIO_PIN_5;
break;
case 9:
port = GPIOA;
pin = GPIO_PIN_6;
break;
case 10:
port = GPIOA;
pin = GPIO_PIN_7;
break;
case 11:
port = GPIOB;
pin = GPIO_PIN_0;
break;
case 12:
port = GPIOB;
pin = GPIO_PIN_1;
break;
case 13:
port = GPIOB;
pin = GPIO_PIN_10;
break;
case 14:
port = GPIOB;
pin = GPIO_PIN_11;
break;
default:
return;
}
HAL_GPIO_WritePin(port, pin, state);
}
int keypad_to_num(int keypad_val) {
int switch_key[16] = {13, 9, 5, 1, 14, 10, 6, 2, 15, 11, 7, 3, 16, 12, 8, 4};
for (int i = 0; i < 16; i++) {
if (keypad_val == switch_key[i]) {
return i+1;
}
}
return -1;
}
int scan_keypad(void) {
int row, col;
int all_unused = 1;
for (col = 0; col < 4; col++) {
switch(col){
case 0:
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET);
break;
case 1:
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_RESET);
break;
case 2:
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_RESET);
break;
case 3:
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET);
break;
default:
break;
}
for (row = 0; row < 4; row++) {
if (!HAL_GPIO_ReadPin(GPIOB, 1 << (row + 12))) {
HAL_Delay(100);
if (!HAL_GPIO_ReadPin(GPIOB, 1 << (row + 12))) {
int key_pressed = row*4 + col + 1;
key_pressed = keypad_to_num(key_pressed);
if(key_pressed > 14)
return 0;
for(int i = 0; i < 16; i++) {
if(i != key_pressed - 1 && key_table[i] == 1) {
return -1;
}
}
if(key_table[key_pressed-1] == 0)
{
key_table[key_pressed-1] = 1;
return key_pressed;
}
else
{
key_table[key_pressed-1] = 0;
return key_pressed + 100;
}
}
}
}
Delay(1000);
switch(col){
case 0:
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET);
break;
case 1:
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_SET);
break;
case 2:
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_SET);
break;
case 3:
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET);
break;
default:
break;
}
}
return 0;
}
5、部分参考资料
6、注意事项
#使用的不是单个的按键,是矩阵键盘
#按键消抖比较简单,按的时候需要暂停1秒
#主从机程序写到一个工程文件了,通过宏定义可以进行选择
#资料中的参考硬件是之前自己的项目文件
#硬件和软件不是一一对应的,硬件更为复杂
完整可运行项目地址
视频讲解B站地址
或 点击下方”大饼匠人“卡片,关注并回复"37"免费下载
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)