OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4176|回复: 4

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

[复制链接]

9

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2017-1-14
在线时间
27 小时
发表于 2017-4-5 13:56:14 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 杉侠 于 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);
                }
        }
}






































正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2017-1-14
在线时间
27 小时
 楼主| 发表于 2017-4-5 13:59:03 | 显示全部楼层
回复

使用道具 举报

2

主题

64

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
349
金钱
349
注册时间
2017-3-20
在线时间
86 小时
发表于 2017-4-5 18:39:29 | 显示全部楼层
调整对比度,在VO口加一个电位器,调整对比度直到正面看清晰为止
回复

使用道具 举报

9

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2017-1-14
在线时间
27 小时
 楼主| 发表于 2017-4-6 08:48:41 | 显示全部楼层
不存在的时间 发表于 2017-4-5 18:39
调整对比度,在VO口加一个电位器,调整对比度直到正面看清晰为止

谢谢,问题确实是对比度
回复

使用道具 举报

0

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2017-12-21
在线时间
8 小时
发表于 2018-4-22 11:05:40 | 显示全部楼层
请问电位器加多少的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 07:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表