单片机寄存器配置gpio和库函数配置gpio的优缺点
时间: 2024-06-13 20:05:13 浏览: 13
单片机寄存器配置GPIO和库函数配置GPIO各有优缺点。单片机寄存器配置GPIO需要手动编写代码,需要了解寄存器的具体作用和配置方法,但是可以更加精细地控制GPIO的各项参数,可以更好地满足特定的需求。而库函数配置GPIO则更加简便,不需要手动编写代码,只需要调用相应的函数即可,但是可能会存在一些限制,无法满足特定的需求。
相关问题
编写程序,分别用直接操作I/O寄存器、操作位带区、库函数三种方式实现GPIO 端口初始化和输入输出功能
好的,以下是三种不同方式实现GPIO端口初始化和输入输出功能的代码示例:
## 直接操作I/O寄存器
```c
#include <reg51.h>
sbit LED = P0^0; // 定义LED灯对应的GPIO端口
void main()
{
LED = 0; // 初始化LED灯状态为熄灭
P1 = 0xFF; // 将P1口设置为输入模式
while(1)
{
if(P1_0 == 0) // 检测P1.0引脚的状态
{
LED = ~LED; // 翻转LED灯的状态
while(!P1_0); // 等待P1.0引脚状态恢复
}
}
}
```
在以上代码中,我们使用了单片机的SFR寄存器`P0`和`P1`来分别控制LED灯和输入端口的状态,通过设置引脚的高低电平来控制LED灯的亮灭,并通过检测输入端口的状态来判断是否需要翻转LED灯的状态。
## 操作位带区
```c
#include <reg51.h>
#define LED_BIT 0 // 定义LED灯对应的位带区位号
#define LED *(unsigned char volatile sfr*)0x90 // 定义LED灯对应的位带区地址
#define KEY_BIT 0 // 定义按键对应的位带区位号
#define KEY *(unsigned char volatile sfr*)0x91 // 定义按键对应的位带区地址
void main()
{
LED = 0; // 初始化LED灯状态为熄灭
KEY = 0xFF; // 将按键对应的位带区设置为输入模式
while(1)
{
if(!(KEY & (1 << KEY_BIT))) // 检测按键的状态
{
LED ^= (1 << LED_BIT); // 翻转LED灯的状态
while(!(KEY & (1 << KEY_BIT))); // 等待按键状态恢复
}
}
}
```
在以上代码中,我们使用了位带区来控制LED灯和输入端口的状态,通过设置位带区的某一位来控制LED灯的亮灭,并通过检测位带区的某一位来判断是否需要翻转LED灯的状态。
## 库函数方式
```c
#include <reg51.h>
#include <intrins.h>
sbit LED = P0^0; // 定义LED灯对应的GPIO端口
void main()
{
LED = 0; // 初始化LED灯状态为熄灭
P1 = 0xFF; // 将P1口设置为输入模式
while(1)
{
if(!P1_0) // 检测P1.0引脚的状态
{
LED = ~LED; // 翻转LED灯的状态
while(!P1_0); // 等待P1.0引脚状态恢复
}
}
}
```
在以上代码中,我们使用了单片机的库函数`intrins.h`中提供的宏定义来实现GPIO端口的初始化和输入输出控制,通过设置GPIO端口的输入输出模式和状态来控制LED灯的亮灭,并通过检测输入端口的状态来判断是否需要翻转LED灯的状态。
在stm32单片机用寄存器显示LCD1602代码
以下是在STM32单片机中使用寄存器显示LCD1602的示例代码:
```c
#include "stm32f10x.h"
/* LCD1602引脚定义 */
#define LCD_RS_PIN GPIO_Pin_0
#define LCD_RW_PIN GPIO_Pin_1
#define LCD_E_PIN GPIO_Pin_2
#define LCD_DATA_PIN 0xFF00 // PB8~15
/* 读写LCD数据 */
void LCD_write_data(uint8_t data) {
GPIOB->ODR = data | LCD_RS_PIN | LCD_E_PIN;
GPIOB->ODR = data | LCD_RS_PIN;
GPIOB->ODR = data | LCD_E_PIN;
}
/* 读写LCD指令 */
void LCD_write_cmd(uint8_t cmd) {
GPIOB->ODR = cmd | LCD_E_PIN;
GPIOB->ODR = cmd;
GPIOB->ODR = cmd | LCD_E_PIN;
}
/* LCD初始化 */
void LCD_init(void) {
/* 配置GPIOB为输出模式 */
RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;
GPIOB->CRL = 0x33333333;
GPIOB->CRH = 0x33333333;
GPIOB->BSRR = LCD_DATA_PIN; // 置高8位数据线
/* 开始初始化 */
GPIOB->BSRR = LCD_RW_PIN | LCD_E_PIN; // 先将读/写和使能信号都置高
GPIOB->BSRR = LCD_RW_PIN;
LCD_write_cmd(0x38); // 8位数据总线,2行显示,5x7点阵字符
LCD_write_cmd(0x0C); // 显示开,关游标,不闪烁
LCD_write_cmd(0x06); // 游标右移,不滚屏
LCD_write_cmd(0x01); // 清屏幕
}
/* 在LCD上写入字符串 */
void LCD_write_string(uint8_t* str) {
while (*str) {
LCD_write_data(*str++);
}
}
int main(void) {
/* 启动时钟 */
RCC->CR |= RCC_CR_HSEON;
while (!(RCC->CR & RCC_CR_HSERDY));
RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;
AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_JTAGDISABLE;
RCC->CFGR |= RCC_CFGR_PLLXTPRE_HSE_DIV2;
RCC->CFGR |= RCC_CFGR_PLLSRC;
RCC->CFGR |= RCC_CFGR_PLLMULL9;
RCC->CR |= RCC_CR_PLLON;
while (!(RCC->CR & RCC_CR_PLLRDY));
RCC->CFGR |= RCC_CFGR_SW_PLL;
while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL);
/* 初始化LCD */
LCD_init();
/* 在LCD上打印字符串 */
LCD_write_string("Hello, STM32!");
while (1);
}
```
这段代码使用`RCC`和`GPIO`寄存器配置STM32单片机的时钟和GPIO端口,然后使用`LCD_write_cmd`和`LCD_write_data`函数分别读写LCD指令和数据。这种使用寄存器的方式相对于使用库函数,可以更加灵活地控制硬件,且无需使用第三方库。