LCD1602遇到新问题,上电显示所有点阵

2019-07-20 08:32发布

本帖最后由 杉侠 于 2017-4-5 13:57 编辑

在使用STM32F7阿波罗的开发板写LCD1602的时候,出现上电跑程序后所有点阵都显示,从屏的正面看不出有字输出,但是侧一点就看的出来程序里的字母已经显示,这是什么问题,时序上有问题吗?
下面是代码:

#ifndef _LCD1602_H
#define _LCD1602_H
#include "sys.h"

#define lcd1602_RS(n)   (n?HAL_GPIO_WritePin(GPIOD,GPIO_PIN_8,GPIO_PIN_SET):HAL_GPIO_WritePin(GPIOD,GPIO_PIN_8,GPIO_PIN_RESET))
#define lcd1602_RW(n)   (n?HAL_GPIO_WritePin(GPIOD,GPIO_PIN_9,GPIO_PIN_SET):HAL_GPIO_WritePin(GPIOD,GPIO_PIN_9,GPIO_PIN_RESET))
#define lcd1602_EN(n)   (n?HAL_GPIO_WritePin(GPIOD,GPIO_PIN_10,GPIO_PIN_SET):HAL_GPIO_WritePin(GPIOD,GPIO_PIN_10,GPIO_PIN_RESET))


#define lcd_d7_in()     {GPIOE->MODER&=~(11<<28);GPIOE->MODER|=0<<29;}
#define lcd_d7_out()    {GPIOE->MODER&=~(11<<28);GPIOE->MODER|=1<<28;}
#define lcd_d7_read     (HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_14))

void LCD1602_Init(void);
void LCD1602_cmd(u8 cmd);
u8 LCD1602_bz(void);
void LCD1602_DATAOUT(u8 data);
void LCD1602_pos(u8 pos);
void display(u8 addr,u8 data);




#endif


LCD1602驱动

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

void LCD1602_Init(void)     //LCD1602初始化函数
{
        GPIO_InitTypeDef GPIO_Initure;     //定义GPIO结构体变量名
        __HAL_RCC_GPIOD_CLK_ENABLE();      //开启PD口的时钟
        __HAL_RCC_GPIOE_CLK_ENABLE();      //开启PE口的时钟
        
        GPIO_Initure.Pin=GPIO_PIN_8|       //控制脚RS
                         GPIO_PIN_9|       //控制脚RW
                         GPIO_PIN_10;      //控制脚EN
        GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;                 //设置为推挽输出模式
        GPIO_Initure.Pull=GPIO_PULLUP;                         //设置为上拉模式
        GPIO_Initure.Speed=GPIO_SPEED_FAST;                    //设置速度为50M
        HAL_GPIO_Init(GPIOD,&GPIO_Initure);
        
        GPIO_Initure.Pin=GPIO_PIN_7|     //数据位D0
                         GPIO_PIN_8|     //数据位D1
                         GPIO_PIN_9|     //数据位D2
                         GPIO_PIN_10|    //数据位D3
                         GPIO_PIN_11|    //数据位D4
                         GPIO_PIN_12|    //数据位D5
                         GPIO_PIN_13|    //数据位D6
                         GPIO_PIN_14;    //数据位D7
        GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;     //设置为推挽输出模式
        GPIO_Initure.Pull=GPIO_PULLUP;             //设置为上拉模式
        GPIO_Initure.Speed=GPIO_SPEED_FAST;        //设置速度为50MHZ
        HAL_GPIO_Init(GPIOE,&GPIO_Initure);
        
        LCD1602_cmd(0x38);  //设置显示模式16X2,5X7点阵,8位数据接口
        LCD1602_cmd(0x0c);  //开显示
        LCD1602_cmd(0x06);  //读写一个字符后指针加1
        LCD1602_cmd(0x01);  //显示清屏
}

void LCD1602_cmd(u8 cmd)    //写入指令函数
{
        while(LCD1602_bz())
                ;
        lcd_d7_out();
    lcd1602_RS(0);
        lcd1602_RW(0);
        lcd1602_EN(0);
        GPIOE->ODR&=~(0xff<<7);
        GPIOE->ODR|=cmd<<7;
    lcd1602_EN(1);
        lcd1602_EN(0);
}

void LCD1602_DATAOUT(u8 data)   //写入数据函数
{
        while(LCD1602_bz())
                ;
        lcd_d7_out();
        lcd1602_RS(1);
        lcd1602_RW(0);
        lcd1602_EN(0);
        GPIOE->ODR&=~(0xff<<7);
        GPIOE->ODR|=data<<7;
    lcd1602_EN(1);
        lcd1602_EN(0);
}

u8 LCD1602_bz(void)   //读取忙信号
{
        u8 BUSY;
        lcd1602_RS(0);
        lcd1602_RW(1);
        lcd1602_EN(1);
        lcd_d7_in();
        BUSY=lcd_d7_read;
        return BUSY;

}

void LCD1602_pos(u8 pos)   //写入地址
{
        LCD1602_cmd(pos|0x80);

}




main函数

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

u8 dis[]={"abcdefg"};

int main(void)
{   
        u8 i;
        u8 *temp;
        Cache_Enable();                 //打开L1-Cache
        HAL_Init();                                        //初始化HAL库
        Stm32_Clock_Init(432,25,2,9);   //设置时钟,216Mhz
        delay_init(216);                //延时初始化
        uart_init(115200);                        //串口初始化
        LED_Init();                                         //LED初始化
        KEY_Init();                     //按键初始化
        LCD1602_Init();
        
        while(1)
        {
                temp=&dis[0];
                LCD1602_cmd(0x01);
                delay_ms(1);
                LCD1602_pos(0x00);
                for(i=0;i<8;i++)
                {
                        LCD1602_DATAOUT(*temp);
                        temp++;
                        delay_ms(500);
                }
        }
}






































友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。