stm32F4驱动1602A,只有第一行显示方格

2019-03-23 17:43发布

利用stm32F4驱动1602A显示字符,可是只有显示第一行方格,后来接了10k的变位器调节对比度还是不行。程序上传在附件中了,希望大家能给予解答,谢谢

  1. 主函数
  2. int main(void)
  3. {
  4.         u8 str[]="sghj";
  5.        
  6.         gpioinit();
  7.         delay_ms(10);
  8.   lcdinit();
  9.         delay_ms(20);
  10.         LCD1602_Show_Str(1, 0, str);
  11.        
  12. }

  13. 头文件
  14. #ifndef __LCD_H
  15. #define __LCD_H
  16. #include "sys.h"

  17. #define LCD_RS PEout(0)
  18. #define LCD_RW PEout(1)
  19. #define LCD_E  PEout(2)
  20. #define PORT_DATA GPIOF
  21. #define        DATAOUT(x)        GPIO_Write(GPIOF, x)
  22. #define busy 0x80
  23. #define D7_IN()  {GPIOF->MODER&=~(3<<(8*2));GPIOF->MODER|=0<<8*2;}       
  24. #define D7_OUT() {GPIOF->MODER&=~(3<<(8*2));GPIOF->MODER|=1<<8*2;}


  25. void checkbusy(void);
  26. void lcdinit(void);
  27. void writecommand(unsigned char val,u8 flag);
  28. void portwrite(u8 data);
  29. void writedata(unsigned char data);
  30. void display_position(unsigned char i);
  31. void gpioinit(void);
  32. void port_in( u8 data );
  33. void LCD1602_Show_Str(u8 x, u8 y, u8 *str);
  34. #endif



  35. 子函数:
  36. #include "lcd.h"
  37. #include "delay.h"
  38. #include "led.h"

  39. void checkbusy(void)
  40. {
  41.         u8 sta;
  42.        
  43.         DATAOUT(0xff);
  44.         LCD_RS=0;
  45.         delay_us(200);
  46.         LCD_RW=1;
  47.         delay_us(200);
  48.         do
  49.         {
  50.                 LCD_E=1;
  51.                 delay_ms(5);
  52.                 sta = GPIO_ReadInputDataBit(GPIOF, GPIO_Pin_7);
  53.                 LCD_E=0;
  54.         }while(sta & 0x80);
  55. }


  56. void lcdinit(void)
  57. {
  58.         writecommand(0x38,0);
  59.         delay_ms(5);
  60.         writecommand(0x38,0);
  61.         delay_ms(5);
  62.         writecommand(0x38,0);
  63.   delay_ms(5);
  64.                

  65.        
  66.         writecommand(0x38,1);
  67.         writecommand(0x08,1);
  68.   writecommand(0x01,1);
  69.   writecommand(0x06,1);
  70.   writecommand(0x0C,1);        
  71.        
  72. }

  73. void gpioinit(void)
  74. {
  75.         GPIO_InitTypeDef  GPIO_InitStructure;
  76.        
  77.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE|RCC_AHB1Periph_GPIOF, ENABLE);       
  78.        
  79.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2;
  80.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  81.   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  82.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  83.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  84.         GPIO_Init(GPIOE, &GPIO_InitStructure);       

  85.   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;       
  86.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  87.   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  88.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  89.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  90.         GPIO_Init(GPIOF, &GPIO_InitStructure);       
  91. }




  92. void writedata(unsigned char data)
  93. {
  94.         checkbusy();
  95.   LCD_RS=1;
  96.         delay_us(200);
  97.         LCD_RW=0;
  98.         delay_us(200);
  99.         DATAOUT(data);
  100.         LCD_E=1;
  101.         delay_us(500);
  102.         LCD_E=0;
  103. }

  104. void writecommand(unsigned char i,u8 flag)
  105. {
  106.   if(flag)
  107.         {
  108.                 checkbusy();
  109.         }
  110.         LCD_RS=0;
  111.         delay_us(200);
  112.         LCD_RW=0;
  113.         delay_us(200);
  114.        
  115.         DATAOUT(i);
  116.         delay_us(500);
  117.         LCD_E=1;
  118.         delay_us(500);
  119.         LCD_E=0;
  120. }       

  121. void LCD1602_Set_Cursor(u8 x, u8 y)
  122. {
  123.         u8 addr;
  124.        
  125.         if (y == 0)
  126.                 addr = 0x00 + x;
  127.         else
  128.                 addr = 0x40 + x;
  129.         writecommand(addr|0x80,1);
  130. }

  131. void LCD1602_Show_Str(u8 x, u8 y, u8 *str)
  132. {
  133.         LCD1602_Set_Cursor(x, y);
  134.         while(*str != '')
  135.         {
  136.                 writedata(*str++);
  137.         }
  138. }
复制代码
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
cangsang
1楼-- · 2019-03-24 02:06
/ 你可以试试显示一个字符看看能不能行,把main函数中的LCD1602_Show_Str(1, 0, str);替换成writedata(‘A');
nmg
2楼-- · 2019-03-24 05:07
 精彩回答 2  元偷偷看……
nmg
3楼-- · 2019-03-24 06:00
楼主有代码的建议使用论坛编辑器中的代码嵌入功能,这样网友帮你找问题的时候,更方便查看。如下图所示
QQ截图20170413081242.png
柠檬酸钠
4楼-- · 2019-03-24 06:03
本帖最后由 柠檬酸钠 于 2017-4-13 09:03 编辑

在主函数里面再加一行:   LCD1602_Show_Str(1, 1, str);
看第二行显示不?

Li_Lei
5楼-- · 2019-03-24 10:50
 精彩回答 2  元偷偷看……

一周热门 更多>