OpenEdv-开源电子网

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

自己写了一段LCD1602的驱动,但是没有信号,求助。

[复制链接]

22

主题

120

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
252
金钱
252
注册时间
2015-7-25
在线时间
20 小时
发表于 2015-8-9 17:05:13 | 显示全部楼层 |阅读模式
5金钱


我lcd能亮起来,但是就是不显示字符,第一行是方块。

LCD引脚RS\RW\EN分别接PC8\PC7\PC6

D0~7接B0~7





LCD1602驱动

#include "LCD1602.h"
#include "delay.h"
#include <stm32f10x.h>


#define uchar unsigned char

#define RS0 GPIO_ResetBits(GPIOC,GPIO_Pin_8)
#define RS1 GPIO_SetBits(GPIOC,GPIO_Pin_8)
#define RW0 GPIO_ResetBits(GPIOC,GPIO_Pin_7)
#define RW1 GPIO_SetBits(GPIOC,GPIO_Pin_7)
#define EN0 GPIO_ResetBits(GPIOC,GPIO_Pin_6)
#define EN1 GPIO_SetBits(GPIOC,GPIO_Pin_6)       //RS、RW、EN分别连接PC8、PC7、PC6


盲检函数
unsigned char Busy_Check()
{
unsigned char BC;
RS0;
RW1;
EN0;
delay_ms(1);
EN1;
delay_ms(1);
BC=(GPIO_ReadInputData(GPIOB)&0x0080)>>7;
EN0;
return BC;
}
写命令函数
void Lcd_write_cmd(uchar cmd)
{
while(Busy_Check());
RS0;
delay_ms(1);
RW0;
EN0;
GPIOB->BSRR=cmd&0x00ff;
delay_ms(1);
EN1;
delay_ms(1);
EN0;
}
写数据函数
void Lcd_write_data(uchar data)
{
while(Busy_Check());
delay_ms(1);
RS1;
RW0;
EN0;
GPIOB->BSRR=data&0x00ff;
delay_ms(1);
EN1;
delay_ms(1);
EN0;
}
初始化函数
void Lcd_initialize()
{
Lcd_write_cmd(0x38);
delay_ms(20);
Lcd_write_cmd(0x01);
delay_ms(20);
Lcd_write_cmd(0x06);
delay_ms(20);
Lcd_write_cmd(0x0e);
delay_ms(20);
}
显示函数
void Lcd_display(uchar addr,uchar *str)
{
uchar i=0;
Lcd_write_cmd(addr|0x80);
delay_ms(1);
for(i=0;str!='\0';i++)
{
Lcd_write_data(str);
delay_ms(1);
}
}

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

使用道具 举报

22

主题

120

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
252
金钱
252
注册时间
2015-7-25
在线时间
20 小时
 楼主| 发表于 2015-8-9 17:06:11 | 显示全部楼层
#include <GPIO.h>
#include <stm32f10x_gpio.h>
void GPIObc_Init()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
GPIO_Init(GPIOB,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;
GPIO_Init(GPIOB,&GPIO_InitStructure);             

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;
GPIO_Init(GPIOB,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;
GPIO_Init(GPIOB,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
GPIO_Init(GPIOB,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;
GPIO_Init(GPIOB,&GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;
GPIO_Init(GPIOB,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;
GPIO_Init(GPIOC,&GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;
  GPIO_Init(GPIOC,&GPIO_InitStructure);
  
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;
  GPIO_Init(GPIOC,&GPIO_InitStructure);  //IO口都设置为推挽输出  50MHZ
}
回复

使用道具 举报

22

主题

120

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
252
金钱
252
注册时间
2015-7-25
在线时间
20 小时
 楼主| 发表于 2015-8-9 17:06:48 | 显示全部楼层
#include <stm32f10x.h>
#include "LCD1602.h"
#include "GPIO.h"


int main(void)
{
GPIObc_Init();
Lcd_initialize();
Lcd_display(0,"GREAT");
while(1);
}
回复

使用道具 举报

2

主题

75

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2015-7-30
在线时间
1 小时
发表于 2015-8-9 21:23:09 | 显示全部楼层
调节下对比度可以吗?
方法比问题多,思路决定出路,人生无极限贵在坚持。
回复

使用道具 举报

22

主题

120

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
252
金钱
252
注册时间
2015-7-25
在线时间
20 小时
 楼主| 发表于 2015-8-9 21:27:13 | 显示全部楼层
回复【4楼】雪山飞狐:
---------------------------------
怎么调都是一排方块
回复

使用道具 举报

2

主题

75

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2015-7-30
在线时间
1 小时
发表于 2015-8-9 21:33:38 | 显示全部楼层
写命令函数
void Lcd_write_cmd(uchar cmd)
{
while(Busy_Check());
RS0;
RW0;
EN1;
GPIOB->BSRR=cmd&0x00ff;
delay_ms(10);
EN0;
}
写数据函数
void Lcd_write_data(uchar data)
{
while(Busy_Check());
RS1;
RW0;
EN1;
GPIOB->BSRR=data&0x00ff;
delay_ms(10);
EN0;
}
你这样试试
方法比问题多,思路决定出路,人生无极限贵在坚持。
回复

使用道具 举报

22

主题

120

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
252
金钱
252
注册时间
2015-7-25
在线时间
20 小时
 楼主| 发表于 2015-8-9 22:01:56 | 显示全部楼层
回复【6楼】雪山飞狐:
---------------------------------
还是没字符显示
回复

使用道具 举报

2

主题

75

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2015-7-30
在线时间
1 小时
发表于 2015-8-9 22:15:07 | 显示全部楼层
盲检函数
unsigned char Busy_Check()
{
unsigned char BC;
RS0;
RW1;
EN1;
BC=(GPIO_ReadInputData(GPIOB)&0x0080)>>7;
delay_ms(2);
EN0;
return BC;
}
写命令函数 
void Lcd_write_cmd(uchar cmd) 

while(Busy_Check()); 
delay_ms(1); 
RS0; 
RW0; 
EN1; 
GPIOB->BSRR=cmd&0x00ff; 
delay_ms(10); 
EN0; 

写数据函数 
void Lcd_write_data(uchar data) 

while(Busy_Check()); 
delay_ms(1); 
RS1; 
RW0; 
EN1; 
GPIOB->BSRR=data&0x00ff; 
delay_ms(10); 
EN0; 

初始化函数
void Lcd_initialize()
{
Lcd_write_cmd(0x01);
delay_ms(20);
Lcd_write_cmd(0x06);
delay_ms(20);
Lcd_write_cmd(0x0e);
delay_ms(20);
Lcd_write_cmd(0x38);
delay_ms(20);}
呵呵,我也是个小白再试试~~
方法比问题多,思路决定出路,人生无极限贵在坚持。
回复

使用道具 举报

22

主题

120

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
252
金钱
252
注册时间
2015-7-25
在线时间
20 小时
 楼主| 发表于 2015-8-10 11:26:36 | 显示全部楼层
回复【8楼】雪山飞狐:
---------------------------------
亲,你这个肯定错了哟。写数据的时候EN是上升沿。

我把写好的程序放在51上面是能显示的,有可能是stm32哪个地方寄存器错了,看来还要仿真调试一下
回复

使用道具 举报

2

主题

75

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2015-7-30
在线时间
1 小时
发表于 2015-8-10 12:39:18 | 显示全部楼层
呵呵,使能的时候EN 是在上升沿啊!我这个不是莫
方法比问题多,思路决定出路,人生无极限贵在坚持。
回复

使用道具 举报

22

主题

120

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
252
金钱
252
注册时间
2015-7-25
在线时间
20 小时
 楼主| 发表于 2015-8-10 13:40:38 | 显示全部楼层
回复【10楼】雪山飞狐:
---------------------------------
EN0->EN1怎么会是上升沿呢.....
回复

使用道具 举报

22

主题

120

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
252
金钱
252
注册时间
2015-7-25
在线时间
20 小时
 楼主| 发表于 2015-8-10 13:42:43 | 显示全部楼层
回复【10楼】雪山飞狐:
---------------------------------
仿真了一下,出现了几个错误
第一个是延时函数没有初始化看在延时函数里面无限循环了

第二个错误,对GPIO->BSRR操作以后还要对BRR进行操作写0

还有一个问题,读忙函数D7一直是高电平,在读忙函数里里看的IDR寄存器第8位永远都是1
回复

使用道具 举报

56

主题

1237

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2644
金钱
2644
注册时间
2014-2-13
在线时间
518 小时
发表于 2015-8-10 13:59:58 | 显示全部楼层
看看我的帖子里的代码吧,都测试过的
技术交流,Sell 中颖单片机,欢迎私信骚扰
回复

使用道具 举报

22

主题

120

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
252
金钱
252
注册时间
2015-7-25
在线时间
20 小时
 楼主| 发表于 2015-8-10 15:45:33 | 显示全部楼层
回复【13楼】黑夜之狼:
-------------------------------
我自己的刚刚测试成功了。

就是只能显示数字。字符写不了
回复

使用道具 举报

22

主题

120

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
252
金钱
252
注册时间
2015-7-25
在线时间
20 小时
 楼主| 发表于 2015-8-10 16:47:54 | 显示全部楼层
void Lcd_display(uchar addr,uchar *str) 
{  
uchar i=0; 
while(Busy_Check()); 
Lcd_write_cmd(addr|0x80); 
delay_ms(1); 
for(i=0;str!='\0';i++) 

Lcd_write_data(str); 
delay_ms(1); 




int main(void) 

delay_init(); 
GPIObc_Init(); 
Lcd_initialize(); 
Lcd_display(0,"speed"); 
while(1); 


两个关键函数 
在main函数 Lcd_display的地方 
warning:passing char【6】 to parameter of type ’unsigned char*‘  converts between pointers to interger types with different signs 

编译一点问题都没有但是代码旁边黄色三角一直都在,而且lcd1602也显示不了字符 

一模一样的程序51上能显示,stm32上就显示不了 
我寻思着是不是只能用编码来显示字符了
回复

使用道具 举报

22

主题

120

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
252
金钱
252
注册时间
2015-7-25
在线时间
20 小时
 楼主| 发表于 2015-8-10 16:48:44 | 显示全部楼层
回复【13楼】黑夜之狼:
---------------------------------
找不到了。。。
回复

使用道具 举报

22

主题

120

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
252
金钱
252
注册时间
2015-7-25
在线时间
20 小时
 楼主| 发表于 2015-8-10 17:07:06 | 显示全部楼层
我把指针的数组改成了单个的char型字符
在main函数相同的地方出现了警告 

incompatible integer to pointer conversion passing 'int' to parameter of type 'unsigned char'

看了一下前面的代码,可能是不可以直接往寄存器里面写char型数据的。51为什么就可以呢
回复

使用道具 举报

4

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2015-10-27
在线时间
0 小时
发表于 2015-10-29 09:26:35 | 显示全部楼层
回复【14楼】秋夜月汐:
---------------------------------
忙检函数应该可以去掉吧?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-18 16:48

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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