找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1757|回复: 7
打印 上一主题 下一主题
收起左侧

LCD1602只显示第一排的黑块,求帮助

[复制链接]
跳转到指定楼层
楼主
单片机用的是stm32f103c8t6,然后在网上找的LCD1602的程序,我主函数里只写了一个打印数字的命令。我不知道是我单片机接口选择的问题还是我硬件接线的问题。希望有大哥帮我看看,谢谢。



因为用的B0-B7所以这个pB2的接口在接线图上没画。
  1. #include "lcd1602.h"

  2. void LCD1602_GPIO_Config(void)
  3. {       
  4.         GPIO_InitTypeDef LCD1602_GPIOStruct;
  5.         RCC_APB2PeriphClockCmd(LCD1602_CLK, ENABLE);
  6.         LCD1602_GPIOStruct.GPIO_Mode = GPIO_Mode_Out_PP;
  7.         LCD1602_GPIOStruct.GPIO_Speed = GPIO_Speed_10MHz;
  8.         LCD1602_GPIOStruct.GPIO_Pin =  LCD1602_E | LCD1602_RS | LCD1602_RW ;
  9.         GPIO_Init(LCD1602_GPIO_PORT,&LCD1602_GPIOStruct);
  10.         LCD1602_GPIOStruct.GPIO_Mode = GPIO_Mode_Out_OD;
  11.         LCD1602_GPIOStruct.GPIO_Pin =   DB0 |  DB1 | DB2 |DB3 |  DB4 | DB5|  DB6 |  DB7 ;
  12.         GPIO_Init(LCD1602_GPIO_PORT,&LCD1602_GPIOStruct);
  13. }

  14. void LCD1602_WaitReady(void)
  15. {
  16.         uint8_t sta;

  17.         GPIOB->ODR =0x00FF;
  18.         RSO(0);
  19.         RWO(1);
  20.         EO(1);
  21.         delay_us(1);
  22.         do{
  23.                 sta=GPIO_ReadInputDataBit(LCD1602_GPIO_PORT,GPIO_Pin_7);
  24.                 EO(0);
  25.         }while(sta);
  26. }

  27. void LCD1602_WriteCmd(uint8_t cmd)
  28. {
  29.         //LCD1602_WaitReady();
  30.         delay_us(15);
  31.         RSO(0);
  32.         RWO(0);
  33.         EO(0);
  34.         delay_us(1);
  35.         EO(1);
  36.         LCD1602_GPIO_PORT->ODR &= (cmd|0xFF00);
  37.         EO(0);
  38.         delay_us(400);
  39. }

  40. void LCD1602_WriteDat(uint8_t dat)
  41. {
  42.         //LCD1602_WaitReady();
  43.         delay_us(15);
  44.         RSO(1);
  45.         RWO(0);
  46.         delay_us(30);
  47.         EO(1);
  48.         LCD1602_GPIO_PORT->ODR &=(dat|0xFF00);
  49.         EO(0);
  50.         delay_us(400);
  51. }

  52. void LCD1602_SetCursor(uint8_t x, uint8_t y)
  53. {
  54.     uint8_t addr;
  55.    
  56.     if (y == 0)
  57.         addr = 0x00 + x;
  58.     else
  59.         addr = 0x40 + x;
  60.     LCD1602_WriteCmd(addr|0x80);
  61. }

  62. void LCD1602_ShowStr(uint8_t x, uint8_t y, uint8_t *str, uint8_t len)
  63. {
  64.     LCD1602_SetCursor(x, y);
  65.     while (len--)
  66.     {
  67.         LCD1602_WriteDat(*str++);
  68.     }
  69. }

  70. //??1???
  71. //x,y :????         
  72. //num:??(0~99)         
  73. //-----------------------------*/         
  74. void LCD_ShowNum(uint8_t x, uint8_t y,uint8_t num)
  75. {     

  76.             LCD1602_SetCursor(x, y);
  77.     LCD_ShowChar(x,y,num+'0');
  78.        
  79. }

  80. void LCD_ShowChar(uint8_t x, uint8_t y,uint8_t dat)
  81. {

  82.             LCD1602_SetCursor(x, y);
  83.         LCD1602_WriteDat(dat);
  84. }



  85. void LCD1602_Init(void)
  86. {       
  87.         LCD1602_GPIO_Config();
  88.     LCD1602_WriteCmd(0X38);
  89.     LCD1602_WriteCmd(0x0C);
  90.     LCD1602_WriteCmd(0x06);
  91.     LCD1602_WriteCmd(0x01);
  92. }
  93.        
  94.        



复制代码
这是.c文件

  1. #ifndef _BSP_LCD1602_H
  2. #define _BSP_LCD1602_H

  3. #include "stm32f10x.h"
  4. #include "stm32f10x_gpio.h"
  5. #include "delay.h"

  6. #define LCD1602_CLK  RCC_APB2Periph_GPIOB  

  7. #define LCD1602_GPIO_PORT   GPIOB

  8. #define LCD1602_E    GPIO_Pin_12
  9. #define LCD1602_RW   GPIO_Pin_13
  10. #define LCD1602_RS   GPIO_Pin_14



  11. #define EO(X)         X? (GPIO_SetBits(LCD1602_GPIO_PORT,LCD1602_E)):(GPIO_ResetBits(LCD1602_GPIO_PORT,LCD1602_E))
  12. #define RWO(X)        X? (GPIO_SetBits(LCD1602_GPIO_PORT,LCD1602_RW)):(GPIO_ResetBits(LCD1602_GPIO_PORT,LCD1602_RW))
  13. #define RSO(X)        X? (GPIO_SetBits(LCD1602_GPIO_PORT,LCD1602_RS)):(GPIO_ResetBits(LCD1602_GPIO_PORT,LCD1602_RS))

  14. #define DB0                                        GPIO_Pin_0
  15. #define DB1                                        GPIO_Pin_1
  16. #define DB2                                        GPIO_Pin_2
  17. #define DB3                                        GPIO_Pin_3
  18. #define DB4                                        GPIO_Pin_4
  19. #define DB5                                        GPIO_Pin_5
  20. #define DB6                                        GPIO_Pin_6
  21. #define DB7                                        GPIO_Pin_7

  22. void LCD1602_Init(void);
  23. void LCD1602_ShowStr(uint8_t x, uint8_t y, uint8_t *str,uint8_t len);
  24. void LCD_ShowNum(uint8_t x, uint8_t y,uint8_t num);
  25. void LCD_ShowChar(uint8_t x, uint8_t y,uint8_t dat);







  26. #endif //_BSP_LCD1602_H
复制代码
这是.h文件
主函数里就是正常的初始化和显示命令。
  1. int main(void)
  2. {
  3.         u8 smog_ppm ;
  4.         u8 Methane_ppm ;
  5.         u8 CO_ppm ;
  6.        
  7.        
  8.         LCD1602_Init();
  9.         userInit();
  10.         window_fan_init();
  11.         Bee_Init();
  12.         delay_init();
  13.         //TIM1_Int_Init(1999 , 35999);
  14.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  15.         USART1_init();
  16.         Smog_Init();
  17.         //LCD1602_Init();
  18.         KEY_Init();                                                        /
  19.         Gizwits_Init();                                                /
  20.        
  21.        

  22.         delay_ms(5);
  23.         while(1)
  24.         {
  25.                 LCD_ShowNum(0,0,99);
  26.         }

  27. }
复制代码
我把程序烧进去了以后就只显示第一排的黑块。因为画PCB的时候没有接上K引脚的线,所以用手引了一根线出来。


我不知道我这是哪里的问题了,希望可以帮我指出来,谢谢各位。




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1066913 发表于 2023-4-18 12:24 | 只看该作者
这是接线图。

接线图.png (145.52 KB, 下载次数: 109)

接线图.png
回复

使用道具 举报

板凳
ID:262 发表于 2023-4-18 17:32 | 只看该作者
来看一下51hei论坛里面解决此问题的痛苦经历吧:
51hei搜索框输入"1602 方块"或者"1602 黑块"或者"1602 白块"或者"1602 格":

这个是io口设置问题,最终搞定了:http://www.51hei.com/bbs/dpj-199732-1.html
http://www.51hei.com/bbs/dpj-168643-1.html
http://www.51hei.com/bbs/dpj-208189-1.html
http://www.51hei.com/bbs/dpj-210690-1.html

既有可能是软件问题也有硬件问题
http://www.51hei.com/bbs/dpj-187378-1.html
http://www.51hei.com/bbs/dpj-160754-1.html
回复

使用道具 举报

地板
ID:1066913 发表于 2023-4-19 18:48 | 只看该作者
heicad 发表于 2023-4-18 17:32
来看一下51hei论坛里面解决此问题的痛苦经历吧:
51hei搜索框输入"1602 方块"或者"1602 黑块"或者"1602 白 ...

我看到一些信息,写的是stm32单片机的一些接口需要关闭复用功能,才可以正常设置i0口的电平,这可能是我初始化不成功的原因
回复

使用道具 举报

5#
ID:384109 发表于 2023-4-19 21:26 | 只看该作者
1602少接一根数据线
回复

使用道具 举报

6#
ID:584814 发表于 2023-4-20 09:05 | 只看该作者
电路图中1602少接数据线,仿真可能不通过;
实际连接不错的话,就是初始化过不去,可查端口设置、连接、时序、延时等。
建议坛内找一下成品先过,然后再对照找原因。

的确少一线.png (307.38 KB, 下载次数: 146)

的确少一线.png
回复

使用道具 举报

7#
ID:1066913 发表于 2023-4-20 15:18 | 只看该作者
man1234567 发表于 2023-4-20 09:05
电路图中1602少接数据线,仿真可能不通过;
实际连接不错的话,就是初始化过不去,可查端口设置、连接、时 ...

谢谢,我现在去找可以实现的程序
回复

使用道具 举报

8#
ID:1066913 发表于 2023-4-21 16:25 | 只看该作者
找成品了也,但是这个屏幕还是只有第一行亮。我要傻
掉了
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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