微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > 嵌入式系统设计讨论 > +第五篇 ?CMSIS-DAP Mini仿真器下载STM324根数据线点亮液晶

+第五篇 ?CMSIS-DAP Mini仿真器下载STM324根数据线点亮液晶

时间:10-02 整理:3721RD 点击:

真的不容易啊,在STM32下,用四根数据线控制1602,期间遇到很多莫名其妙的问题:

1.      按键红牛板的复位键,液晶屏幕上的显示开始向做循环显示,并且还带着乱码出现。

2.      如果,不读忙,数据可以显示,但是只是显示前8位,两行都是之显示前8位。


3.      写入地址第一个地址显示的是0x81和0xc1(正常应该是0x80,0xc0),真的是不明白是怎么回事。


自己总结出来以上三个经验,总算是艰难的把液晶显示出自己想要的效果了。


截图如下:


再看看自己的电路图吧:


挺乱的,用了4根数据线,这个是重点。绿色的电路板是自己以前做的东西PM检测的,用的51,现在移植到STM32上。

主要的代码:

  1. unsigned char wel[18]="wwelcome  iysheng";
  2. unsigned char PM[18]="PPM2.5:99 PM10:99";

复制代码

定义的都向后移了一位,为了避免第三个问题。

  1. void        lcd_wcmd_4bit(unsigned char cmd)
  2.         {
  3.         unsigned long temp;
  4.         while(lcd_bz()); //读忙
  5.         temp = cmd;
  6.         LCD_RS(0); // 0;
  7.         LCD_RW(0); // 0;
  8.         LCD_EN(0); // 0;
  9.         NOP();
  10.         NOP();          NOP();
  11.         NOP();
  12.         GPIOB->BSRR = (temp<<8) & 0xf000;  //B12--B15
  13.   GPIOB->BRR = ((~temp)<<8) & 0xf000;
  14.         NOP();         NOP();
  15.         NOP();
  16.         NOP();       
  17.         LCD_EN(1); // 1;
  18.         NOP();       
  19.         NOP();        NOP();
  20.         NOP();
  21.         LCD_EN(0); // 0;  

  22.         LCD_RS(0); //= 1;
  23.         LCD_RW(0); //= 0;
  24.         LCD_EN(0); //= 0;
  25.         NOP();
  26.         NOP();          NOP();
  27.         NOP();
  28.         GPIOB->BSRR = (temp<<12) & 0xf000;  //B4--B7
  29.   GPIOB->BRR = ((~temp)<<12) & 0xf000;
  30.         NOP();
  31.         NOP();         NOP();
  32.         NOP();
  33.         LCD_EN(1); // 1;
  34.         NOP();       
  35.         NOP();        NOP();
  36.         NOP();
  37.         LCD_EN(0); // 0;
  38.         }

复制代码

  1. void lcd_wdat( long dat)
  2.         {                          //D′è?×?·???ê?μ?LCD
  3.         while(lcd_bz());
  4.         LCD_RS(1); //= 1;
  5.         LCD_RW(0); //= 0;
  6.         LCD_EN(0); //= 0;
  7.        
  8.         GPIOB->BSRR = (dat<<8) & 0xf000;    //P0 = GPIOB.12.13.14.15
  9.   GPIOB->BRR = ((~dat)<<8) & 0xf000;
  10.         NOP();
  11.         NOP();
  12.         NOP();
  13.         NOP();
  14.         LCD_EN(1);// = 1;
  15.         NOP();
  16.         NOP();
  17.         NOP();
  18.         NOP();
  19.         LCD_EN(0);// = 0;

  20.         LCD_RS(1); //= 1;
  21.         LCD_RW(0); //= 0;
  22.         LCD_EN(0); //= 0;
  23.         NOP();
  24.         NOP();
  25.         NOP();
  26.         NOP();
  27.         GPIOB->BSRR = (dat<<12) & 0xf000;    ////P0 = dat
  28.   GPIOB->BRR = ((~dat)<<12) & 0xf000;
  29.         NOP();
  30.         NOP();
  31.         NOP();
  32.         NOP();
  33.         LCD_EN(1);// = 1;
  34.         NOP();
  35.         NOP();
  36.         NOP();
  37.         NOP();
  38.         LCD_EN(0);// = 0;
  39.         }

复制代码


正确使用读忙,解决了显示没有乱码的问题,以及一行显示16位的问题。

简单的移植,就是从八根数据线,转成了四根数据线,就这么多的问题,针对以上三个问题,期待高手能给点思路?


不就是串行方式而已了啊,搜索下应该很多的

串行方式?不是吧。

串行用的是EN,RS,R/W和busy,并行还要加AD0-7

这个用的是 EN RS R/W AD4-AD7 7根线

哦,那还正是出奇啊,没玩过

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top