STC8H1K08 - GPIO 按键检测

本文介绍了如何使用STC8H系列单片机实现不使用硬件或软件消抖的轻触按键(K1、K2)检测,并配合LED1进行状态指示。通过配置IO口模式、上拉电阻和中断管理,实现简单但实用的按键控制。

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


STC8H 系列单片机所有的 I/O 口均有 4 种工作模式:准双向口/弱上拉(标准 8051 输出口模式)、推挽输出/强上拉、高阻输入(电流既不能流入也不能流出)、开漏输出。

注意:除 P3.0 和 P3.1 外,其余所有 I/O 口上电后的状态均为高阻输入状态,用户在使用 I/O 口之前必须先设置 I/O 模式。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

不使用硬件或软件消抖的按键检测

原理图

  • 使用 3V 电源为单片机的供电;
  • 端口 P1.2 连接发光二极管 D1;当该端口输出高电平时,熄灭发光二极管,反之点亮发光二极管;
  • 端口 P1.6 连接轻触按键 K1;当按下按键时,该端口被拉低;
  • 端口 P3.7 连接轻触按键 K2;当按下按键时,该端口被拉高。

在这里插入图片描述

Keil 工程结构

在这里插入图片描述

源文件

新建 stc8h1k08.h 头文件:

#ifndef __STC8H1K08_H
#define __STC8H1K08_H


sfr P1          = 0x90; /* Port 1 Register */
sfr P1M1        = 0x91; /* Port 1 Configuration Register 1 */
sfr P1M0        = 0x92; /* Port 1 Configuration Register 0 */
sfr P3          = 0xB0; /* Port 3 Register */
sfr P3M1        = 0xB1; /* Port 3 Configuration Register 1 */
sfr P3M0        = 0xB2; /* Port 3 Configuration Register 0 */
sfr P_SW2       = 0xBA;

#define P1PU    (*(unsigned char volatile xdata *)0xFE11) /* P1 Pull-up Resistor Control Register */


/** P1M1 Register Bits Definition */
#define P12M1                   (0x04) /* P1.2 Mode Selection Bit 1 */
#define P16M1                   (0x40) /* P1.6 Mode Selection Bit 1 */

/** P1M0 Register Bits Definition */
#define P12M0                   (0x04) /* P1.2 Mode Selection Bit 0 */
#define P16M0                   (0x40) /* P1.6 Mode Selection Bit 0 */


/** P3M1 Register Bit Definition */
#define P37M1                   (0x80) /* P3.7 Mode Selection Bit 1 */

/** P3M0 Register Bit Definition */
#define P37M0                   (0x80) /* P3.7 Mode Selection Bit 0 */

/** P_SW2 Register Bit Definition */
#define P_SW2_EAXFR             (0x80)

/** P1PU Register Bit Definition */
#define P1PU_P16PU              (0x40)


#define setRegisterBit(r, b)    r |= (b)
#define clearRegisterBit(r, b)  r &= ~(b)


#endif

新建 config.h 头文件:

#ifndef __CONFIG_H
#define __CONFIG_H


#include "stc8h1k08.h"


sbit KEY1 = P1^6; /* 轻触按键检测引脚。0:按下。1:松开。*/
sbit KEY2 = P3^7; /* 轻触按键检测引脚。0:松开。1:按下。*/

sbit LED1 = P1^2; /* 发光二极管控制引脚. 0:点亮, 1:熄灭 */


void initialize();


#endif

新建 config.c 文件:

#include "config.h"


void initialize() {
    /**
     * 初始化 GPIO
     */
//    // 将轻触按键(KEY1)检测引脚设为准双向口
//    clearRegisterBit(P1M1, P16M1);
//    clearRegisterBit(P1M0, P16M0);
    // 将轻触按键(KEY1)检测引脚设为高阻输入
    setRegisterBit(P1M1, P16M1);
    clearRegisterBit(P1M0, P16M0);
    // 使能轻触按键(KEY1)检测引脚的内部上拉电阻
    setRegisterBit(P_SW2, P_SW2_EAXFR);
    setRegisterBit(P1PU, P1PU_P16PU);
    clearRegisterBit(P_SW2, P_SW2_EAXFR);
    
    // 将轻触按键(KEY2)检测引脚设为高阻输入
    setRegisterBit(P3M1, P37M1);
    clearRegisterBit(P3M0, P37M0);
    
    // 将发光二极管(LED1)的控制引脚设为推挽输出
    clearRegisterBit(P1M1, P12M1);
    setRegisterBit(P1M0, P12M0);
}

新建 main.c 文件:

#include "config.h"


void main() {
    initialize();
    
    while(1) {
        if(KEY1 == 0) { // 按下按键 1,点亮发光二极管
            LED1 = 0;
        }
        
        if(KEY2 == 1) { // 按下按键 2,熄灭发光二极管
            LED1 = 1;
        }
    }
}

参考

宏晶科技 STC micro - STC8H 系列单片机技术参考手册

### STC8H1K08STC8H8K64U 单片机差异比较 #### 一、基本参数对比 STC8H系列单片机依据不同的型号具备各异的功能配置。对于STC8H1K08而言,这款芯片属于该家族中的入门级成员之一;而STC8H8K64U则定位更高,拥有更大的程序存储空间以及数据处理能力。 - **Flash ROM** - STC8H1K08配备的是8KB Flash ROM[^1]。 - STC8H8K64U则提供了高达64KB的Flash ROM容量[^3]。 - **RAM** - STC8H1K08具有较小规模的数据缓存区域——1KB RAM。 - 对于需要更强实时计算性能的应用场景来说,STC8H8K64U内置了多达8KB SRAM用于临时变量保存与快速访问操作。 #### 二、外设资源分析 两款器件在外围接口方面存在一定差别: - **GPIO端口特性** - STC8H1K08支持多种I/O工作状态切换(如准双向口/弱上拉),这使得开发者可以根据实际需求灵活调整引脚属性来满足不同应用场景下的连接方式要求。 - **特殊功能模块** - 尽管两者都继承自经典架构并有所增强,但高端产品线上的STC8H8K64U额外集成了诸如SPI通信总线、I²C串行接口等现代化组件,极大地方便了与其他设备间的信息交换过程。 - **PWM控制单元** - 关于脉宽调制(PWM),值得注意的是,尽管二者均实现了16位精度级别的输出信号生成功能,不过仅限于后者才享有更先进的硬件移相机制及高速版本的支持选项[^4]。 #### 三、独特卖点总结 每种型号都有其针对性的设计考量和发展方向: - **性价比优势** - 如果项目预算有限且对性能指标没有过高追求的话,那么选择成本较低廉却依然能够胜任大多数简单任务执行工作的STC8H1K08不失为一种明智之举。 - **扩展性和兼容性表现优异的产品** - 当面临复杂度较高或者未来可能涉及升级维护的情况时,则建议优先考虑采用集成度更高的解决方案—即选用带有丰富外围电路选件并且易于编程调试环境搭建起来得力助手-STC8H8K64U作为核心处理器平台。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值