stm32驱动LCD1602问题

Hiter18S005048 2017-07-12 04:58:00
我用stm32f103zet6的板子驱动一个LCD1602液晶,让其在第一行显示abcdefghijklmnop,
接线是 PB0~2接RS,RW,EN,PA0~7接D0~D7
但是显示的却是下图所示的

后来我将LCD的电源断掉再将单片机复位,再接上LCD的电源之后发现能够正常显示,如下图

但是如果不断掉LCD的电源就将单片机复位的话显示的仍然是错误的,请各位大佬不吝赐教!!!

下面是代码,key.h里面有延时函数

#include "stm32f10x.h"
#include "key.h"

#define Set_RS GPIO_SetBits(GPIOB,GPIO_Pin_0)
#define Set_RW GPIO_SetBits(GPIOB,GPIO_Pin_1)
#define Set_EN GPIO_SetBits(GPIOB,GPIO_Pin_2)

#define CLR_RS GPIO_ResetBits(GPIOB,GPIO_Pin_0)
#define CLR_RW GPIO_ResetBits(GPIOB,GPIO_Pin_1)
#define CLR_EN GPIO_ResetBits(GPIOB,GPIO_Pin_2)

GPIO_InitTypeDef GPIO_InitStructure;

unsigned char table[]="abcdefghijklmnop";

void Send_Com(unsigned char Send_Com)
{

CLR_RS;
GPIO_Write(GPIOA,(u16)Send_Com);
delay_ms(5);
Set_EN;
delay_ms(5);
CLR_EN;
}

void Send_Dat(unsigned char Send_Dat)
{

Set_RS;
GPIO_Write(GPIOA,Send_Dat);
delay_ms(5);
Set_EN;
delay_ms(5);
CLR_EN;
}
void init()
{
CLR_EN;
Send_Com(0x38);
Send_Com(0x0c);
Send_Com(0x06);
Send_Com(0x01);

}
void GPIO_Configuration(void)
{
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB| RCC_APB2Periph_GPIOC, ENABLE);
GPIO_Init(GPIOB,&GPIO_InitStructure);
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_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOA,&GPIO_InitStructure);



}




int main(void)
{

unsigned char num;

GPIO_Configuration();

init();

Send_Com(0x80);

for(num=0;num<=15;num++)
{
Send_Dat(table[num]);
delay_ms(1);
}
while(1);

}
...全文
1407 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
worldy 2020-05-20
  • 打赏
  • 举报
回复
LCD1602属于慢吞吞器件,显示信号之间需要给予足够的延时
Glen_hsu 2020-05-20
  • 打赏
  • 举报
回复
初始化事件不够,1602初始化需要几十ms以上,增加在使用前要有足够的等待事件
xiaodaosnbb 2019-10-24
  • 打赏
  • 举报
回复
你好你这个是直接将1062驱动的吗
「已注销」 2019-07-13
  • 打赏
  • 举报
回复
将里面的JTAG禁用,因为你的板子MCU处理速度和LCD的速度不一样,导致读取数据有误,具体操作如下
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//禁止JTAG功能
liang118038 2017-07-28
  • 打赏
  • 举报
回复
将Senfd_Com和Send_Dat里的延时设大一点吧!十有八九都是这问题,LCD1602本身就是响应慢你这程序又没有读忙动作就要注意每写一次延时都要长一点不能太快!
Hiter18S005048 2017-07-13
  • 打赏
  • 举报
回复
引用 1 楼 wangfan027 的回复:
一个很常见的问题就是MCU复位速度快过1602,导致1602异常. STM32启动后延时一会在操作1602看看
我在主函数1602初始化之前延时了一段时间,还是会出现同样的问题
dceacho 2017-07-12
  • 打赏
  • 举报
回复
一个很常见的问题就是MCU复位速度快过1602,导致1602异常.
STM32启动后延时一会在操作1602看看

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧