OpenEdv-开源电子网

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

关于LCD1602显示,真的搞不懂自己到底哪儿不对

[复制链接]

6

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2017-8-7
在线时间
26 小时
发表于 2017-8-7 19:21:00 | 显示全部楼层 |阅读模式
感觉没有错的地方啊,可是它为什么就没有显示呢?这个学起来真的好难啊

LCD1602A.zip

6.04 MB, 下载次数: 444

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

使用道具 举报

1

主题

101

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2017-5-10
在线时间
55 小时
发表于 2017-8-8 12:27:49 来自手机 | 显示全部楼层
cromarti 发表于 2017-8-8 12:22
LCD_D=dat

这句改成u16 temp=LCD_D;
temp&=0xff00;
temp|=dat<<8;
LCD_D=dat;
再就是注意一下电压,1602是5v的,3.3v驱动为了稳妥最好是开漏接5v上拉
回复 支持 1 反对 0

使用道具 举报

6

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2017-8-7
在线时间
26 小时
 楼主| 发表于 2017-8-7 19:22:58 | 显示全部楼层
main.c

#include "stm32f10x.h"
#include "lcd.h"
#include "delay.h"

int main()
{
        u8 ch[]="Welcome ";
        delay_init();
        gpio_init();
        lcd_init();
        LcdShowStr(0,0,ch);
        while(1);
}
回复 支持 反对

使用道具 举报

6

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2017-8-7
在线时间
26 小时
 楼主| 发表于 2017-8-7 19:23:36 | 显示全部楼层
lcd.c

include "stm32f10x.h"
#include "sys.h"
#include "delay.h"
#include "lcd.h"

void lcd_init()
{
                delay_init();
    Lcd1602_Write_Cmd(0x38);    //打开,5*8,8位数据
    Lcd1602_Write_Cmd(0x0c);
    Lcd1602_Write_Cmd(0x06);
    Lcd1602_Write_Cmd(0x01);    //清屏   
}

void gpio_init()
{
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);   
       
        GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP;
                                                //RS       //RW       //E        //D0       //D1        //D2        //D3
        GPIO_InitStructure.GPIO_Pin  =GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_0|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|
                                GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
                                           //D4        //D5        //D6        //D7
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOB,&GPIO_InitStructure);
       
        GPIO_ResetBits(GPIOB, GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_8|GPIO_Pin_9|
                                                                        GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
}

void ReadBusy() //忙检测
{
        u8 sta;
        LCD_RS=0;
        LCD_RW=1;
        do
        {
                LCD_E=1;
                sta=LCD_D>>8;
                delay_ms(5);
                LCD_E=0;
        }while(sta&0x80);
}

void Lcd1602_Write_Cmd(u16 cmd)  //写命令
{
        ReadBusy();
        LCD_RS=0;
        LCD_RW=0;
        LCD_D=cmd<<8;
        LCD_E=1;
        LCD_E=0;
}

void Lcd1602_Write_Data(u16 dat)   //写数据
{
        ReadBusy();
        LCD_RS=1;
        LCD_RW=0;
        LCD_D=dat<<8;
        LCD_E=1;
        LCD_E=0;
}

void LcdSetCursor(u8 x,u8 y)   //坐标显示
{
        u8 addr;
        if(y==0) addr=0x00+x;
        else     addr=0x40+x;
        Lcd1602_Write_Cmd(addr|0x80);
}

void LcdShowStr(u8 x,u8 y,u8 *str)//显示字符串
{
        LcdSetCursor(x,y);
        while(*str!='\0')
        {
                Lcd1602_Write_Data(*str++);
        }
}
回复 支持 反对

使用道具 举报

6

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2017-8-7
在线时间
26 小时
 楼主| 发表于 2017-8-7 19:24:03 | 显示全部楼层
lcd.h


#ifndef __LCD_H
#define __LCD_H
#include "sys.h"
#define  LCD_RS  PBout(1)
#define  LCD_RW  PBout(2)
#define  LCD_E   PBout(0)
#define  LCD_D   GPIOB->ODR

void lcd_init(void);
void gpio_init(void);
void ReadBusy(void);  //忙检测
void Lcd1602_Write_Cmd(u16 cmd);   //写命令
void Lcd1602_Write_Data(u16 dat);   //写数据
void LcdSetCursor(u8 x,u8 y);//坐标显示
void LcdShowStr(u8 x,u8 y,unsigned char *str);//显示字符串

#endif

回复 支持 反对

使用道具 举报

6

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2017-8-7
在线时间
26 小时
 楼主| 发表于 2017-8-7 19:24:45 | 显示全部楼层
大腿在哪儿呀
回复 支持 反对

使用道具 举报

3

主题

12

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2017-4-26
在线时间
10 小时
发表于 2017-8-7 19:51:27 | 显示全部楼层
以前弄的,当时可以正常显示。刚刚翻了一下,好像是这个。传输数据只用4条线,移植性的话还可以,只需要修改预定义还初始化的地方,只不过效率有点低,它是一个位一个位赋值的。调用的话是这样LCD1602_Write_String(0,0,"hello");,参数一个是第几行,一个是第几列。希望可以帮到你。

1602.rar

1.82 KB, 下载次数: 297

回复 支持 反对

使用道具 举报

4

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2017-4-1
在线时间
23 小时
发表于 2017-8-7 22:32:21 | 显示全部楼层
过流保护电路及功率因数测量.rar (1.95 MB, 下载次数: 277)
回复 支持 反对

使用道具 举报

0

主题

12

帖子

0

精华

高级会员

Rank: 4

积分
682
金钱
682
注册时间
2016-7-13
在线时间
121 小时
发表于 2017-8-8 01:22:51 来自手机 | 显示全部楼层
几乎可以肯定是8位的数据覆盖了rs.rw.en的值,建议出问题了先debug下再来问( ̄ー ̄)
回复 支持 反对

使用道具 举报

10

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
514
金钱
514
注册时间
2017-5-21
在线时间
82 小时
发表于 2017-8-8 01:25:43 | 显示全部楼层
楼主用oled吧,很好用网上一大堆开源的代码,可以调用。如果深入学习LCD1602的话建议楼主可以接着研究这个话题嘻嘻小白一起学
回复 支持 反对

使用道具 举报

6

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2017-8-7
在线时间
26 小时
 楼主| 发表于 2017-8-8 09:04:18 | 显示全部楼层
踩姑娘的小蘑菇 发表于 2017-8-8 01:22
几乎可以肯定是8位的数据覆盖了rs.rw.en的值,建议出问题了先debug下再来问( ̄ー ̄)

恩,因为PB2占了BOOT1,所以不能进行硬件仿真,软仿真最后也没搞懂,所以。。。我就来了
回复 支持 反对

使用道具 举报

6

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2017-8-7
在线时间
26 小时
 楼主| 发表于 2017-8-8 09:07:01 | 显示全部楼层
Anyint 发表于 2017-8-8 01:25
楼主用oled吧,很好用网上一大堆开源的代码,可以调用。如果深入学习LCD1602的话建议楼主可以接着研究 ...

没有这个板子,只有1602,12864
回复 支持 反对

使用道具 举报

6

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2017-8-7
在线时间
26 小时
 楼主| 发表于 2017-8-8 09:16:28 | 显示全部楼层
人生几何 发表于 2017-8-7 19:51
以前弄的,当时可以正常显示。刚刚翻了一下,好像是这个。传输数据只用4条线,移植性的话还可以,只需要修 ...

谢谢大神~~~
回复 支持 反对

使用道具 举报

6

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2017-8-7
在线时间
26 小时
 楼主| 发表于 2017-8-8 09:16:41 | 显示全部楼层
夜妖壹号 发表于 2017-8-7 22:32
这是我写的用LCD1602显示电压电流及功率因数的程序,程序内容比较多,如果有耐心就慢慢看吧,相信会对你 ...

谢谢大神~~~
回复 支持 反对

使用道具 举报

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2099
金钱
2099
注册时间
2017-2-11
在线时间
306 小时
发表于 2017-8-8 11:53:26 | 显示全部楼层
        GPIO_InitTypeDef  GPIO_InitStructure;
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOC, ENABLE);         //使能PA,PC端口时钟
         
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2;                                 //LCD1602的三根控制线rs,rw,en
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;        //IO口速度为100MHz
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//不上下拉
        GPIO_Init(GPIOC, &GPIO_InitStructure);//根据设定参数初始化GPIOC                                         
   
        GPIO_InitStructure.GPIO_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;//LCD1602的8跟数据线
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//不上下拉
       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//IO口速度为100MHz
       GPIO_Init(GPIOA, &GPIO_InitStructure);//根据设定参数初始化GPIOA
我是新手,用的是探索者开发板,我想问问帅哥们,对于PA,PC的I/O口是否需要上拉?下拉?还是不上下拉?
回复 支持 反对

使用道具 举报

1

主题

101

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2017-5-10
在线时间
55 小时
发表于 2017-8-8 12:22:35 来自手机 | 显示全部楼层
LCD_D=dat<<8;
回复 支持 反对

使用道具 举报

6

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2017-8-7
在线时间
26 小时
 楼主| 发表于 2017-8-8 14:09:36 | 显示全部楼层
cromarti 发表于 2017-8-8 12:27
这句改成u16 temp=LCD_D;
temp&=0xff00;
temp|=dat

嗯,已解决。谢谢大哥。     的确得用5V驱动,3.3V字体非常模糊,直视的话看不清
回复 支持 反对

使用道具 举报

6

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2017-8-7
在线时间
26 小时
 楼主| 发表于 2017-8-8 14:17:02 | 显示全部楼层
问题已经解决了,总结了一下我的问题:
(1)stm32驱动1602的话,首先电源要接5V,否则字体会很模糊。
(2)stm32由于时钟频率很高,所以写操作使能时,中间必须使用延时函数。
(3)忙检测函数有问题,但我还没有发现具体是哪儿的问题,所以索性注释掉了,对正常显示没有影响。
(4)因为板子上的1602接口连接的是GPIOB的8~15端口,就必须对命令或数据进行移位。
         为避免因此产生错误,我用杜邦线将D0~7接在了GPIOA的低八位。
回复 支持 反对

使用道具 举报

6

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2017-8-7
在线时间
26 小时
 楼主| 发表于 2017-8-8 17:17:58 | 显示全部楼层
jiangyy 发表于 2017-8-8 11:53
GPIO_InitTypeDef  GPIO_InitStructure;
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|R ...

不清楚,我也很疑惑。只知道端口复用一般需要上拉输入
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-4-20 11:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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