基于32单片机F103C8T6的人体红外自动门控系统,使用hscr501模块,使用led灯亮模拟开门,灯灭关门,利用lcd1602a显示记录人数,请帮我写出32的lcd1602a初始化程序以及在主程序里面的内容
时间: 2024-02-13 13:05:07 浏览: 18
好的,以下是基于32单片机F103C8T6的lcd1602a初始化程序:
```
#include "stm32f10x.h"
#define LCD_GPIO GPIOB
#define LCD_RS GPIO_Pin_0
#define LCD_RW GPIO_Pin_1
#define LCD_EN GPIO_Pin_2
#define LCD_D4 GPIO_Pin_3
#define LCD_D5 GPIO_Pin_4
#define LCD_D6 GPIO_Pin_5
#define LCD_D7 GPIO_Pin_6
void LCD_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = LCD_RS | LCD_RW | LCD_EN | LCD_D4 | LCD_D5 | LCD_D6 | LCD_D7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LCD_GPIO, &GPIO_InitStructure);
GPIO_ResetBits(LCD_GPIO, LCD_EN);
GPIO_ResetBits(LCD_GPIO, LCD_RS);
GPIO_ResetBits(LCD_GPIO, LCD_RW);
GPIO_SetBits(LCD_GPIO, LCD_D4);
GPIO_SetBits(LCD_GPIO, LCD_D5);
GPIO_SetBits(LCD_GPIO, LCD_D6);
GPIO_SetBits(LCD_GPIO, LCD_D7);
delay_ms(20);
LCD_WriteCommand(0x28);
LCD_WriteCommand(0x0C);
LCD_WriteCommand(0x06);
LCD_WriteCommand(0x01);
}
void LCD_WriteCommand(uint8_t command)
{
GPIO_ResetBits(LCD_GPIO, LCD_RS);
GPIO_ResetBits(LCD_GPIO, LCD_RW);
GPIO_WriteBit(LCD_GPIO, LCD_D7, (BitAction)(command & 0x80));
GPIO_WriteBit(LCD_GPIO, LCD_D6, (BitAction)(command & 0x40));
GPIO_WriteBit(LCD_GPIO, LCD_D5, (BitAction)(command & 0x20));
GPIO_WriteBit(LCD_GPIO, LCD_D4, (BitAction)(command & 0x10));
GPIO_SetBits(LCD_GPIO, LCD_EN);
delay_ms(1);
GPIO_ResetBits(LCD_GPIO, LCD_EN);
GPIO_WriteBit(LCD_GPIO, LCD_D7, (BitAction)(command & 0x08));
GPIO_WriteBit(LCD_GPIO, LCD_D6, (BitAction)(command & 0x04));
GPIO_WriteBit(LCD_GPIO, LCD_D5, (BitAction)(command & 0x02));
GPIO_WriteBit(LCD_GPIO, LCD_D4, (BitAction)(command & 0x01));
GPIO_SetBits(LCD_GPIO, LCD_EN);
delay_ms(1);
GPIO_ResetBits(LCD_GPIO, LCD_EN);
}
void LCD_WriteData(uint8_t data)
{
GPIO_SetBits(LCD_GPIO, LCD_RS);
GPIO_ResetBits(LCD_GPIO, LCD_RW);
GPIO_WriteBit(LCD_GPIO, LCD_D7, (BitAction)(data & 0x80));
GPIO_WriteBit(LCD_GPIO, LCD_D6, (BitAction)(data & 0x40));
GPIO_WriteBit(LCD_GPIO, LCD_D5, (BitAction)(data & 0x20));
GPIO_WriteBit(LCD_GPIO, LCD_D4, (BitAction)(data & 0x10));
GPIO_SetBits(LCD_GPIO, LCD_EN);
delay_ms(1);
GPIO_ResetBits(LCD_GPIO, LCD_EN);
GPIO_WriteBit(LCD_GPIO, LCD_D7, (BitAction)(data & 0x08));
GPIO_WriteBit(LCD_GPIO, LCD_D6, (BitAction)(data & 0x04));
GPIO_WriteBit(LCD_GPIO, LCD_D5, (BitAction)(data & 0x02));
GPIO_WriteBit(LCD_GPIO, LCD_D4, (BitAction)(data & 0x01));
GPIO_SetBits(LCD_GPIO, LCD_EN);
delay_ms(1);
GPIO_ResetBits(LCD_GPIO, LCD_EN);
}
void LCD_Clear(void)
{
LCD_WriteCommand(0x01);
delay_ms(2);
}
void LCD_SetCursor(uint8_t row, uint8_t col)
{
uint8_t address;
if (row == 0)
{
address = 0x80 + col;
}
else
{
address = 0xC0 + col;
}
LCD_WriteCommand(address);
}
void LCD_WriteString(uint8_t row, uint8_t col, uint8_t *str)
{
LCD_SetCursor(row, col);
while (*str)
{
LCD_WriteData(*str++);
}
}
```
在主程序中,你需要初始化LCD并通过LCD显示所需的信息。下面是一个示例程序,可以帮助你了解如何将人数记录显示在LCD上:
```
#include "stm32f10x.h"
int main(void)
{
uint8_t count = 0;
uint8_t str[16];
LCD_Init();
while (1)
{
// 检测人体红外信号
if (/* 人体红外信号有效 */)
{
// 亮灯
/* 代码省略 */
// 记录人数
count++;
// 在LCD上显示人数
sprintf(str, "Count: %d", count);
LCD_WriteString(0, 0, str);
}
else
{
// 灭灯
/* 代码省略 */
}
}
}
```
请注意,这只是一个示例程序,你需要根据你的要求进行修改和调整。