在stm32单片机用寄存器显示LC D1602的代码
时间: 2023-05-26 15:05:47 浏览: 48
以下是在STM32单片机中使用寄存器将数据写入LCD1602的示例代码:
```c
#include "stm32f10x.h"
// 定义两个宏,用于指定连接LCD的GPIO引脚
#define RS_PIN 5 //RS引脚连接到GPIOC5
#define EN_PIN 6 //EN引脚连接到GPIOC6
void delayMs(uint32_t ms) {
for (uint32_t i = 0; i < ms * 1000; i++);
}
void sendData(uint8_t data) {
// 设置RS引脚为数据模式
GPIOC->ODR |= (1 << RS_PIN);
// 先发送高四位
GPIOC->ODR &= ~(0xF << 8); // 先清空掩码位
GPIOC->ODR |= ((data & 0xF0) << 4);
// 上升沿触发EN引脚,使LCD执行指令
GPIOC->ODR |= (1 << EN_PIN);
delayMs(1);
GPIOC->ODR &= ~(1 << EN_PIN);
delayMs(1);
// 再发送低四位
GPIOC->ODR &= ~(0xF << 8);
GPIOC->ODR |= ((data & 0x0F) << 4);
GPIOC->ODR |= (1 << EN_PIN);
delayMs(1);
GPIOC->ODR &= ~(1 << EN_PIN);
delayMs(1);
}
void sendCmd(uint8_t cmd) {
// 设置RS引脚为命令模式
GPIOC->ODR &= ~(1 << RS_PIN);
// 先发送高四位
GPIOC->ODR &= ~(0xF << 8);
GPIOC->ODR |= ((cmd & 0xF0) << 4);
GPIOC->ODR |= (1 << EN_PIN);
delayMs(1);
GPIOC->ODR &= ~(1 << EN_PIN);
delayMs(1);
// 再发送低四位
GPIOC->ODR &= ~(0xF << 8);
GPIOC->ODR |= ((cmd & 0x0F) << 4);
GPIOC->ODR |= (1 << EN_PIN);
delayMs(1);
GPIOC->ODR &= ~(1 << EN_PIN);
delayMs(1);
}
void initLCD() {
// 设置GPIOC的5和6为输出模式
RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;
GPIOC->CRL &= ~(0xFF << 20);
GPIOC->CRL |= (0x33 << 20);
// 首先要等待LCD启动稳定
delayMs(50);
// 先发送三次初始化指令
sendCmd(0x30);
delayMs(5);
sendCmd(0x30);
delayMs(1);
sendCmd(0x30);
delayMs(1);
// 设置4位数据线、2行显示、5x8点阵字符
sendCmd(0x28);
// 关闭显示、清屏、设置光标移动方向为右移
sendCmd(0x08);
sendCmd(0x01);
sendCmd(0x06);
// 打开显示
sendCmd(0x0C);
}
void writeStr(char *str) {
while (*str) {
sendData(*str++);
}
}
int main(void) {
initLCD();
while (1) {
sendCmd(0x80); //设置光标位置为第一行的第一个字符位置
writeStr("Hello, world!");
delayMs(1000);
sendCmd(0x01); //清屏
delayMs(1000);
}
}
```
代码注释中有对各个步骤的说明,可以根据需求进行调整。