lcd1602的stm32f103c6的代码.c和.h,以及对应的delay.c和.h,says.c和.h
时间: 2024-03-07 21:50:29 浏览: 79
以下是一个简单的LCD1602的STM32F103C6代码,包括了lcd1602.c和lcd1602.h文件,以及对应的delay.c和delay.h,以及says.c和says.h文件。
lcd1602.h文件:
```c
#ifndef __LCD1602_H__
#define __LCD1602_H__
#include "stm32f10x.h"
#define LCD1602_GPIO_RCC RCC_APB2Periph_GPIOB //LCD1602所在GPIO的时钟
#define LCD1602_GPIO GPIOB //LCD1602所在GPIO
#define LCD1602_E_PIN GPIO_Pin_0 //LCD1602的E引脚
#define LCD1602_RS_PIN GPIO_Pin_1 //LCD1602的RS引脚
#define LCD1602_RW_PIN GPIO_Pin_2 //LCD1602的RW引脚
#define LCD1602_DATA_PINS GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6 //LCD1602的数据引脚
void LCD1602_Init(void);
void LCD1602_WriteCmd(uint8_t cmd);
void LCD1602_WriteData(uint8_t data);
void LCD1602_SetCursor(uint8_t x, uint8_t y);
void LCD1602_Clear(void);
void LCD1602_DisplayString(char* str);
void LCD1602_DisplayNum(uint16_t num);
#endif
```
lcd1602.c文件:
```c
#include "lcd1602.h"
#include "delay.h"
//LCD1602初始化函数
void LCD1602_Init(void)
{
RCC_APB2PeriphClockCmd(LCD1602_GPIO_RCC, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = LCD1602_E_PIN | LCD1602_RS_PIN | LCD1602_RW_PIN | LCD1602_DATA_PINS;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LCD1602_GPIO, &GPIO_InitStructure);
GPIO_WriteBit(LCD1602_GPIO, LCD1602_E_PIN, Bit_RESET);
GPIO_WriteBit(LCD1602_GPIO, LCD1602_RS_PIN, Bit_RESET);
GPIO_WriteBit(LCD1602_GPIO, LCD1602_RW_PIN, Bit_RESET);
LCD1602_WriteCmd(0x38);
LCD1602_WriteCmd(0x06);
LCD1602_WriteCmd(0x0C);
LCD1602_WriteCmd(0x01);
}
//LCD1602写命令函数
void LCD1602_WriteCmd(uint8_t cmd)
{
GPIO_WriteBit(LCD1602_GPIO, LCD1602_RS_PIN, Bit_RESET);
GPIO_WriteBit(LCD1602_GPIO, LCD1602_RW_PIN, Bit_RESET);
GPIO_WriteBit(LCD1602_GPIO, LCD1602_DATA_PINS, (cmd >> 4) & 0x0F);
GPIO_WriteBit(LCD1602_GPIO, LCD1602_E_PIN, Bit_SET);
Delay_us(1);
GPIO_WriteBit(LCD1602_GPIO, LCD1602_E_PIN, Bit_RESET);
GPIO_WriteBit(LCD1602_GPIO, LCD1602_DATA_PINS, cmd & 0x0F);
GPIO_WriteBit(LCD1602_GPIO, LCD1602_E_PIN, Bit_SET);
Delay_us(1);
GPIO_WriteBit(LCD1602_GPIO, LCD1602_E_PIN, Bit_RESET);
Delay_us(50);
}
//LCD1602写数据函数
void LCD1602_WriteData(uint8_t data)
{
GPIO_WriteBit(LCD1602_GPIO, LCD1602_RS_PIN, Bit_SET);
GPIO_WriteBit(LCD1602_GPIO, LCD1602_RW_PIN, Bit_RESET);
GPIO_WriteBit(LCD1602_GPIO, LCD1602_DATA_PINS, (data >> 4) & 0x0F);
GPIO_WriteBit(LCD1602_GPIO, LCD1602_E_PIN, Bit_SET);
Delay_us(1);
GPIO_WriteBit(LCD1602_GPIO, LCD1602_E_PIN, Bit_RESET);
GPIO_WriteBit(LCD1602_GPIO, LCD1602_DATA_PINS, data & 0x0F);
GPIO_WriteBit(LCD1602_GPIO, LCD1602_E_PIN, Bit_SET);
Delay_us(1);
GPIO_WriteBit(LCD1602_GPIO, LCD1602_E_PIN, Bit_RESET);
Delay_us(50);
}
//LCD1602设置光标位置函数
void LCD1602_SetCursor(uint8_t x, uint8_t y)
{
uint8_t addr = 0;
if (y == 0) {
addr = 0x00 + x;
} else {
addr = 0x40 + x;
}
LCD1602_WriteCmd(0x80 + addr);
}
//LCD1602清屏函数
void LCD1602_Clear(void)
{
LCD1602_WriteCmd(0x01);
}
//LCD1602显示字符串函数
void LCD1602_DisplayString(char* str)
{
while (*str) {
LCD1602_WriteData(*str++);
}
}
//LCD1602显示数字函数
void LCD1602_DisplayNum(uint16_t num)
{
char str[6];
sprintf(str, "%d", num);
LCD1602_DisplayString(str);
}
```
delay.h文件:
```c
#ifndef __DELAY_H__
#define __DELAY_H__
#include "stm32f10x.h"
void Delay_us(uint32_t us);
void Delay_ms(uint16_t ms);
#endif
```
delay.c文件:
```c
#include "delay.h"
volatile uint32_t g_Ticks;
void SysTick_Handler(void)
{
g_Ticks++;
}
void Delay_us(uint32_t us)
{
uint32_t ticks = us * (SystemCoreClock / 1000000);
uint32_t start = g_Ticks;
while ((g_Ticks - start) < ticks);
}
void Delay_ms(uint16_t ms)
{
while (ms--) {
Delay_us(1000);
}
}
```
says.h文件:
```c
#ifndef __SAYS_H__
#define __SAYS_H__
#include "stm32f10x.h"
void SaysHello(void);
#endif
```
says.c文件:
```c
#include "says.h"
#include "lcd1602.h"
void SaysHello(void)
{
LCD1602_DisplayString("Hello, World!");
}
```
阅读全文