OpenEdv-开源电子网

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

stm32f103驱动lcd1602总是显示一行方块,请问是什么原因呢?

[复制链接]

0

主题

2

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2020-5-2
在线时间
7 小时
发表于 2020-10-2 16:57:21 | 显示全部楼层 |阅读模式
1金钱
LCD上电以后,显示一行方块。驱动改了好久还是没有改变。贴上源码
  1. #ifndef LCD1602_H
  2. #define        LCD1602_H
  3. #include "sys.h"
  4. /****指令****/
  5. #define ClearDispaly                                0X01        //清除显示
  6. #define        ResetGB                                                0X02        //光标复位
  7. #define        GB_MOV_L_CHAR_NO_MOV                0X04        //光标左移,文字不移动
  8. #define        GB_MOV_L_CHAR_MOV                        0X05        //光标左移,文字移动
  9. #define        GB_MOV_R_CHAR_NO_MOV                0X06        //光标右移,文字不移动
  10. #define        GB_MOV_R_CHAR_MOV                        0X07        //光标右移,文字移动
  11. #define        Display_off                                        0X08        //整体显示关
  12. #define        Display_on_GB_off                        0X0C        //整体显示开,光标关
  13. #define        Display_on_GB_on_NoBlink        0X0E        //整体显示开,光标开,光标不闪烁
  14. #define        Display_on_GB_on_Blink                0X0F        //整体显示开,光标开,光标闪烁
  15. #define        GB_MOV                                                0X10        //光标移位
  16. #define        CHAR_MOV                                        0X18        //显示文字移位

  17. //4总线
  18. #define        Line4_H1_A5XA7                                0X30        //4总线,单行显示,5*7点阵字符
  19. #define        Line4_H1_A5XA10                                0X34        //4总线,单行显示,5*10点阵字符
  20. #define        Line4_H2_A5XA7                                0X38        //4总线,双行显示,5*7点阵字符
  21. #define        Line4_H2_A5XA10                                0X3A        //4总线,双行显示,5*10点阵字符
  22. //8总线
  23. #define        Line8_H1_A5XA7                                0X20        //8总线,单行显示,5*7点阵字符
  24. #define        Line8_H1_A5XA10                                0X24        //8总线,单行显示,5*10点阵字符
  25. #define        Line8_H2_A5XA7                                0X28        //8总线,双行显示,5*7点阵字符
  26. #define        Line8_H2_A5XA10                                0X2A        //8总线,双行显示,5*10点阵字符

  27. #define        No_Busy                                                0X00        //不忙

  28. /*
  29. IO引脚配置
  30. RS-PB12        RW-PB13        E-PB14

  31. D0-PB15        D1-PA8        D2-PA9        D3-PA10
  32. D4-PA11        D5-PA12        D6-PA15        D7-PB3
  33. */

  34. #define RS PBout(12)
  35. #define RW PBout(13)
  36. #define E PBout(14)

  37. #define D0 PBout(15)
  38. #define D1 PAout(8)
  39. #define D2 PAout(9)
  40. #define D3 PAout(10)

  41. #define D4 PAout(11)
  42. #define D5 PAout(12)
  43. #define D6 PAout(15)

  44. #define D7 PBout(3)
  45. #define I7 PBin(3)
  46. //////////////////////////
  47. //PB3 OUT--IN
  48. #define LCD_IN()  {GPIOB->CRL&=~(0x0f<<4*3);GPIOB->CRL|=8<<4*3;GPIOB->ODR&=~(1<<3);GPIOB->ODR|=1<<3;} //上拉输入
  49. #define LCD_OUT()        {GPIOB->CRL&=~(0x0f<<4*3);GPIOB->CRL|=3<<4*3;}//输出
  50. /*
  51. IO引脚配置
  52. RS-PB12        RW-PB13        E-PB14
  53. D0-PB15        D1-PA8        D2-PA9        D3-PA10        
  54. D4-PA11        D5-PA12        D6-PA15        D7-PB3
  55. */

  56. void Check_Busy(void);
  57. void Write_Cmd(u32 Cmd);
  58. void Write_Data(u32 Data);
  59. void Read_State(void);
  60. void LCD1602_Init(void);
  61. u8 Read_Data(void);

  62. void WriteData_Display(u16 Add, u16 Data);
  63. #endif




复制代码
  1. #include "LCD1602.h"
  2. #include "delay.h"
  3. /**Xuanzhe**/

  4. /*
  5. #define ClearDispaly                                0X01        //清除显示
  6. #define        ResetGB                                                0X02        //光标复位
  7. #define        GB_MOV_L_CHAR_NO_MOV                0X04        //光标左移,文字不移动
  8. #define        GB_MOV_L_CHAR_MOV                        0X05        //光标左移,文字移动
  9. #define        GB_MOV_R_CHAR_NO_MOV                0X06        //光标右移,文字不移动
  10. #define        GB_MOV_R_CHAR_MOV                        0X07        //光标右移,文字移动
  11. #define        Display_off                                        0X08        //整体显示关
  12. #define        Display_on_GB_off                        0X0C        //整体显示开,光标关
  13. #define        Display_on_GB_on_NoBlink        0X0E        //整体显示开,光标开,光标不闪烁
  14. #define        Display_on_GB_on_Blink                0X0F        //整体显示开,光标开,光标闪烁
  15. #define        GB_MOV                                                0X10        //光标移位
  16. #define        CHAR_MOV                                        0X18        //显示文字移位
  17. //4总线
  18. #define        Line4_H1_A5XA7                                0X30        //4总线,单行显示,5*7点阵字符
  19. #define        Line4_H1_A5XA10                                0X34        //4总线,单行显示,5*10点阵字符
  20. #define        Line4_H2_A5XA7                                0X38        //4总线,双行显示,5*7点阵字符
  21. #define        Line4_H2_A5XA10                                0X3A        //4总线,双行显示,5*10点阵字符
  22. //8总线
  23. #define        Line8_H1_A5XA7                                0X20        //8总线,单行显示,5*7点阵字符
  24. #define        Line8_H1_A5XA10                                0X24        //8总线,单行显示,5*10点阵字符
  25. #define        Line8_H2_A5XA7                                0X28        //8总线,双行显示,5*7点阵字符
  26. #define        Line8_H2_A5XA10                                0X2A        //8总线,双行显示,5*10点阵字符
  27. #define        No_Busy                                                0X00        //不忙
  28. */

  29. //RS--片选信号--拉低选择指令寄存器,拉高选择数据寄存器               
  30. //RW--读写信号线--高电平读操作,低电平写操作
  31. //E---使能线,跳变

  32. /*
  33. IO引脚配置
  34. RS-PB12        RW-PB13        E-PB14d
  35. D0-PB15        D1-PA8        D2-PA9        D3-PA10        
  36. D4-PA11        D5-PA12        D6-PA15        D7-PB3
  37. */

  38. void Check_Busy(void){
  39.         Read_State();
  40. }



  41. void Write_Cmd(u32 Cmd) {
  42.         //写指令
  43.         LCD_OUT();
  44.         RS=0;//拉低片选信号,选择指令寄存器
  45.         RW=0;//拉低读写信号,选择写操作
  46.         E=0;//拉低使能信号
  47.         
  48.         //写入的指令
  49.         D0=(Cmd&0x01)>>0;
  50.         D1=(Cmd&0x02)>>1;
  51.         D2=(Cmd&0x04)>>2;
  52.         D3=(Cmd&0x08)>>3;
  53.         D4=(Cmd&0x10)>>4;
  54.         D5=(Cmd&0x20)>>5;
  55.         D6=(Cmd&0x40)>>6;
  56.         D7=(Cmd&0x80)>>7;
  57.         
  58.         E = 1;//拉高使能信号
  59.         E=0;
  60. }

  61. void Write_Data(u32 Data) {
  62.         //写数据
  63.         LCD_OUT();
  64.         RS = 1;//拉高片选信号,选择数据寄存器
  65.         RW = 0;//拉低读写信号,选择写操作

  66.         E = 0;//拉低使能信号

  67.         D0=(Data&0x01)>>0;
  68.         D1=(Data&0x02)>>1;
  69.         D2=(Data&0x04)>>2;
  70.         D3=(Data&0x08)>>3;
  71.         D4=(Data&0x10)>>4;
  72.         D5=(Data&0x20)>>5;
  73.         D6=(Data&0x40)>>6;
  74.         D7=(Data&0x80)>>7;

  75.         E = 1;//拉高使能信号
  76.         E=0;
  77. }

  78. void Read_State(void) {
  79.         u8 sta;
  80.         LCD_IN();
  81.         //读状态
  82.         RS = 0;//拉低片选信号,选择指令寄存器
  83.         RW = 1;//拉高读写信号,选择读操作
  84.         E = 0;//拉低使能信号
  85.         E = 1;//拉高使能信号
  86.         sta= I7;
  87.         E = 0;//拉低使能信号
  88.         while(sta);

  89. }

  90. //在LCD1602的指定显示地址写入数据
  91. void WriteData_Display(u16 Add, u16 Data) {
  92.         u16 OffSet_Address = 0x80;
  93.         u16 True_Add;//实际应该写入的地址数据,最高位恒定为1
  94.         True_Add = OffSet_Address + Add;

  95.         Check_Busy();
  96.         Write_Cmd(True_Add);
  97.         Check_Busy();
  98.         Write_Data(Data);
  99.         }

  100. void LCD1602_Init(void) {
  101.         GPIO_InitTypeDef GPIO_InitStruct;

  102.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
  103.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

  104.         GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
  105.         GPIO_InitStruct.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
  106.         GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
  107.         GPIO_Init(GPIOB,&GPIO_InitStruct);
  108.         
  109.         GPIO_InitStruct.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_15;
  110.         GPIO_Init(GPIOA,&GPIO_InitStruct);
  111.         
  112.         delay_ms(15);
  113.         Write_Cmd(Line8_H2_A5XA7);
  114.   delay_ms(15);
  115.         Write_Cmd(Line8_H2_A5XA7);
  116.         delay_ms(15);
  117.         Write_Cmd(Line8_H2_A5XA7);
  118.         
  119.         //以下要检测忙信号
  120.         Check_Busy();
  121.         Write_Cmd(Line8_H2_A5XA7);
  122.         Check_Busy();
  123.         Write_Cmd(Display_off);
  124.         Check_Busy();
  125.         Write_Cmd(ClearDispaly);
  126.         Check_Busy();
  127.         Write_Cmd(GB_MOV_R_CHAR_NO_MOV);
  128.         Check_Busy();
  129.         Write_Cmd(Display_on_GB_on_Blink);
  130. }



复制代码


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4478
金钱
4478
注册时间
2013-4-22
在线时间
337 小时
发表于 2020-10-15 20:56:20 | 显示全部楼层
回复

使用道具 举报

11

主题

2143

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4880
金钱
4880
注册时间
2015-1-10
在线时间
611 小时
发表于 2020-10-16 09:11:25 | 显示全部楼层
打包工程上来,有1602的朋友说不定会帮你调试了看看
回复

使用道具 举报

4

主题

58

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
489
金钱
489
注册时间
2019-5-31
在线时间
170 小时
发表于 2020-10-16 15:12:11 | 显示全部楼层
LCD上电以后,显示一行方块。这个问题唯有初始化不完整才会导致的
回复

使用道具 举报

4

主题

58

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
489
金钱
489
注册时间
2019-5-31
在线时间
170 小时
发表于 2020-10-16 15:20:06 | 显示全部楼层
你把 Check_Busy();换成延时30ms,说不定就好了
回复

使用道具 举报

4

主题

58

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
489
金钱
489
注册时间
2019-5-31
在线时间
170 小时
发表于 2020-10-16 15:29:54 | 显示全部楼层
void Read_State(void) {
        u8 sta;
        LCD_IN();
        //读状态
        RS = 0;//拉低片选信号,选择指令寄存器
        RW = 1;//拉高读写信号,选择读操作
        E = 0;//拉低使能信号
        E = 1;//拉高使能信号
        sta= I7;
        E = 0;//拉低使能信号
        while(sta);//这行代码放在在这里,要么死循环,要么读不到忙。

}
回复

使用道具 举报

15

主题

184

帖子

0

精华

高级会员

Rank: 4

积分
647
金钱
647
注册时间
2014-4-29
在线时间
299 小时
发表于 2020-10-16 17:57:14 | 显示全部楼层
lcd1602的驱动代码建议直接从arduino的库里面抠,那个肯定是没问题的,而且你买屏的时候基本都会送一份,叫 LiquidCrystal。
然后底层的gpio驱动继续用原子哥的就行,再检查一下GPIO和时钟初始化的配置,和硬件接线,基本就没问题了。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-17 19:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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