[STM32F1] 路过的大神帮忙看看LCD1602的程序,运行之后只显示第一行16黑格

[复制链接]
 楼主| 15907726754 发表于 2016-5-11 11:10 | 显示全部楼层 |阅读模式
如题,下载程序上电之后就这样,程序是在网上找的,修改了IO口而已,大神帮看看是程序问题吗?

  1. 硬件:D0~D7接PA0~7,RS--PC0,RW--PC1,EN--PC2

  2. 头文件LCD1602.h
  3. #ifndef __LCD1602_H
  4. #define __LCD1602_H         
  5. #include "pbdata.h"

  6. #define RS  GPIO_Pin_1 //PC0;            
  7. #define RW  GPIO_Pin_2 //PC1;
  8. #define EN  GPIO_Pin_0 //PC2;

  9. #define RS_H GPIO_SetBits(GPIOC,RS)                //RS置高
  10. #define RS_L GPIO_ResetBits(GPIOC,RS)        //RS置低

  11. #define RW_H GPIO_SetBits(GPIOC,RW)                //RW置高
  12. #define RW_L GPIO_ResetBits(GPIOC,RW)        //RW置低        

  13. #define EN_H GPIO_SetBits(GPIOC,EN)                //EN置高
  14. #define EN_L GPIO_ResetBits(GPIOC,EN)        //EN置低

  15. void LCD1602_Init(void);
  16. void LCD_Write_Command(u8 com);
  17. void LCD_Write_Data(u8 date);
  18. void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);

  19. #endif

  20. 以下为LCD1602.c文件
  21. #include "lcd1602.h"
  22. #include "pbdata.h"

  23. /************************************************************************************************
  24. @f_name: void LCD1602_InitPort(void)
  25. @brief:         初始化硬件端口配置
  26. @param:         None
  27. @return: None
  28. ************************************************************************************************/

  29. /*******************LCD1602初始化************************/
  30. void LCD1602_Init(void)
  31. {              
  32.            LCD_Write_Command(0x38);//设置LCD两行显示,一个数据由5*7点阵表示,数据由8跟线传输
  33.      delay_ms(2);
  34.            LCD_Write_Command(0x01);//清除屏幕显示
  35.            delay_ms(2);
  36.            LCD_Write_Command(0x06);//设定输入方式,增量不移位
  37.            delay_ms(2);
  38.            LCD_Write_Command(0x0c);//开整体显示,关光标,不闪烁
  39.            delay_ms(2);
  40. }


  41. /*******************写指令函数************************/
  42. void LCD_Write_Command(u8 com)                                   
  43. {
  44.   RS_L; //写指令函数和写数据函数其实可以并一起价格 BOOL变量判断是写指令就rs=0写数据就rs=1。
  45.         RW_L;
  46.         EN_H;  //写指令     输入:RS=L,RW=L,E=下降沿脉冲
  47.   GPIO_Write(GPIOA, 0X00FF&com);//该函数一般用来往一次性一个GPIO的多个端口设置
  48.   delay_ms(2);
  49.   EN_L;
  50. }

  51. /*******************写数据函数************************/
  52. void LCD_Write_Data(u8 date)                       
  53. {  
  54.   RS_H;
  55.         RW_L;
  56.         EN_H;        //写数据     输入:RS=H,RW=L,E=下降沿脉冲
  57.   GPIO_Write(GPIOA, 0X00FF&date);//GPIOA的第八位用来作为8位数据口                                          
  58.   delay_ms(2);
  59.   EN_L;
  60. }



  61. MAIN函数main.c
  62. #include "pbdata.h"

  63. void RCC_Configuration(void);
  64. void GPIO_Configuration(void);
  65. void NVIC_Configuration(void);
  66. void USART_Configuration(void);

  67. u8  table1[]="->China Auxy" ;
  68. u8  table2[]="  Welcome To You" ;
  69. int main(void)
  70. {
  71.         u8 i;
  72.         RCC_Configuration();
  73.         GPIO_Configuration();
  74.         //NVIC_Configuration();
  75.         // USART_Configuration();
  76.         LCD1602_Init();
  77.         
  78.           while(1)
  79.   {
  80.     LCD_Write_Command(0x80);//第一行的首地址
  81.     for(i=0;i<16;i++)
  82.     {
  83.        LCD_Write_Data(table1[i]);
  84.              delay_ms(3);
  85.     }

  86.     LCD_Write_Command(0x80+0x40);//第二行的首地址
  87.     for(i=0;i<16;i++)
  88.     {
  89.              LCD_Write_Data(table2[i]);
  90.              delay_ms(3);
  91.     }
  92.   }
  93. }

  94. void RCC_Configuration(void)
  95. {
  96.         SystemInit();
  97.         //RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能PB端口
  98.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1
  99.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//管脚复用
  100.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE);          //使能PA,PC端口时钟
  101. }

  102. void GPIO_Configuration(void)                                //端口配置
  103. {
  104.   GPIO_InitTypeDef GPIO_InitStructure;        
  105.         /*
  106.         //PA9-TX
  107.         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
  108.         GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  109.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出
  110.         GPIO_Init(GPIOA,&GPIO_InitStructure);

  111.         //PA10-RX
  112.         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
  113.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//浮空输入
  114.         GPIO_Init(GPIOA,&GPIO_InitStructure);
  115.         */
  116.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2; //LCD1602的三根控制线rs,rw,en
  117.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //IO口速度为50MHz
  118.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
  119.   GPIO_Init(GPIOC, &GPIO_InitStructure);//根据设定参数初始化GPIOC                                         

  120.         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;//LCD1602的8跟数据线                             //LED1-->PE.5 端口配置, 推挽输出
  121.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
  122.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//IO口速度为50MHz
  123.   GPIO_Init(GPIOA, &GPIO_InitStructure);//根据设定参数初始化GPIOA
  124. }
sky.sun.zz 发表于 2016-5-11 13:47 | 显示全部楼层
楼主:写命令和数据函数中改一下,
void LCD_Write_Command(u8 com)                                   
{
LcdBusy();
  RS_L;
        RW_L;
  
  GPIO_Write(GPIOA, 0X00FF&com);
  EN_H;
__nop();__nop()
  EN_L;
}
1、要判断LCD忙;
2、还有那个延时2毫秒太长了吧。
 楼主| 15907726754 发表于 2016-5-11 16:30 | 显示全部楼层
sky.sun.zz 发表于 2016-5-11 13:47
楼主:写命令和数据函数中改一下,
void LCD_Write_Command(u8 com)                                   
{ ...

不可以直接显示吗?一定要检查忙吗?
 楼主| 15907726754 发表于 2016-5-11 18:41 | 显示全部楼层
问题解决了了,是接RS,RW,EN的PC0-PC1-PC2不知到什么原因不能发送指令,换成PB12-13-14就好了。。。。。
另外刚出来的时候1602只显示第一行,
因为LCD_write_command(0x38);//设置8位格式,2行,5x7
但lcd默认的数据总线是高四位,也就是说上面的命令”3“写进去了,数据总线变为八位,”8“没有写进去,还是显示一行。
解决办法是,上面的命令写两遍,写第二遍的时候数据总线是八位,”8“就可以写进去了。
就可以显示两行了。啊解决了身心一阵舒坦。。。。。。。。。。
2楼说的其实不需要检查忙,直接写也能显示,另外延时少一点。也谢谢2楼!!
deviceplugs 发表于 2016-5-11 22:45 | 显示全部楼层
你是不是后面写完之后给清屏了啊
 楼主| 15907726754 发表于 2016-5-12 09:12 | 显示全部楼层
deviceplugs 发表于 2016-5-11 22:45
你是不是后面写完之后给清屏了啊

不是的,我怀疑是PC0-1-2是ADC的端口,可能供电不足驱动不起来
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

65

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部