文章目录[隐藏]
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 系列单片机技术参考手册
版权声明:本文为CSDN博主「光头强不在」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_29761395/article/details/120648063
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 系列单片机技术参考手册
版权声明:本文为CSDN博主「光头强不在」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_29761395/article/details/120648063
暂无评论