基于32的F103C8T6的lcd1602显示屏和LED灯联动,即当LED灯亮时,lcd1602自动从零开始记录,亮一次加一,请编写关于lcd1602的程序以及主程序
时间: 2024-02-13 19:07:25 浏览: 62
好的,以下是基于STM32F103C8T6和LCD1602的C语言程序示例,实现LED灯和LCD显示屏的联动:
```c
#include "stm32f10x.h"
#include "lcd1602.h"
int main(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// 初始化LED灯所在的GPIO口
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
// 初始化LCD显示屏
lcd1602_init();
int count = 0;
while (1)
{
if (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) == Bit_SET)
{
// 如果LED灯亮了,计数器自增1
count++;
// 在LCD屏幕上显示计数器的值
lcd1602_clear(); // 清屏
lcd1602_write_string("Count: ");
lcd1602_write_int(count, 10);
// 等待LED灯变暗
while (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) == Bit_SET);
}
}
}
```
上述程序中,我们使用`GPIO_ReadInputDataBit`函数读取LED灯所在的GPIO口的状态,如果为高电平,则计数器自增1,并在LCD屏幕上显示计数器的值;如果为低电平,则程序会一直等待,直到LED灯亮起。我们使用`lcd1602_clear`函数清屏,并使用`lcd1602_write_string`函数和`lcd1602_write_int`函数将字符串和整数值显示在LCD屏幕上。
此外,为了使用LCD1602,我们还需要编写lcd1602.h和lcd1602.c两个文件。以下是这两个文件的示例代码:
lcd1602.h
```c
#ifndef __LCD1602_H
#define __LCD1602_H
#include "stm32f10x.h"
void lcd1602_init(void);
void lcd1602_write_cmd(uint8_t cmd);
void lcd1602_write_data(uint8_t data);
void lcd1602_write_string(char *str);
void lcd1602_write_int(int num, int radix);
void lcd1602_clear(void);
#endif /* __LCD1602_H */
```
lcd1602.c
```c
#include "lcd1602.h"
static void lcd1602_delay_us(uint32_t us)
{
for (int i = 0; i < us * 8; i++);
}
static void lcd1602_delay_ms(uint32_t ms)
{
for (int i = 0; i < ms * 8000; i++);
}
static void lcd1602_enable_pulse(void)
{
GPIO_SetBits(GPIOB, GPIO_Pin_5);
lcd1602_delay_us(1);
GPIO_ResetBits(GPIOB, GPIO_Pin_5);
lcd1602_delay_us(1);
}
void lcd1602_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// 初始化LCD1602所在的GPIO口
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 初始化LCD1602
lcd1602_delay_ms(15);
lcd1602_write_cmd(0x38); // 8位数据总线,2行显示,5x8点阵字符
lcd1602_write_cmd(0x0c); // 显示开,光标关,闪烁关
lcd1602_write_cmd(0x06); // 光标自动右移,不移动屏幕
lcd1602_clear(); // 清屏
}
void lcd1602_write_cmd(uint8_t cmd)
{
GPIO_ResetBits(GPIOA, GPIO_Pin_0);
GPIO_ResetBits(GPIOB, GPIO_Pin_6 | GPIO_Pin_7);
GPIO_Write(GPIOA, (cmd & 0xf0) >> 4);
lcd1602_enable_pulse();
GPIO_Write(GPIOA, cmd & 0x0f);
lcd1602_enable_pulse();
lcd1602_delay_us(50);
}
void lcd1602_write_data(uint8_t data)
{
GPIO_SetBits(GPIOA, GPIO_Pin_0);
GPIO_ResetBits(GPIOB, GPIO_Pin_6 | GPIO_Pin_7);
GPIO_Write(GPIOA, (data & 0xf0) >> 4);
lcd1602_enable_pulse();
GPIO_Write(GPIOA, data & 0x0f);
lcd1602_enable_pulse();
lcd1602_delay_us(50);
}
void lcd1602_write_string(char *str)
{
while (*str != '\0')
{
lcd1602_write_data(*str);
str++;
}
}
void lcd1602_write_int(int num, int radix)
{
char buf[16];
itoa(num, buf, radix);
lcd1602_write_string(buf);
}
void lcd1602_clear(void)
{
lcd1602_write_cmd(0x01);
lcd1602_delay_ms(2);
}
```
上述程序中,我们使用了`lcd1602_delay_us`函数和`lcd1602_delay_ms`函数实现程序的延时功能;使用了`lcd1602_enable_pulse`函数实现LCD1602的使能脉冲;使用了`lcd1602_write_cmd`函数和`lcd1602_write_data`函数实现向LCD1602写入命令和数据;使用了`lcd1602_write_string`函数和`lcd1602_write_int`函数实现向LCD1602写入字符串和整数值;使用了`lcd1602_clear`函数实现LCD1602的清屏功能。
需要注意的是,上述程序中的GPIO口和库函数可能需要根据具体硬件连接和需求进行修改。
阅读全文