OpenEdv-开源电子网

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

STM32驱动1602显示不了,找不问题,都要崩溃了

[复制链接]

10

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2016-3-16
在线时间
35 小时
发表于 2017-11-21 22:23:55 | 显示全部楼层 |阅读模式
1金钱
#ifndef __LCD1602_H
#define __LCD1602_H                       


#include "stm32f10x.h"
                                                                      
//-----------------OLED端口定义----------------                                            

#define RS_Clr()  GPIO_ResetBits(GPIOB,GPIO_Pin_8)
#define RS_Set()  GPIO_SetBits(GPIOB,GPIO_Pin_8)

#define RW_Clr()  GPIO_ResetBits(GPIOB,GPIO_Pin_9)
#define RW_Set()  GPIO_SetBits(GPIOB,GPIO_Pin_9)

#define EN_Clr()  GPIO_ResetBits(GPIOB,GPIO_Pin_10)
#define EN_Set()  GPIO_SetBits(GPIOB,GPIO_Pin_10)


//PB0~7,作为数据线
#define DATAOUT(x)  GPIO_Write(GPIOB,x);//输出  



void LCD1602_GPIO_Init(void);
void LCD1602_WriteInformation(u8 ucData,u8 bComOrData);
void LCD1602_Init(void);
void LCD1602_MoveToPosition(u8 x,u8 y);
void LCD1602_DisplayOneCharOnAddr(u8 x,u8 y,u8 ucData);
void LCD1602_DisplayString(u8 *ucStr);
void display(u8 temp);
extern  short liyang;

#endif  
/******************** (C) COPYRIGHT 2013 CEPARK多功能开发学习板********************
* 文件名  :lcd1602.c
* 描述    :lcd1602 应用函数库
*         
* 实验平台:CEPARK多功能开发学习板
                                                                                                                                                                 
**********************************************************************************/

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


void LCD1602_GPIO_Init(void)
{
                GPIO_InitTypeDef GPIO_InitStructure;
       
                RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);

          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 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10;       
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
          GPIO_Init(GPIOA, &GPIO_InitStructure);
}


/******************************************************************************
函数名称:LCD1602_WriteInformation
函数功能:向LCD1602液晶写入数据或者命令
入口参数:ucData-要写入的数据或者命令参数
                  bComOrData-为0时写入的时命令,为1时写入的时数据
返回值:无
备注:无
*******************************************************************************/
void LCD1602_WriteInformation(u8 ucData,u8 bComOrData)         
{
        DATAOUT(ucData);
        delay_us(20);
        if(bComOrData)
                RS_Set();
        else
                RS_Clr();
        delay_us(20);
        RW_Clr();
        delay_us(20);
        EN_Set();
        delay_us(20);
        EN_Clr();
        delay_us(200);
}

/******************************************************************************
函数名称:LCD1602_Init
函数功能:液晶初始化函数
入口参数:无
返回值:无
备注:无
*******************************************************************************/
void LCD1602_Init(void)                 
{
        LCD1602_WriteInformation(0x38,0);
        delay_us(1000);
        LCD1602_WriteInformation(0x38,0);
        delay_us(1000);
        LCD1602_WriteInformation(0x38,0);
        delay_us(1000);
        LCD1602_WriteInformation(0x38,0);         //写入命令,5x7点阵工作方式,8位数据接口
        delay_us(1000);
        LCD1602_WriteInformation(0x0c,0);        //显示设置,开显示,光标不显示,不闪烁
        delay_us(1000);
        LCD1602_WriteInformation(0x01,0);        //清屏指令
        delay_us(1000);
}

/******************************************************************************
函数名称:LCD1602_MoveToPosition
函数功能:将液晶的光标移动到指定的位置
入口参数:x-液晶显示的行数,范围0-1
                        x = 0:在液晶的第一行
                        x = 1:在液晶的第二行
                  y-液晶显示的列数,范围0-15
                    y = 0:在液晶的第一列
                        y = 1:在液晶的第二列
                        ......
                        y = 15:在液晶的第十六列
返回值:无
备注:通过指定x,y的值可以将液晶的光标移动到指定的位置
*******************************************************************************/
void LCD1602_MoveToPosition(u8 x,u8 y)       
{
        if(0 == x)
                LCD1602_WriteInformation((0x80 | y),0);           //光标定位到第一行的y列
        if(1 == x)
                LCD1602_WriteInformation((0xC0 | y),0);           //光标定义到第二行的y列
}

/******************************************************************************
函数名称:LCD1602_DisplayOneCharOnAddr
函数功能:在指定的位置上显示指定的字符
入口参数:x-液晶显示的行数,范围0-1
                        x = 0:在液晶的第一行
                        x = 1:在液晶的第二行
                  y-液晶显示的列数,范围0-15
                    y = 0:在液晶的第一列
                        y = 1:在液晶的第二列
                        ......
                        y = 15:在液晶的第十六列
                  ucData-要显示的字符数据
返回值:无
备注:确保x,y的取值要在指定的范围内
*******************************************************************************/
void LCD1602_DisplayOneCharOnAddr(u8 x,u8 y,u8 ucData)
{
        LCD1602_MoveToPosition(x,y);   //光标位置
        LCD1602_WriteInformation(ucData,1);          //写入数据
}

/******************************************************************************
函数名称:LCD1602_DisplayString
函数功能:显示字符串
入口参数:ucStr-字符串的首地址
返回值:无
备注:无
*******************************************************************************/
void LCD1602_DisplayString(u8 *ucStr)       
{
        while(*ucStr != '\0')           //字符串结束之前,循环显示
        {
                 LCD1602_WriteInformation(*ucStr,1);         //依次写入每一个字符
                 ucStr++;                                                                 //指针增加
        }
}
void display(u8 temp)
{       
        u8 ge,shi,bai;
        bai = temp/100;
        shi= temp%100/10;
        ge=temp%10;
        if(liyang<0)
        {
                LCD1602_DisplayOneCharOnAddr(1,5,'-');
        }
        else
        {
       
         LCD1602_DisplayOneCharOnAddr(1,5,'+');
        }
  LCD1602_DisplayOneCharOnAddr(1,6,bai+0x30);
  LCD1602_DisplayOneCharOnAddr(1,7,shi+0x30);
       
  LCD1602_DisplayOneCharOnAddr(1,8,ge+0x30);

        delay_us(1000);
}


























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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-11-22 00:59:23 | 显示全部楼层
论坛搜索,参考别人的代码
回复

使用道具 举报

32

主题

103

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
455
金钱
455
注册时间
2016-7-12
在线时间
50 小时
发表于 2017-11-22 10:08:56 | 显示全部楼层
主要看端口配置的对不对,有示波器的话可以用示波器测波形。
回复

使用道具 举报

5

主题

52

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
380
金钱
380
注册时间
2017-2-19
在线时间
53 小时
发表于 2017-11-22 10:39:38 | 显示全部楼层
驱动1602显示不了,是背光都不亮还是没有数字和字母显示?
回复

使用道具 举报

头像被屏蔽

64

主题

233

帖子

0

精华

禁止访问

积分
603
金钱
603
注册时间
2017-11-13
在线时间
71 小时
发表于 2017-11-22 10:47:42 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

10

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2016-3-16
在线时间
35 小时
 楼主| 发表于 2017-11-22 16:44:22 | 显示全部楼层
15991069404 发表于 2017-11-22 10:39
驱动1602显示不了,是背光都不亮还是没有数字和字母显示?

背光亮,第一行也显示黑点!
回复

使用道具 举报

10

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2016-3-16
在线时间
35 小时
 楼主| 发表于 2017-11-22 16:45:11 | 显示全部楼层
宝胖子 发表于 2017-11-22 10:08
主要看端口配置的对不对,有示波器的话可以用示波器测波形。

端口配置检查好几遍了,没问题!
回复

使用道具 举报

6

主题

153

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1323
金钱
1323
注册时间
2016-12-27
在线时间
156 小时
发表于 2017-11-22 16:57:38 | 显示全部楼层
你那个1602是不是5V的逻辑电压呀?会不会逻辑电压不对
回复

使用道具 举报

13

主题

156

帖子

0

精华

高级会员

Rank: 4

积分
883
金钱
883
注册时间
2017-8-7
在线时间
200 小时
发表于 2017-11-22 17:05:01 | 显示全部楼层
对比度有问题吗
回复

使用道具 举报

10

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2016-3-16
在线时间
35 小时
 楼主| 发表于 2017-11-23 10:39:02 来自手机 | 显示全部楼层
大瓶子凌凌漆 发表于 2017-11-22 16:57
你那个1602是不是5V的逻辑电压呀?会不会逻辑电压不对

1602的5v,控制引脚接到PA端口
回复

使用道具 举报

10

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2016-3-16
在线时间
35 小时
 楼主| 发表于 2017-11-23 10:40:20 来自手机 | 显示全部楼层
旺仔奶豆 发表于 2017-11-22 17:05
对比度有问题吗

接定位器到地

回复

使用道具 举报

10

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
173
金钱
173
注册时间
2017-8-4
在线时间
45 小时
发表于 2017-11-23 11:32:32 | 显示全部楼层
就第一行亮?并且是黑色方格?

这样的话是1602初始化没成功,时序的问题
回复

使用道具 举报

10

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2016-3-16
在线时间
35 小时
 楼主| 发表于 2017-11-23 18:37:01 来自手机 | 显示全部楼层
白菜君 发表于 2017-11-23 11:32
就第一行亮?并且是黑色方格?

这样的话是1602初始化没成功,时序的问题

1602可以随便接到那个io上面吗?
回复

使用道具 举报

11

主题

95

帖子

0

精华

高级会员

Rank: 4

积分
598
金钱
598
注册时间
2017-3-19
在线时间
116 小时
发表于 2017-11-24 11:00:42 | 显示全部楼层
你用了#define  PB  但你初始化了 PA,引脚对应不上,看看是不是这个原因
回复

使用道具 举报

10

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
173
金钱
173
注册时间
2017-8-4
在线时间
45 小时
发表于 2017-11-24 11:05:11 | 显示全部楼层
我的回复为什么不见了


STM32的PB3、PB4,分别是JTAG的JTDO和NJTRST引脚,在没关闭JTAG功能之前,在程序中是配置不了这些引脚的功能的。
要配置这些引脚,首先要开启AFIO时钟,然后在AFIO的设置中,释放这些引脚。具体看STM32的参考手册中有关AFIO的部分。


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB| RCC_APB2Periph_AFIO,ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);

还有就是端口定义的是GPIOB,初始化的是GPIOA
回复

使用道具 举报

4

主题

349

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1046
金钱
1046
注册时间
2017-5-19
在线时间
335 小时
发表于 2017-11-24 11:11:13 | 显示全部楼层
先确定是软件还是硬件的问题,用别人的程序接好后不行就是硬件问题,否则软件问题
回复

使用道具 举报

10

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
173
金钱
173
注册时间
2017-8-4
在线时间
45 小时
发表于 2017-11-24 15:05:44 | 显示全部楼层
bbxyliyang 发表于 2017-11-23 18:37
1602可以随便接到那个io上面吗?

http://blog.csdn.net/iccome/article/details/32941789

这个应该对你有帮助
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 02:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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