LCD1602.H
#ifndef __LCD1602_H
#define __LCD1602_H
#include"sys.h"
#include "stm32f4xx.h"
//unsigned char message[20];
//unsigned char message2[20];
#define LCD1602_Timer_GPIOD RCC_AHB1Periph_GPIOD
#define LCD1602_GPIOD GPIOD
#define LCD1602_RS GPIO_Pin_8
#define LCD1602_RW GPIO_Pin_9
#define LCD1602_E GPIO_Pin_10
#define LCD1602_IO GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7
#define LCD1602_D0 GPIO_Pin_0
#define LCD1602_D1 GPIO_Pin_1
#define LCD1602_D2 GPIO_Pin_2
#define LCD1602_D3 GPIO_Pin_3
#define LCD1602_D4 GPIO_Pin_4
#define LCD1602_D5 GPIO_Pin_5
#define LCD1602_D6 GPIO_Pin_6
#define LCD1602_D7 GPIO_Pin_7
#define LCD1602_I0_SET() GPIO_SetBits(LCD1602_GPIOD, LCD1602_IO)
#define LCD1602_RS_SET() GPIO_SetBits(LCD1602_GPIOD,LCD1602_RS)
#define LCD1602_RS_RESET() GPIO_ResetBits(LCD1602_GPIOD,LCD1602_RS)
#define LCD1602_RW_SET() GPIO_SetBits(LCD1602_GPIOD,LCD1602_RW)
#define LCD1602_RW_RESET() GPIO_ResetBits(LCD1602_GPIOD,LCD1602_RW)
#define LCD1602_E_SET() GPIO_SetBits(LCD1602_GPIOD,LCD1602_E)
#define LCD1602_E_RESET() GPIO_ResetBits(LCD1602_GPIOD,LCD1602_E)
#define LCD1602_D0_SET() GPIO_SetBits(LCD1602_GPIOD,LCD1602_D0)
#define LCD1602_D0_RESET() GPIO_ResetBits(LCD1602_GPIOD,LCD1602_D0)
#define LCD1602_D1_SET() GPIO_SetBits(LCD1602_GPIOD,LCD1602_D1)
#define LCD1602_D1_RESET() GPIO_ResetBits(LCD1602_GPIOD,LCD1602_D1)
#define LCD1602_D2_SET() GPIO_SetBits(LCD1602_GPIOD,LCD1602_D2)
#define LCD1602_D2_RESET() GPIO_ResetBits(LCD1602_GPIOD,LCD1602_D2)
#define LCD1602_D3_SET() GPIO_SetBits(LCD1602_GPIOD,LCD1602_D3)
#define LCD1602_D3_RESET() GPIO_ResetBits(LCD1602_GPIOD,LCD1602_D3)
#define LCD1602_D4_SET() GPIO_SetBits(LCD1602_GPIOD,LCD1602_D4)
#define LCD1602_D4_RESET() GPIO_ResetBits(LCD1602_GPIOD,LCD1602_D4)
#define LCD1602_D5_SET() GPIO_SetBits(LCD1602_GPIOD,LCD1602_D5)
#define LCD1602_D5_RESET() GPIO_ResetBits(LCD1602_GPIOD,LCD1602_D5)
#define LCD1602_D6_SET() GPIO_SetBits(LCD1602_GPIOD,LCD1602_D6)
#define LCD1602_D6_RESET() GPIO_ResetBits(LCD1602_GPIOD,LCD1602_D6)
#define LCD1602_D7_SET() GPIO_SetBits(LCD1602_GPIOD,LCD1602_D7)
#define LCD1602_D7_RESET() GPIO_ResetBits(LCD1602_GPIOD,LCD1602_D7)
void LCD1602_Init(void);
void LCD1602_ShowChar(unsigned char x,unsigned char y,unsigned char date);
void LCD1602_ShowNum(unsigned char x,unsigned char y,unsigned char *str,unsigned char i);
void LCD1602_ShowStr(unsigned char x,unsigned char y,unsigned char *str);
void LCD1602_WATER(void);
#endif
LCD1602.C
#include "lcd1602.h"
unsigned char message[20] = "Hello world! ";
unsigned char message2[20] = " ";
void LCD1602_GPIO_Init_Out()
{
GPIO_InitTypeDef GPIO_InitStructrue;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
GPIO_InitStructrue.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructrue.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructrue.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructrue.GPIO_Pin = LCD1602_RS | LCD1602_RW | LCD1602_E | LCD1602_IO ;
GPIO_InitStructrue.GPIO_Speed = GPIO_Speed_25MHz;
GPIO_Init(LCD1602_GPIOD, &GPIO_InitStructrue);
LCD1602_RW_RESET();
}
void LCD1602_GPIO_Init_Inupt()
{
GPIO_InitTypeDef GPIO_InitStructrue;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
GPIO_InitStructrue.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructrue.GPIO_Pin = GPIO_Pin_7;
GPIO_Init(LCD1602_GPIOD, &GPIO_InitStructrue);
}
void LCD1602_WaitReady(void)
{
u8 sta = 0;
LCD1602_GPIO_Init_Out();
GPIOD->ODR = 0xff00;
LCD1602_RS_RESET();
LCD1602_RW_SET();
LCD1602_GPIO_Init_Inupt();
do
{
LCD1602_E_SET();
sta = GPIO_ReadInputDataBit(LCD1602_GPIOD, GPIO_Pin_7);
LCD1602_E_RESET();
}
while (sta);
LCD1602_GPIO_Init_Out();
}
void LCD1602_WriteCmd(u16 cmd)
{
LCD1602_WaitReady();
LCD1602_RS_RESET();
LCD1602_RW_RESET();
GPIOD->ODR &= ((cmd << 8) | 0x0000);
if ((cmd & 0x00000001) == 0x00000001)
{
LCD1602_D0_SET();
}
else
{
LCD1602_D0_RESET();
}
if ((cmd & 0x00000002) == 0x00000002)
{
LCD1602_D1_SET();
}
else
{
LCD1602_D1_RESET();
}
if ((cmd & 0x00000004) == 0x00000004)
{
LCD1602_D2_SET();
}
else
{
LCD1602_D2_RESET();
}
if ((cmd & 0x00000008) == 0x00000008)
{
LCD1602_D3_SET();
}
else
{
LCD1602_D3_RESET();
}
if ((cmd & 0x00000010) == 0x00000010)
{
LCD1602_D4_SET();
}
else
{
LCD1602_D4_RESET();
}
if ((cmd & 0x00000020) == 0x00000020)
{
LCD1602_D5_SET();
}
else
{
LCD1602_D5_RESET();
}
if ((cmd & 0x00000040) == 0x00000040)
{
LCD1602_D6_SET();
}
else
{
LCD1602_D6_RESET();
}
if ((cmd & 0x00000080) == 0x00000080)
{
LCD1602_D7_SET();
}
else
{
LCD1602_D7_RESET();
}
LCD1602_E_SET();
LCD1602_E_RESET();
}
void LCD1602_WriteDate(u16 date)
{
LCD1602_WaitReady();
LCD1602_RS_SET();
LCD1602_RW_RESET();
if ((date & 0x00000001) == 0x00000001)
{
LCD1602_D0_SET();
}
else
{
LCD1602_D0_RESET();
}
if ((date & 0x00000002) == 0x00000002)
{
LCD1602_D1_SET();
}
else
{
LCD1602_D1_RESET();
}
if ((date & 0x00000004) == 0x00000004)
{
LCD1602_D2_SET();
}
else
{
LCD1602_D2_RESET();
}
if ((date & 0x00000008) == 0x00000008)
{
LCD1602_D3_SET();
}
else
{
LCD1602_D3_RESET();
}
if ((date & 0x00000010) == 0x00000010)
{
LCD1602_D4_SET();
}
else
{
LCD1602_D4_RESET();
}
if ((date & 0x00000020) == 0x00000020)
{
LCD1602_D5_SET();
}
else
{
LCD1602_D5_RESET();
}
if ((date & 0x00000040) == 0x00000040)
{
LCD1602_D6_SET();
}
else
{
LCD1602_D6_RESET();
}
if ((date & 0x00000080) == 0x00000080)
{
LCD1602_D7_SET();
}
else
{
LCD1602_D7_RESET();
}
LCD1602_E_SET();
LCD1602_E_RESET();
}
void LCD1620_SetAddress(unsigned char x, unsigned char y)
{
if (y == 0)
{
LCD1602_WriteCmd(0x80 | x);
}
else
{
LCD1602_WriteCmd(0x80 | 0x40 | x);
}
}
void LCD1602_ShowStr(unsigned char x, unsigned char y, unsigned char *str)
{
LCD1620_SetAddress(x, y);
while (*str != '\0')
{
LCD1602_WriteDate(*str++);
}
}
void LCD1602_ShowChar(unsigned char x, unsigned char y, unsigned char date)
{
LCD1620_SetAddress(x, y);
LCD1602_WriteDate(date);
}
void LCD1602_ShowNum(unsigned char x, unsigned char y, unsigned char *str, unsigned char i)
{
LCD1620_SetAddress(x, y);
str = str + i;
LCD1602_WriteDate(*str);
}
void LCD1602_Init(void)
{
LCD1602_GPIO_Init_Out();
LCD1602_WriteCmd(0x38);
LCD1602_WriteCmd(0x0c);
LCD1602_WriteCmd(0x06);
LCD1602_WriteCmd(0x01);
LCD1602_ShowStr(0, 0, message);
LCD1602_ShowStr(0, 1, message2);
}
void LCD1602_WATER(void)
{
u16 Counter = 0;
LCD1602_ShowChar(3, 1, 0X30 + Counter % 2);
LCD1602_ShowChar(8, 1, 0X30 + Counter % 2);
LCD1602_ShowChar(12, 1, 0X30 + ((Counter % 1000) / 100));
LCD1602_ShowChar(13, 1, 0X30 + ((Counter % 100) / 10));
LCD1602_ShowChar(14, 1, 0X30 + Counter % 10);
LCD1602_ShowChar(13, 0, 0X30 + ((Counter % 1000) / 100));
LCD1602_ShowChar(14, 0, 0X30 + ((Counter % 100) / 10));
LCD1602_ShowChar(15, 0, 0X30 + Counter % 10);
Counter++;
}