LCD1602 代码实现字符串显示

下面为LCD1602.c文件代码说明

①引脚的定义:

首先是各引脚的定义,是为了后续更方便的更改引脚,同时定义出每个引脚的高低电平名称,是为了后续更方便的取用高低电平。

②LCD1602的初始化代码:

初始化的过程要包含两个部分

一个是初始化GPIO口(输出形式是推挽输出  低电平触发 故默认上拉电平)代码和其他GPIO口的初始化没有区别

另一个初始化是上电初始化(是固定的 可以不用及流程 需要就直接看)

(1) 延时 15ms
  
(2) 写指令 38H(不检测忙信号)
  
(3) 延时 5ms

(4) 以后每次写指令,读/写数据操作均需要检测忙信号(一般不需要)
(5) 写指令 38H:显示模式设置

(6) 写指令 08H:显示关闭
   
(7) 写指令 01H:显示清屏
 

(8) 写指令 06H:显示光标移动设置

(9) 写指令 0CH:显示开及光标设置

③LCD1602 写指令函数(指令就是在哪个位置写)

要根据LCD1602写的时序图来进行编程  

进行编程

④ LCD1602 写数据函数(数据就是写什么 )

也要根据写的操作时序来进行

⑤  你要显示的东西是什么

可以使用Switch 因为1602是2行 16列的LCD 所以case1  case2   就可以有效的解决这个问题

只需要传入想要的  行   列(首字符的) 和 字符串   就可以

只需要知道首列就可以了  会自动根据你输入的字符串来调整列数

只需传入字符串的首地址 之后利用while循环来实现字符串

代码如下:

#include "lcd1602.h"
#include "delay.h"

//RS引脚定义
#define RS_GPIO_Port    GPIOB
#define RS_GPIO_Pin     GPIO_PIN_1
#define RS_HIGH     HAL_GPIO_WritePin(RS_GPIO_Port, RS_GPIO_Pin, GPIO_PIN_SET);
#define RS_LOW      HAL_GPIO_WritePin(RS_GPIO_Port, RS_GPIO_Pin, GPIO_PIN_RESET);

//RW引脚定义
#define RW_GPIO_Port    GPIOB
#define RW_GPIO_Pin     GPIO_PIN_2
#define RW_HIGH     HAL_GPIO_WritePin(RW_GPIO_Port, RW_GPIO_Pin, GPIO_PIN_SET);
#define RW_LOW      HAL_GPIO_WritePin(RW_GPIO_Port, RW_GPIO_Pin, GPIO_PIN_RESET);

//EN引脚定义
#define EN_GPIO_Port    GPIOB
#define EN_GPIO_Pin     GPIO_PIN_10
#define EN_HIGH     HAL_GPIO_WritePin(EN_GPIO_Port, EN_GPIO_Pin, GPIO_PIN_SET);
#define EN_LOW      HAL_GPIO_WritePin(EN_GPIO_Port, EN_GPIO_Pin, GPIO_PIN_RESET);

void lcd1602_init(void)
{
    //初始化GPIO
    lcd1602_gpio_init();
    //上电初始化
    lcd1602_start();
}

void lcd1602_gpio_init(void)
{
    GPIO_InitTypeDef gpio_initstruct;
    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_GPIOB_CLK_ENABLE();
    
    gpio_initstruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4
                         | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7;          // 两个LED对应的引脚
    gpio_initstruct.Mode = GPIO_MODE_OUTPUT_PP;             // 推挽输出
    gpio_initstruct.Pull = GPIO_PULLUP;                     // 上拉
    gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;           // 高速
    HAL_GPIO_Init(GPIOA, &gpio_initstruct);
    
    gpio_initstruct.Pin = GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_10;          // 两个LED对应的引脚
    gpio_initstruct.Mode = GPIO_MODE_OUTPUT_PP;             // 推挽输出
    gpio_initstruct.Pull = GPIO_PULLUP;                     // 上拉
    gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;           // 高速
    HAL_GPIO_Init(GPIOB, &gpio_initstruct);
}

void lcd1602_start(void)
{
//(1) 延时 15ms
    delay_ms(15);
//(2) 写指令 38H(不检测忙信号)
    lcd1602_write_cmd(0x38);
//(3) 延时 5ms
    delay_ms(5);
//(4) 以后每次写指令,读/写数据操作均需要检测忙信号
//(5) 写指令 38H:显示模式设置
    lcd1602_write_cmd(0x38);
//(6) 写指令 08H:显示关闭
    lcd1602_write_cmd(0x08);
//(7) 写指令 01H:显示清屏
    lcd1602_write_cmd(0x01);
//(8) 写指令 06H:显示光标移动设置
    lcd1602_write_cmd(0x06);
//(9) 写指令 0CH:显示开及光标设置
    lcd1602_write_cmd(0x0C);
}

void lcd1602_write_cmd(char cmd)
{
    RS_LOW;
    RW_LOW;
    EN_LOW;
    GPIOA->ODR = cmd;
    delay_ms(5);
    EN_HIGH;
    delay_ms(5);
    EN_LOW;
}

void lcd1602_write_data(char dataShow)
{
    RS_HIGH;
    RW_LOW;
    EN_LOW;
    GPIOA->ODR = dataShow;
    delay_ms(5);
    EN_HIGH;
    delay_ms(5);
    EN_LOW;
}

void lcd1602_show_char()
{
    //在哪里显示?
    lcd1602_write_cmd(0x80 + 0x02);
    //显示什么?
    lcd1602_write_data('L');
}
void lcd1602_show_line(char row,char col ,char *string)
    
{
    switch(row)
    {
        case 1:
            lcd1602_write_cmd(0x80 + col);
            while(*string)
            {
                lcd1602_write_data(*string);
                      string++;
            }
            break;
        case 2:
            lcd1602_write_cmd(0x80 +0x40 + col);
            while(*string)
            {
                lcd1602_write_data(*string);
                      string++;
            }
            break;
    
    
    }
    
    
    
    
    
}

主函数.c文件如下

#include "sys.h"
#include "delay.h"
#include "led.h"
#include "lcd1602.h"

int main(void)
{
    HAL_Init();                         /* 初始化HAL库 */
    stm32_clock_init(RCC_PLL_MUL9);     /* 设置时钟, 72Mhz */
    led_init();                         /* 初始化LED灯 */
    lcd1602_init();
    //lcd1602_show_char();
    lcd1602_show_line(1,0,"Cao Han is SB");
    lcd1602_show_line(2,0,"LvShiYan is NB");

    while(1)
    { 
//        led1_on();
//        led2_off();
//        delay_ms(500);
//        led1_off();
//        led2_on();
//        delay_ms(500);
    }
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值