GPIO是什么?和单片机、ARM上的引脚是一个概念么

GPIO 是 General Purpose Input Output(通用输入/输出)的缩写,简称为GPIO;
单片机上引出的引脚,可以软件设置成输出或是输入。

GPIO这个问题很多人都混淆。

本身的概念
GPIO是General-Purpose Input / Output。
-------------
到了单片机上,单片机有很多管脚(PIN)

-------------
PIN除了一些特殊的,比如电源,比如地线,晶振接线等等,很多都可以任意定义成两种功能中的一种:1. 模块的管脚,2. GPIO

--------------
当定义为模块管脚时,PIN起模块中定义的功能。比如定义成SPI模块的管脚,那就按照具体芯片的规定,或者定义成MOSI,或者定义成MISO,或者定义成SCLK,这些不是任意的。SPI是模块,MISO等是功能管脚。

--------------
当定义成GPIO时,可以定义成高阻,输入,或者输出。这时候,就可以用作操作控制位,点LED灯等功能了。

--------------
很多模块的功能管脚,严格意义上来讲也是IO,比如CANH,CANL,所以这里为了避免混淆,就将没有定义成模块功能管脚的那些单片机管脚定义成General Purpose的IO了,以示区别。

 

GPIO的英文全称General-Purpose Input /Output Ports,中文意思是通用I/O端口
在嵌入式系统中,经常需要控制许多结构简单的外部设备或者电路,这些设备有的需要通过CPU控制,有的需要CPU提供输入信号。并且,许多设备或电路只要求有开/关两种状体就够了,比如LED的亮与灭。对这些设备的控制,使用传统的串口或者并口就显得比较复杂,所以,在嵌入式微处理器上通常提供了一种“通用可编程I/O端口”,也就是GPIO。

一个GPIO端口至少需要两个寄存器,一个做控制用的“通用IO端口控制寄存器”,还有一个是存放数据的“通用I/O端口数据寄存器”。数据寄存器的每一位是和GPIO的硬件引脚对应的,而数据的传递方向是通过控制寄存器设置的,通过控制寄存器可以设置每一位引脚的数据流向。
(GPIO相关的寄存器有,IOPIN、IOSET、IOCLR、IODIR四个寄存器。)

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以STC89C52单片机为例,以下是基于C语言编写的32单片机按键按下后在OLED上显示一个数字的简单代码: ```c #include <reg52.h> sbit keypad = P2^4; // 按键连接到P2.4引脚 sbit rs = P2^0; // OLED的RS引脚连接到P2.0引脚 sbit rw = P2^1; // OLED的RW引脚连接到P2.1引脚 sbit en = P2^2; // OLED的EN引脚连接到P2.2引脚 #define DataPort P1 // OLED的数据口连接到P1口 void delay_ms(unsigned int ms) { unsigned int i, j; for(i = 0; i < ms; i++) { for(j = 0; j < 114; j++); // 1ms延时,实际情况可能需要根据实际板子调整 } } void write_command(unsigned char command) { rs = 0; // 将RS置为低,表示发送的是指令 rw = 0; // 将RW置为低,表示写入数据 en = 1; // 将EN置为高,表示使能 DataPort = command; // 将要发送的指令写入数据口 delay_ms(5); // 延时一段时间确保数据稳定 en = 0; // 将EN置为低,表示使能结束 } void write_data(unsigned char dat) { rs = 1; // 将RS置为高,表示发送的是数据 rw = 0; // 将RW置为低,表示写入数据 en = 1; // 将EN置为高,表示使能 DataPort = dat; // 将要发送的数据写入数据口 delay_ms(5); // 延时一段时间确保数据稳定 en = 0; // 将EN置为低,表示使能结束 } void main() { unsigned char num = 0; write_command(0x38); // OLED初始化,设置显示模式为2行8位数据接口 write_command(0x0c); // 设置OLED显示开,关光标 write_command(0x06); // 光标移动后显示的内容不动 write_command(0x01); // 清屏 while(1) { if(keypad == 0) { // 检测按键是否按下 delay_ms(20); // 延时一段时间消除抖动 if(keypad == 0) { // 再次检测按键是否按下 num++; // 数字加一 write_command(0x01); // 清屏 write_data(num + '0'); // 显示数字 while(!keypad); // 等待按键释放 } } } } ``` 以上代码是一个简单的例子,可以根据实际需求进行修改和扩展。 ### 回答2: 32单片机是指基于ARM Cortex-M内核的32位单片机,例如STM32系列。对于按键输入和OLED显示,可以使用对应的外设和库函数来实现。 以下是一个简单的示例代码,假设按键连接到单片机GPIO引脚,OLED通过I2C总线连接(使用I2C库函数): ```c #include "stm32f10x.h" #include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h" #include "stm32f10x_i2c.h" #include "OLED.h" // OLED相关库函数头文件 // 检测按键是否按下 uint8_t checkButtonPressed(void) { if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_SET) { return 1; } else { return 0; } } // 初始化按键GPIO void initButton(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 设置输入模式并且开启上拉电阻 GPIO_Init(GPIOA, &GPIO_InitStructure); } // 初始化OLED void initOLED(void) { OLED_Init(); OLED_Clear(); } int main(void) { initButton(); // 初始化按键 initOLED(); // 初始化OLED while(1) { if(checkButtonPressed()) { // 如果按键按下 int number = 8; // 设置要显示的数字 OLED_ShowNum(0, 0, number, 1, 16); // 在OLED的坐标(0, 0)处显示数字 while(checkButtonPressed()) {} // 等待按键释放 } } } ``` 注意:此代码仅为示例,具体的引脚、库函数以及OLED库需要根据实际使用的单片机型号和硬件连接进行适配。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值