STM32F407的LCD1602液晶显示程序

20 篇文章 1 订阅

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++;
}

  • 1
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值