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);
		}
	}
}
相关推荐
智商偏低3 小时前
单片机之helloworld
单片机·嵌入式硬件
青牛科技-Allen4 小时前
GC3910S:一款高性能双通道直流电机驱动芯片
stm32·单片机·嵌入式硬件·机器人·医疗器械·水泵、
白鱼不小白6 小时前
stm32 USART串口协议与外设(程序)——江协教程踩坑经验分享
stm32·单片机·嵌入式硬件
S,D7 小时前
MCU引脚的漏电流、灌电流、拉电流区别是什么
驱动开发·stm32·单片机·嵌入式硬件·mcu·物联网·硬件工程
芯岭技术10 小时前
PY32F002A单片机 低成本控制器解决方案,提供多种封装
单片机·嵌入式硬件
youmdt10 小时前
Arduino IDE ESP8266连接0.96寸SSD1306 IIC单色屏显示北京时间
单片机·嵌入式硬件
嘿·嘘11 小时前
第七章 STM32内部FLASH读写
stm32·单片机·嵌入式硬件
几个几个n13 小时前
STM32-第二节-GPIO输入(按键,传感器)
单片机·嵌入式硬件
Despacito0o16 小时前
ESP32-s3摄像头驱动开发实战:从零搭建实时图像显示系统
人工智能·驱动开发·嵌入式硬件·音视频·嵌入式实时数据库
门思科技17 小时前
设计可靠 LoRaWAN 设备时需要考虑的关键能力
运维·服务器·网络·嵌入式硬件·物联网