• STM32CubeIDE 操作 LCD1602


    c84cc0d93d954f0e8f0f71bc234e2d56.jpeg

     4d99696bc5324b629db0b9dacd09347d.jpeg

    78c5efe1a17444de947bcdf07a9f2667.jpeg

    9306c60f653b41b0b34309953b939daf.jpeg

    5f31b3ebda654c50b6b7a582c04055b0.jpeg

    065ec02f8b184af3930f6665bb380959.jpeg

    00981c6452fb44ac988929ab38e5b312.jpeg

    74f700252e8f450d8a635d5f6957a0e5.jpeg

    d91350f01f6442e2aa6c0b297c3cd6f8.jpeg补充内容:

    43ec69d4afdf4507b342554489ee091c.jpegf9a570848a6c40af94d9d1047164249d.jpeg 注意:所有的指令、数据读写都需要 "E" 有一个脉冲。

    STM32CubeIDE首先要对芯片初始化,如图:

    ff64284c4a7844799ab5c969d78ba491.png

    820054db83a04c44af03403c5947fc32.png

     书中的代码很全面但是不利于理解,简化一下,总体思路。

     1、通过RS引脚确定是写数据还是写指令。

    2、读写控制端(RW)设置为写模式。

    3、把数据或指令送到数据线上。(D0~D7)

    4、给E一个高脉冲,将数据送入液晶控制器。


        WriteData(0x38);

    /* 准备D0~D7 数据,设置16*2显示,5*7点阵,8位数据接口。

    7887bba3632a4706b34b4505c47ac237.png

     */


        HAL_GPIO_WritePin(GPIOA, RS_Pin, GPIO_PIN_RESET); 
        HAL_GPIO_WritePin(GPIOA, RW_Pin, GPIO_PIN_RESET);
        HAL_GPIO_WritePin(GPIOA, E_Pin, GPIO_PIN_RESET);

        HAL_GPIO_WritePin(GPIOA,RS_Pin,GPIO_PIN_RESET);
        HAL_GPIO_WritePin(GPIOA,RW_Pin,GPIO_PIN_RESET);
        HAL_GPIO_WritePin(GPIOA,E_Pin,GPIO_PIN_SET);
        __NOP();
        HAL_GPIO_WritePin(GPIOA,E_Pin,GPIO_PIN_RESET);
        HAL_Delay(2);


        WriteData(0x01);

    /* 准备D0~D7 数据,显示清零,数据指针清零。

    4cb3a5d810a74fbfa40b205e7602a8c9.png

     */


        HAL_GPIO_WritePin(GPIOA,RS_Pin,GPIO_PIN_RESET);
        HAL_GPIO_WritePin(GPIOA,RW_Pin,GPIO_PIN_RESET);
        HAL_GPIO_WritePin(GPIOA,E_Pin,GPIO_PIN_RESET);

        HAL_GPIO_WritePin(GPIOA,RS_Pin,GPIO_PIN_RESET);
        HAL_GPIO_WritePin(GPIOA,RW_Pin,GPIO_PIN_RESET);
        HAL_GPIO_WritePin(GPIOA,E_Pin,GPIO_PIN_SET);
        __NOP();
        HAL_GPIO_WritePin(GPIOA,E_Pin,GPIO_PIN_RESET);


        WriteData(0x06);

    /*准备D0~D7 数据,写一个字符后地址指针加1

    watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBARElKSUFORzMyMQ==,size_20,color_FFFFFF,t_70,g_se,x_16

     */
        HAL_GPIO_WritePin(GPIOA,RS_Pin,GPIO_PIN_RESET);
        HAL_GPIO_WritePin(GPIOA,RW_Pin,GPIO_PIN_RESET);
        HAL_GPIO_WritePin(GPIOA,E_Pin,GPIO_PIN_RESET);

        HAL_GPIO_WritePin(GPIOA,RS_Pin,GPIO_PIN_RESET);
        HAL_GPIO_WritePin(GPIOA,RW_Pin,GPIO_PIN_RESET);
        HAL_GPIO_WritePin(GPIOA,E_Pin,GPIO_PIN_SET);
        __NOP();
        HAL_GPIO_WritePin(GPIOA,E_Pin,GPIO_PIN_RESET);
        HAL_Delay(2);


        WriteData(0x0c);

    /*准备D0~D7 数据,设置开显示,不显示光标。码表见上图*/
        HAL_GPIO_WritePin(GPIOA,RS_Pin,GPIO_PIN_RESET);
        HAL_GPIO_WritePin(GPIOA,RW_Pin,GPIO_PIN_RESET);
        HAL_GPIO_WritePin(GPIOA,E_Pin,GPIO_PIN_RESET);

        HAL_GPIO_WritePin(GPIOA,RS_Pin,GPIO_PIN_RESET);
        HAL_GPIO_WritePin(GPIOA,RW_Pin,GPIO_PIN_RESET);
        HAL_GPIO_WritePin(GPIOA,E_Pin,GPIO_PIN_SET);
        __NOP();
        HAL_GPIO_WritePin(GPIOA,E_Pin,GPIO_PIN_RESET);
        HAL_Delay(2);


        WriteData(0x80);

    /*定位*/
        HAL_GPIO_WritePin(GPIOA,RS_Pin,GPIO_PIN_RESET);
        HAL_GPIO_WritePin(GPIOA,RW_Pin,GPIO_PIN_RESET);
        HAL_GPIO_WritePin(GPIOA,E_Pin,GPIO_PIN_RESET);

        HAL_GPIO_WritePin(GPIOA,RS_Pin,GPIO_PIN_RESET);
        HAL_GPIO_WritePin(GPIOA,RW_Pin,GPIO_PIN_RESET);
        HAL_GPIO_WritePin(GPIOA,E_Pin,GPIO_PIN_SET);
        __NOP();
        HAL_GPIO_WritePin(GPIOA,E_Pin,GPIO_PIN_RESET);
        HAL_Delay(2);


        WriteData('W');

    /*写入字符“W”*/
        HAL_GPIO_WritePin(GPIOA, RS_Pin, GPIO_PIN_SET);
        HAL_GPIO_WritePin(GPIOA, RW_Pin, GPIO_PIN_RESET);
        HAL_GPIO_WritePin(GPIOA, E_Pin, GPIO_PIN_RESET);

        HAL_GPIO_WritePin(GPIOA,RS_Pin,GPIO_PIN_SET);
        HAL_GPIO_WritePin(GPIOA,RW_Pin,GPIO_PIN_RESET);
        HAL_GPIO_WritePin(GPIOA,E_Pin,GPIO_PIN_SET);
        __NOP();
        HAL_GPIO_WritePin(GPIOA,E_Pin,GPIO_PIN_RESET);
        HAL_Delay(2);

    07933c01fe5c462ba8b2dd3fac50c451.png

    懂了噻:) 

     WriteData 函数用qt改写了一下,就知道为什么要这么弄了:)

            unsigned char dat=0x38;
            unsigned short Set_Pins=0;
            unsigned short Rst_Pins=0;
            if(dat & 0x01)Set_Pins|=0x0001;
            else          Rst_Pins|=0x0001;
            if(dat & 0x02)Set_Pins|=0x0002;
            else          Rst_Pins|=0x0002;
            if(dat & 0x04)Set_Pins|=0x0004;
            else          Rst_Pins|=0x0004;
            if(dat & 0x08)Set_Pins|=0x0008;
            else          Rst_Pins|=0x0008;
            if(dat & 0x10)Set_Pins|=0x0010;
            else          Rst_Pins|=0x0010;
            if(dat & 0x20)Set_Pins|=0x0020;
            else          Rst_Pins|=0x0020;
            if(dat & 0x40)Set_Pins|=0x0040;
            else          Rst_Pins|=0x0040;
            if(dat & 0x80)Set_Pins|=0x0080;
            else          Rst_Pins|=0x0080;
            qDebug()<

     

     

     

     

  • 相关阅读:
    小程序canvas画画板签字版,touchmove时卡顿的问题(根本原因是因为vue语法中page.data导致视图层和逻辑层的频繁通讯导致)
    stable-diffusion-webui安装Wav2Lip
    谈谈自购和客供物料的切换问题
    【MM32F5270开发板试用】一、让MM32F5270支持RT-Thread~打通串口UART
    《Spring Security 简易速速上手小册》第1章 Spring Security 概述(2024 最新版)
    (六)Ansible-Template
    MySQL对日期计算
    离开二线城市石家庄(勉强算二线吧)去北漂,入职外包测试岗一个月想辞职了~
    【网络】计算机网络基础
    《计算机体系结构量化研究方法第六版》1.6 成本趋势
  • 原文地址:https://blog.csdn.net/wangz76/article/details/127672387