这里写自定义目录标题
- 环境说明
- 引脚说明
- 矩阵键盘
环境说明
该内容仅针对我自己学习的开发板做的笔记,在实际开发中需要针对目标电路板的原理图进行针对性研究。
- 芯片: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();}
}