51单片机(STC8)-- GPIO输入输出

文章目录

STC8H 系列单片机所有的 I/0 口均有 4 种工作模式,可使用软件对 I/O 口的工作模式进行配置:

  • 准双向/弱上拉(标准 8051 输出口模式)
  • 推挽输出/强上拉
  • 高阻输入(电流既不能流入也不能流出)
  • 开漏输出。

I/O口相关寄存器

端口数据寄存器

读写端口状态

写 0: 输出低电平到端口缓冲区

写 1: 输出高电平到端口缓冲区

读:直接读端口管脚上的电平

端口模式配置寄存器(PxM0,PxM1)

I/O口工作模式配置相关寄存器为PxM0和PxM1,即需要配置两个寄存器才能设置某个I/O的工作模式

I/O口的4种工作模式配置如下

端口上拉电阻控制寄存器(PxPU)

端口内部4.1K上拉电阻控制位(注: P3.0和P3.1口上的上拉电阻可能会略小一些)

0:禁止端口内部的 4.1K 上拉电阻

1:使能端口内部的 4.1K 上拉电阻

I/O寄存器除上述常用的寄存器外,还有端口施密特触发控制寄存器、端口电平转换速度控制寄存器、端口驱动电流控制寄存器和端口数字信号输入使能控制寄存器等可简单了解



关于I/O的注意事项

配置I/O口

每个I/O 的配置都需要使用两个寄存器进行设置

以 P0口为例,配置P0口需要使用 P0M0和 P0M1 两个寄存器进行配置,如下图所示

注意

虽然每 I/O 口在弱上拉(准双向口)/强推挽输出/开漏模式时都能承受 20mA 的灌电流(还是要加限流电阻,如1K、5600、4720等),在强推挽输出时能输出 20mA 的拉电流(也要加限流电阻),但整个芯片的工作电流推荐不要超过70mA,即从 Vcc流入的电流建议不要超过70mA,从Gnd流出电流建议不要超过70mA,整体流入/流出电流建议都不要超过 70mA

I/O设置demo

I/O端口模式
cpp 复制代码
#include "stc8h.h"
#include "intrins. h "

void main()
{
		P_SW2 |= 0x80;			//使能访问XFR
		
		P0M0 = 0x00;				//设置P0.0~P0.7 为双向口模式
		P0M1 = 0x00
		P1M0 = 0xff;				//设置P1.0~P1.7 为推输出模式
		P1M1 = 0x00
		P2M0 = 0x00;				//设置P2.0~P2.7为高阻输入模式
		P2M1 = 0xff;
		P3M0 = 0xff;				//设置P3.0~P37 为开模式
		P3M1 = 0xff;
		
		while(1);
}
LED控制(I/O输出)
cpp 复制代码
#include<stc8hxx.h>
#include<intrins.h>

sbit LED1 = P4^6;
sbit LED2 = P4^7;

void Delay_ms(u16 times)		//@24.000MHz
{
	unsigned char i, j;

	while(times--)
	{
		_nop_();
		i = 32;
		j = 40;
		do
		{
			while (--j);
		} while (--i);
	}
}

void main()
{
	P4M0 |= 0xC0;
	P4M1 &= 0x00;
	
	LED1 = 1;
	LED2 = 1;
	
	while(1){
		LED1 = 0;
		LED2 = 1;
		Delay_ms(200);
		LED1 = 1;
		LED2 = 0;
		Delay_ms(200);
	}
}
按键检测(I/O输入)
cpp 复制代码
#include<stc8hxx.h>
#include<intrins.h>

sbit LED1 = P4^6;
sbit LED2 = P4^7;

sbit KEY1 = P3^5;

void Delay_ms(u16 times)		//@24.000MHz
{
	unsigned char i, j;

	while(times--)
	{
		_nop_();
		i = 32;
		j = 40;
		do
		{
			while (--j);
		} while (--i);
	}
}

void LED_Init()
{
	P4M0 |= 0xC0;
	P4M1 &= 0x00;
	
	LED1 = 1;
	LED2 = 1;
}

void KEY_init()
{
	P3M0 &= ~(0x01<<5);
	P3M1 &= ~(0x01<<5);
	
	P3PU = 0x01<<5;
}

void main()
{
	LED_Init();
	KEY_init();

	while(1){
		if(KEY1 == 0){
				Delay_ms(20);
				if(KEY1 == 0){
					LED1 = ~LED1;
					LED2 = ~LED2;
				}
				while(!KEY1);
		}
	}
}
相关推荐
iCxhust5 小时前
8255 PORTC 按键输入测试
单片机·嵌入式硬件·微机原理
d111111111d8 小时前
在STM32函数指针是什么,怎么使用还有典型应用场景。
笔记·stm32·单片机·嵌入式硬件·学习·算法
♛识尔如昼♛9 小时前
计算机组成原理(21) 第五章 - 总线性能指标
单片机·嵌入式硬件
快乐的划水a10 小时前
windows用户态到内核态
stm32·单片机·嵌入式硬件
Hy行者勇哥10 小时前
从零搭建小智 AI 音箱 MCP 开发环境:自定义智能家居控制技能实战指南
人工智能·嵌入式硬件·硬件工程·智能家居
richxu2025100112 小时前
嵌入式学习之路>单片机核心原理篇>(11) 存储器(Flash & SRam)
单片机·嵌入式硬件·学习
云山工作室13 小时前
基于单片机的客车载客状况自动检测系统设计(论文+源码)
stm32·单片机·嵌入式硬件·毕业设计
Rorsion14 小时前
第二章(2.5):微控制器8051的硬件结构---时钟、复位和MCU工作方式
单片机·嵌入式硬件·备考ing
Qingniu0114 小时前
SP40P65NJ:一款高性能40V P沟道MOSFET深度解析
单片机·嵌入式硬件·电机驱动·dc-dc降压/升压转换器·电源管理模块
brave and determined14 小时前
传感器学习(day10):MEMS传感器:揭秘智能时代的核心技术
嵌入式硬件·汽车电子·传感器·mems·消费电子·嵌入式设计·传感器应用