OpenEdv-开源电子网

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

LCD1602无法显示问题

[复制链接]

1

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2015-5-10
在线时间
0 小时
发表于 2015-5-16 22:48:02 | 显示全部楼层 |阅读模式
5金钱
之前移植了一个1602的程序,对照手册改了I/0配置和初始化程序,但是仍然无法显示,卡了3天了,请大神帮忙看下。
=======================================
LCD162A.H
======================================================
#ifndef __LCD162A_H
#define __LCD162A_H       
#include "sys.h"
#include "stdlib.h"     

 
/*=====================================================
连接线定义: 
DB0-----Pb8  DB4-----Pb12  RS-------PB3
DB1-----Pb9  DB5-----Pb13  RW-------PB4
DB2-----Pb10  DB6-----Pb14  E--------PB5
DB3-----Pb11  DB7-----Pb15  VLCD(Vee)接1K2电阻到GND
VSS-----GND  VCC-----+5v  
======================================================*/
//-----------------LCD162A端口定义----------------         

#define LCD162A_RS PBout(3)
#define LCD162A_RW PBout(4)    
#define LCD162A_E  Bout(5)

//PB8~15,作为数据线
#define DATAOUT(x) GPIOB->ODR=(GPIOB->ODR&0X00FF)|((u16)(x<<8)&0xFF00);
  
//lcd162a控制用函数

void lcd162a_Reset(void); //复位lcd162a 
void lcd162a_DispOneChar(u8 x,u8 y,u8 Wdata);//在指定位置显示一个字符//x:0~15 //y:0~1
void lcd162a_cls(void);    //清屏
void lcd162a_Display(u8 dd);  //显示       
void lcd162a_Init(void); //初始化lcd162a
void lcd162a_LocateXY(u8 posx,u8 posy);  //显示光标位置
void lcd162a_WriteCommand(u8 CMD);
void lcd162a_WriteData(u8 dataW);
void lcd162a_ePutstr(u8 x,u8 y,u8 *ptr); //显示字符串

#endif  

=======================================
LCD162A.C
======================================================
#include "lcd162a.h"
#include "stdlib.h"   
#include "delay.h"
#include "stdio.h"

//清屏
void lcd162a_cls(void)
{
 lcd162a_WriteCommand(0x01); //             
}

//显示
void lcd162a_Display(u8 dd)
{             
 u8 i=0;
 for(i=0;i<16;i++)
 {
  lcd162a_DispOneChar(i,1,dd++);
  dd &=0x7f;
  if (dd<32) dd=32;
 }         
}

//显示光标位置
void lcd162a_LocateXY(u8 posx,u8 posy)
{             
 u8 temp;
 temp=posx & 0xf;
 posy &= 0x01;
 if(posy) temp |=0x40;
 //temp |=0x80;
 lcd162a_WriteCommand(temp);         
}

//在指定位置显示一个字符
//x:0~15
//y:0~1
void lcd162a_DispOneChar(u8 x,u8 y,u8 Wdata)
{             
 lcd162a_LocateXY(x,y);
 lcd162a_WriteData(Wdata);         
}

//显示字符串
void lcd162a_ePutstr(u8 x,u8 y,u8 *ptr)
{             
 u8 i,l=0;

 while (ptr[l] >31)
{
 l++;
};

 for (i=0;i<l;i++)
 {
  lcd162a_DispOneChar(x++,y,ptr);
  if ( x == 16 )
  {
   x = 0; 
   y ^= 1;//异或,换行
  }
 }         
}

/////复位
void lcd162a_Reset(void)
{
 lcd162a_WriteCommand(0x38); //
 delay_ms(15);

 lcd162a_WriteCommand(0x38); //
 delay_ms(15);

 lcd162a_WriteCommand(0x38); //
 delay_ms(15);

 lcd162a_WriteCommand(0x38); //
 lcd162a_WriteCommand(0x08); //

 lcd162a_cls(); //clear device

 lcd162a_WriteCommand(0x06); //
 lcd162a_WriteCommand(0x0c); //
              
}
//写入控制字。
//RS=0,
//RW=0
//E=1
//
void lcd162a_WriteCommand(u8 CMD)
{
 delay_ms(2);  //等待控制器完成指令

 LCD162A_RS=0;
 LCD162A_RW=0;
 LCD162A_E=1;
 
 DATAOUT(CMD); //送控制字
 delay_us(2);

 LCD162A_E=0;               
}

//写入一个字节。
//dataW:要写入的数据/命令
//RS=1
//RW=0
//E=1
//
void lcd162a_WriteData(u8 dataW)
{
 delay_ms(2); //等待控制器完成指令

 LCD162A_RS=1;
 LCD162A_RW=0;
 LCD162A_E=1;
 
 DATAOUT(dataW);

 delay_us(2);

 LCD162A_E=0;              
}


    
//初始化lcd162a        
void lcd162a_Init(void)
{                   
 RCC->APB2ENR|=1<<3;    //使能PORTB时钟
 
 //RCC->APB2ENR|=1<<0;    //开启辅助时钟 
       
  //JTAG_Set(SWD_ENABLE);

 GPIOB->CRH=0X33333333; //pb8-pb15  
 GPIOB->CRL&=0X0F000FFF;//屏蔽pb3,4,5,7设定值
 GPIOB->CRL|=0X30333000;//更改pb3,4,5,7设定值
 GPIOB->ODR|=0XFFB8;//pb3,4,5,7,pb8-pb15全部输出高电平

 lcd162a_Reset();
 lcd162a_cls();
       
}  
////////////////////////////////////////////////////////////////
=================================================================
TEXT.C
===================================================================
#include <stm32f10x_lib.h>
#include "sys.h"
#include "usart.h"  
#include "delay.h" 
#include "led.h" 
#include "key.h"
#include "exti.h"
#include "wdg.h"
#include "timer.h"

#include "lcd162a.h"   
#include "stdio.h"


////待显示的字符串//
u8 *p1="Hello,world.";
   
int main(void)
{  
  int temp=0;
      
 Stm32_Clock_Init(9);  //系统时钟设置
 delay_init(72);       //延时初始化
 uart_init(72,9600);   //串口初始化 
 lcd162a_Init();   //初始化与lcd162a连接的硬件接口

 //lcd162a_cls();
 lcd162a_ePutstr(0,0,p1);
 delay_ms(1000);


 lcd162a_cls();

  while(1)
 {
  p1[temp] &= 0x7f;   // 只显示ASCII字符
  if (p1[temp]<32)p1[temp]=32; // 屏蔽控制字符,不予显示
  lcd162a_Display(p1[temp] );
  delay_ms(400);
 
 }

}


检查了几遍硬件应该没有问题。。不知道哪里错了。。。
原程序最后写的是这样的,我不太理解,所以改了下,2种都试过,但是LCD就只是背板亮。。P.S.:如果我改错了,是否可以解释下下面那段儿程序,菜鸟尚未入门,请大神们指点。
 while(1)
 {
  temp &= 0x7f;   // 只显示ASCII字符
  if (temp<32)temp=32; // 屏蔽控制字符,不予显示
  lcd162a_Display(temp );//“扫描屏幕”
  delay_ms(400);
 
 }




最佳答案

查看完整内容[请看2#楼]

是延时要长,还要加忙检测才行。1602属于低速器件,在51中没啥问题,但是由于M3是高速器件,直接移植51的程序的话会导致不可用。所以需要按照时序调整好时间。
懒惰是发明之母。智力不足,体力补。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2015-3-28
在线时间
2 小时
发表于 2015-5-16 22:48:03 | 显示全部楼层
是延时要长,还要加忙检测才行。1602属于低速器件,在51中没啥问题,但是由于M3是高速器件,直接移植51的程序的话会导致不可用。所以需要按照时序调整好时间。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-5-16 23:17:44 | 显示全部楼层
帮顶。。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2015-5-17 01:13:56 | 显示全部楼层
这厮直接用51的代码移植过来即可使用,没必要这么折腾吧,不过要注意通讯频率,应为M3的主频比51高很多
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2015-5-10
在线时间
0 小时
 楼主| 发表于 2015-5-17 16:00:08 | 显示全部楼层
回复【3楼】八度空间:
---------------------------------
意思是。。应该把延时缩短?
懒惰是发明之母。智力不足,体力补。
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2015-5-10
在线时间
0 小时
 楼主| 发表于 2015-5-17 16:10:41 | 显示全部楼层
回复【5楼】liaolinhui:
---------------------------------
哦,明白了。。去试下。。谢了。。
懒惰是发明之母。智力不足,体力补。
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2015-5-10
在线时间
0 小时
 楼主| 发表于 2015-5-21 18:08:53 | 显示全部楼层
刚刚解决了问题,解决方法简单粗暴,我把控制线换到了PC口。。然后就好使了。。估计是PB高位和低位互相影响了,因为实在没找到哪里影响的,所以就屈服了,直接换端口好了。。感谢大家。。
懒惰是发明之母。智力不足,体力补。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-22 05:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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