在stm32单片机用寄存器显示LCD1602代码
时间: 2023-05-26 08:06:00 浏览: 285
以下是在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指令和数据。这种使用寄存器的方式相对于使用库函数,可以更加灵活地控制硬件,且无需使用第三方库。
阅读全文