• 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()<

     

     

     

     

  • 相关阅读:
    C++中的多态
    leetcode每日一题第五十六天
    微机原理_10
    解读APS及其效益
    Oracle partition分区表(一)-----范围分区、列表分区、哈希分区
    HDRP shader 获取深度值(方便地)
    SpringBoot SSMP项目搭建保姆级教程
    嵌入式C常见面试题
    路径某个位置更换名称-python
    说说Mysql的四种隔离级别
  • 原文地址:https://blog.csdn.net/wangz76/article/details/127672387