STC8H8K64U 学习笔记 - 矩阵键盘

本文介绍了如何在STC8H8K64U开发板上使用矩阵键盘并控制多个LED灯。通过编程实现按键行号和列号的联合检测,以及按下时对应的LED灯点亮操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里写自定义目录标题

环境说明

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

  • 芯片: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 列引脚

矩阵键盘

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

行号行引脚列号列引脚
1P3_41P0_3
2P3_52P0_6
3P4_03P0_7
4P4_14P1_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();
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值