OpenEdv-开源电子网

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

LCD1602怎么没有显示

[复制链接]

7

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2013-1-29
在线时间
4 小时
发表于 2013-4-14 21:00:25 | 显示全部楼层 |阅读模式
各位大神:

如下是我看到的一个使用LCD1602的程序,在STM32开发板上编译,怎么LCD1602没有显示数据出来,请问是怎么回事呀???
/********************************************************************************
*  描述:                LCD1602 滚动显示                                       *
* 显示方式:                                                                   *
* 1、从左到右逐字显示,闪动二次,清屏。                                        *
* 2、再从右到左逐字显示,闪动二次,清屏。                                      *
* 3、周期性地重复上述显示方式。                                                *                            
********************************************************************************/
#include "stm32f10x_lib.h"

/********************************硬件接口定义*********************************/
#define RS  GPIO_Pin_1 //P2^6;             
#define RW  GPIO_Pin_2 //P2^5;
#define EN  GPIO_Pin_0 //P2^7;

/********************************宏定义*********************************/
#define    LCD_RS(x)  x ? GPIO_SetBits(GPIOB, RS): GPIO_ResetBits(GPIOB, RS)
#define    LCD_RW(x)  x ? GPIO_SetBits(GPIOB, RW): GPIO_ResetBits(GPIOB, RW)
#define    LCD_EN(x)  x ? GPIO_SetBits(GPIOB, EN): GPIO_ResetBits(GPIOB, EN)

/******************************** 变量定义 ---------------------------------------------------------*/
GPIO_InitTypeDef GPIO_InitStructure;     //GPIO
ErrorStatus HSEStartUpStatus;

typedef unsigned char BYTE;
typedef unsigned char BOOL; 

BYTE dis1[] = {"   WELCOME  TO   "};
BYTE dis2[] = {" WWW.PRECHIN.COM "};
BYTE dis3[] = {"   OT  EMOCLEW   "};
BYTE dis4[] = {" MOC.NIHCERP.WWW "};

/*********************************声明函数 -----------------------------------------------*/
void RCC_Configuration(void);
void NVIC_Configuration(void);
void NOP(void);
/*******************************************延时函数**********************************/ 
void NOP()
{ vu16 i;
  for(i=0; i<100; i++); 
}

/*******************************************延时函数**********************************/ 
void delay(vu32 nCount)
{
  for(; nCount != 0; nCount--);
}

/******************************测忙*************************************************/
BOOL lcd_bz()
{                         // 测试LCD忙碌状态
BOOL result;
LCD_RS(0);  //0;
LCD_RW(1);  //1;
LCD_EN(1);  //1;
NOP();
NOP();
result = (GPIO_ReadInputData(GPIOB) & 0x8000)>>8;
LCD_EN(0); // 0;
return result; 
}
/******************************写命令*************************************************/
lcd_wcmd(int cmd)
{                          // 写入指令数据到LCD
while(lcd_bz());
LCD_RS(0); // 0;
LCD_RW(0); // 0;
LCD_EN(0); // 0;
NOP();
NOP(); 
GPIOB->BSRR = cmd<<8 & 0xff00;  //将数据送到P0口 
    GPIOB->BRR = ((~cmd)<<8) & 0xff00;
NOP();
NOP();
LCD_EN(1); // 1;
NOP();
NOP();
LCD_EN(0); // 0;  
}
/******************************设置位置*************************************************/
lcd_pos(BYTE pos)
{                          //设定显示位置
lcd_wcmd(pos | 0x80);
}

/******************************设置位置*************************************************/
lcd_wdat(u8 dat) 
{                          //写入字符显示数据到LCD
while(lcd_bz());
LCD_RS(1); //= 1;
LCD_RW(0); //= 0;
LCD_EN(0); //= 0;
GPIOB->BSRR = dat<<8 & 0xff00;    ////P0 = dat
    GPIOB->BRR = ((~dat)<<8) & 0xff00;
NOP();
NOP();
LCD_EN(1);// = 1;
NOP();
NOP();
LCD_EN(0);// = 0; 
}
lcd_init()
{                        //LCD初始化设定
lcd_wcmd(0x38);          //16*2显示,5*7点阵,8位数据
delay(20000);
lcd_wcmd(0x08); //關顯示,不顯示光標
delay(20000);
lcd_wcmd(0x0c);          //显示开,关光标
delay(20000);
lcd_wcmd(0x06);          //移动光标
delay(20000);
lcd_wcmd(0x01);          //清除LCD的显示内容
delay(20000);
}

main()
{
 BYTE i;

#ifdef DEBUG
debug();  //在线调试使用
#endif
RCC_Configuration();      //系统时钟配置函数 
NVIC_Configuration();     //NVIC配置函数 
   //启动GPIO模块时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB1Periph_TIM2 | RCC_APB2Periph_AFIO, ENABLE);
//把调试设置普通IO口
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);  
                       
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; //所有GPIO为同一类型端口
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //输出的最大频率为50HZ
GPIO_Init(GPIOA, &GPIO_InitStructure);   //初始化GPIOA端口
GPIO_Init(GPIOB, &GPIO_InitStructure);   //初始化GPIOB端口

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 |GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; //所有GPIO为同一类型端口
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //输出的最大频率为50HZ
GPIO_Init(GPIOB, &GPIO_InitStructure);   //初始化GPIOB端口

GPIO_Write(GPIOA,0xffff);  //将GPIOA 16个端口全部置为高电平
GPIO_Write(GPIOB,0xffff);  //将GPIOB 16个端口全部置为高电

lcd_init();               // 初始化LCD
     delay(10);

    while(1)              
   { 
      lcd_wcmd(0x06);            //向右移动光标
      lcd_pos(0);                //设置显示位置为第一行的第1个字符
      i = 0;
     while(dis1[ i ] != '\0')
     {                           //显示字符"WLCOME  TO"
       lcd_wdat(dis1[ i ]);
       i++;
       delay(2000000);                //控制两字之间显示速度
     }
      lcd_pos(0x40);             //设置显示位置为第二行第1个字符
      i = 0;
     while(dis2[ i ] != '\0')
     {
       lcd_wdat(dis2[ i ]);      //显示字符" WWW.PRECHIN.COM  "
       i++;
       delay(2000000);                //控制两字之间显示速度
     }
      delay(80000);                //控制停留时间

      lcd_wcmd(0x01);            //清除LCD的显示内容
      delay(1);
      lcd_wcmd(0x04);            //向左移动光标
     
      lcd_pos(15);               //设置显示位置为第一行的第16个字符
      i = 0;
     while(dis3[ i ] != '\0')
     {                           //显示字符"WLCOME  TO"
       lcd_wdat(dis3[ i ]);
       i++;
       delay(2000000);                //控制两字之间显示速度
     }
      lcd_pos(0x4F);             //设置显示位置为第二行的第16个字符
      i = 0;
     while(dis4[ i ] != '\0')
     {
       lcd_wdat(dis4[ i ]);      //显示字符" WWW.PRECHIN.COM  "
       i++;
       delay(2000000);                //控制两字之间显示速度
     }
      delay(800000);                //控制停留时间

      lcd_wcmd(0x01);            //清除LCD的显示内容
      delay(100000);                //控制两屏转换时间
         
  }
}





/*******************************************************************************
*                           配置RCC
*******************************************************************************/
void RCC_Configuration(void)
{   
 //复位RCC外部设备寄存器到默认值
  RCC_DeInit();

  //打开外部高速晶振
  RCC_HSEConfig(RCC_HSE_ON);

   //等待外部高速时钟准备好
  HSEStartUpStatus = RCC_WaitForHSEStartUp();

  if(HSEStartUpStatus == SUCCESS)   //外部高速时钟已经准别好
  {    
    //开启FLASH的预取功能
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

    //FLASH延迟2个周期
    FLASH_SetLatency(FLASH_Latency_2);
 
  //配置AHB(HCLK)时钟=SYSCLK
    RCC_HCLKConfig(RCC_SYSCLK_Div1);  
  
   //配置APB2(PCLK2)钟=AHB时钟
    RCC_PCLK2Config(RCC_HCLK_Div1); 

    //配置APB1(PCLK1)钟=AHB 1/2时钟
    RCC_PCLK1Config(RCC_HCLK_Div2);

     //配置PLL时钟 == 外部高速晶体时钟*9  LLCLK = 8MHz * 9 = 72 MHz 
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

    //使能PLL时钟
    RCC_PLLCmd(ENABLE);

   //等待PLL时钟就绪
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {
    }

  //配置系统时钟 = PLL时钟
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

   //检查PLL时钟是否作为系统时钟
    while(RCC_GetSYSCLKSource() != 0x08)
    {
    }
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-4-14 21:03:43 | 显示全部楼层
论坛有1602的stm32代码,搜索下,参考下。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2013-3-18
在线时间
0 小时
发表于 2013-4-21 20:26:02 | 显示全部楼层
回复【楼主位】jason_chdsh:
---------------------------------
楼主现在能驱动1602了吗,我遇到了和你一样的问题,没有显示,很是痛苦啊。是不是硬件连接没有加上拉电阻的缘故呢
回复 支持 反对

使用道具 举报

7

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2013-1-29
在线时间
4 小时
 楼主| 发表于 2013-4-28 15:25:23 | 显示全部楼层
回复【3楼】ccz303:
---------------------------------
现在可以了,原来是时间的延时太短了,把发送命令和数据的时间延长些就可以显示了
回复 支持 反对

使用道具 举报

126

主题

820

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1683
金钱
1683
注册时间
2012-10-28
在线时间
62 小时
发表于 2013-4-28 19:00:44 | 显示全部楼层
回复【4楼】jason_chdsh:
---------------------------------
恭喜
坚持学习!就能成功!
回复 支持 反对

使用道具 举报

21

主题

92

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2013-3-21
在线时间
0 小时
发表于 2013-4-28 21:38:41 | 显示全部楼层
回复【5楼】1501697860:
---------------------------------
lcd_wdat(u8 dat) 
{                          //写入字符显示数据到LCD
while(lcd_bz());
LCD_RS(1); //= 1;
LCD_RW(0); //= 0;
LCD_EN(0); //= 0;

GPIOB->BSRR = dat<<8 & 0xff00;    ////P0 = dat
    GPIOB->BRR = ((~dat)<<8) & 0xff00


请教楼主  dat是8位的   你左移了8位不是没了吗??  是不是该是16位啊
努力努力
回复 支持 反对

使用道具 举报

21

主题

92

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2013-3-21
在线时间
0 小时
发表于 2013-4-29 08:17:27 | 显示全部楼层
回复【3楼】ccz303:
---------------------------------
lcd是接的5v的吗??
努力努力
回复 支持 反对

使用道具 举报

126

主题

820

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1683
金钱
1683
注册时间
2012-10-28
在线时间
62 小时
发表于 2013-4-29 08:44:30 | 显示全部楼层
回复【7楼】happy:
---------------------------------
支持3.3V
坚持学习!就能成功!
回复 支持 反对

使用道具 举报

21

主题

92

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2013-3-21
在线时间
0 小时
发表于 2013-4-29 09:35:46 | 显示全部楼层
回复【8楼】1501697860:
---------------------------------
什么的1602啊  
1602的工作电压不应该是4.5~5.5v吗  你的那个数据手册上有3.3v
努力努力
回复 支持 反对

使用道具 举报

3

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2014-5-18
在线时间
0 小时
发表于 2014-11-12 08:49:40 | 显示全部楼层
回复【6楼】happy:
--------------------------------
嗯嗯,感觉好像是
回复 支持 反对

使用道具 举报

8

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2015-3-31
在线时间
0 小时
发表于 2015-3-31 15:35:33 | 显示全部楼层
#include "stm32f10x_lib.h"
请问一下大神这个头文件有吗
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-24 07:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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