这里写自定义目录标题
- 环境说明
- 引脚说明
 
- 矩阵键盘
环境说明
该内容仅针对我自己学习的开发板做的笔记,在实际开发中需要针对目标电路板的原理图进行针对性研究。
- 芯片: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
- 将需要检测的行的引脚置为 0
- 逐个检测列引脚的值是否为 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) {// 全部置 1P3_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();}
}