STC8H8K64U 学习笔记 - 矩阵键盘

这里写自定义目录标题

环境说明

该内容仅针对我自己学习的开发板做的笔记,在实际开发中需要针对目标电路板的原理图进行针对性研究。

  • 芯片:STC8H8K64U
  • 烧录软件:stc-isp-v6.92G
  • 编码工具:天问

引脚说明

  • P0_0:蜂鸣器,按频率发音,1:高,0:低
  • P0_1:电动马达,0:停,1:动
  • P5_3:小蓝灯,0:灭,1:亮
  • P2_7:1 号 LED 灯,0:亮,1:灭
  • P2_6:2 号 LED 灯,0:亮,1:灭
  • P1_5:3 号 LED 灯,0:亮,1:灭
  • P1_4:4 号 LED 灯,0:亮,1:灭
  • P2_3:5 号 LED 灯,0:亮,1:灭
  • P2_2:6 号 LED 灯,0:亮,1:灭
  • P2_1:7 号 LED 灯,0:亮,1:灭
  • P2_0:8 号 LED 灯,0:亮,1:灭
  • P5_1:1 号按键,0:按下,1:弹起
  • P5_2:2 号按键,0:按下,1:弹起
  • P5_3:3 号按键,0:按下,1:弹起
  • P5_4:4 号按键,0:按下,1:弹起
  • P3_4:矩阵键盘第 1 行引脚
  • P3_5:矩阵键盘第 2 行引脚
  • P4_0:矩阵键盘第 3 行引脚
  • P4_1:矩阵键盘第 4 行引脚
  • P0_3:矩阵键盘第 1 列引脚
  • P0_6:矩阵键盘第 2 列引脚
  • P0_7:矩阵键盘第 3 列引脚
  • P1_7:矩阵键盘第 4 列引脚

矩阵键盘

矩阵键盘需要行列联合检测

行号 行引脚 列号 列引脚
1 P3_4 1 P0_3
2 P3_5 2 P0_6
3 P4_0 3 P0_7
4 P4_1 4 P1_7

检测思路是:

  1. 先所有行列引脚全部置为 1
  2. 将需要检测的行的引脚置为 0
  3. 逐个检测列引脚的值是否为 0,若是,则被按下。

例如检测第一行的四个按键的代码如下:

P3_4 = 0, P3_5 = 1, P4_0 = 1, P4_1 = 1;
P0_3 = 1, P0_6 = 1, P0_7 = 1, P1_7 = 1;
if(P0_3 == 0) {
    printf_small("第 %d 行的 P0_3 被按下\n", 1);
}
if(P0_6 == 0) {
    printf_small("第 %d 行的 P0_6 被按下\n", 1);
}
if(P0_7 == 0) {
    printf_small("第 %d 行的 P0_7 被按下\n", 1);
}
if(P1_7 == 0) {
    printf_small("第 %d 行的 P1_7 被按下\n", 1);
}

全矩阵键盘扫描,按下点灯

#include <STC8HX.h>
uint32 sys_clk = 24000000;//设置PWM、定时器、串口、EEPROM频率参数
#include "lib/twen_board.h"
#include "lib/UART.h"
#include <stdio.h>

uint8 index = 0;
const uint32 INTERVAL = 100;

void putchar(char c) {
  if (c == '\n') {
    uart_putchar(UART_1, 0x0d);
    uart_putchar(UART_1, 0x0a);
  } else {
    uart_putchar(UART_1, (uint8)c);
  }
}

void setup() {
  twen_board_init();//天问51初始化
  P0M1&=~0x02;P0M0|=0x02;//推挽输出
  P2M1=0x00;P2M0=0xff;//推挽输出
  uart_init(UART_1, UART1_RX_P30, UART1_TX_P31, 115200, TIM_1);//初始化串口
}

// 扫描行
void scan(uint8 row) {
  // 全部置 1
  P3_4 = 1, P3_5 = 1, P4_0 = 1, P4_1 = 1;
  P0_3 = 1, P0_6 = 1, P0_7 = 1, P1_7 = 1;
  // 根据行号将对应行引脚置零
  switch (row) {
    case 1: P3_4 = 0; break;
    case 2: P3_5 = 0; break;
    case 3: P4_0 = 0; break;
    case 4: P4_1 = 0; break;
  }
  // 逐个检查列引脚
  if(P0_3 == 0) {
    printf_small("(%d,1)by P0_3\n", row);
    if(row == 1) {
      // 若按键 (1,1) 被按下, 1 号灯亮起
      P2_7 = 0;
      delay(INTERVAL);
      P2_7 = 1;
    }
    if(row == 2) {
      // 若按键 (2,1) 被按下, 5 号灯亮起
      P2_3 = 0;
      delay(INTERVAL);
      P2_3 = 1;
    }
  }
  if(P0_6 == 0) {
    printf_small("(%d,2)by P0_6\n", row);
    if(row == 1) {
      // 若按键 (1,2) 被按下, 2 号灯亮起
      P2_6 = 0;
      delay(INTERVAL);
      P2_6 = 1;
    }
    if(row == 2) {
      // 若按键 (2,2) 被按下, 6 号灯亮起
      P2_2 = 0;
      delay(INTERVAL);
      P2_2 = 1;
    }
  }
  if(P0_7 == 0) {
    printf_small("(%d,3)by P0_7\n", row);
    if(row == 1) {
      // 若按键 (1,3) 被按下, 3 号灯亮起
      P1_5 = 0;
      delay(INTERVAL);
      P1_5 = 1;
    }
    if(row == 2) {
      // 若按键 (2,3) 被按下, 7 号灯亮起
      P2_1 = 0;
      delay(INTERVAL);
      P2_1 = 1;
    }
  }
  if(P1_7 == 0) {
    printf_small("(%d,4)by P1_7\n", row);
    if(row == 1) {
      // 若按键 (1,4) 被按下, 4 号灯亮起
      P1_4 = 0;
      delay(INTERVAL);
      P1_4 = 1;
    }
    if(row == 2) {
      // 若按键 (2,4) 被按下, 8 号灯亮起
      P2_0 = 0;
      delay(INTERVAL);
      P2_0 = 1;
    }
  }
}

void loop() {
  for (index = 1; index < 5; index++) {
    scan(index);
  }
}

void main(void) {
  setup();
  while(1){
    loop();
  }
}

相关推荐

  1. STC8H8K64U 学习笔记 - 矩阵键盘

    2024-04-03 21:02:02       40 阅读
  2. STC8H8K64U 学习笔记 - 与上位机通信

    2024-04-03 21:02:02       28 阅读
  3. STC8H8K64U 学习笔记 - 位运算

    2024-04-03 21:02:02       34 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-03 21:02:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-03 21:02:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-03 21:02:02       87 阅读
  4. Python语言-面向对象

    2024-04-03 21:02:02       96 阅读

热门阅读

  1. 题目:学习static定义静态变量的用法

    2024-04-03 21:02:02       37 阅读
  2. MATLAB 打开文件对话框选择点云输入 (52)

    2024-04-03 21:02:02       37 阅读
  3. 工厂方法模式

    2024-04-03 21:02:02       35 阅读
  4. 【SpringCloud】Config配置中心

    2024-04-03 21:02:02       39 阅读
  5. 分布式IO模块PLC扩展模拟量模块

    2024-04-03 21:02:02       37 阅读
  6. 为什么重写 equals 时,必须重写 hashCode?

    2024-04-03 21:02:02       35 阅读
  7. js绑定点击事件的方法

    2024-04-03 21:02:02       32 阅读