+第五篇 ?CMSIS-DAP Mini仿真器下载STM324根数据线点亮液晶
时间:10-02
整理:3721RD
点击:
真的不容易啊,在STM32下,用四根数据线控制1602,期间遇到很多莫名其妙的问题:
1. 按键红牛板的复位键,液晶屏幕上的显示开始向做循环显示,并且还带着乱码出现。
2. 如果,不读忙,数据可以显示,但是只是显示前8位,两行都是之显示前8位。
3. 写入地址第一个地址显示的是0x81和0xc1(正常应该是0x80,0xc0),真的是不明白是怎么回事。
自己总结出来以上三个经验,总算是艰难的把液晶显示出自己想要的效果了。
截图如下:
再看看自己的电路图吧:
挺乱的,用了4根数据线,这个是重点。绿色的电路板是自己以前做的东西PM检测的,用的51,现在移植到STM32上。
主要的代码:
- unsigned char wel[18]="wwelcome iysheng";
- unsigned char PM[18]="PPM2.5:99 PM10:99";
定义的都向后移了一位,为了避免第三个问题。
- void lcd_wcmd_4bit(unsigned char cmd)
- {
- unsigned long temp;
- while(lcd_bz()); //读忙
- temp = cmd;
- LCD_RS(0); // 0;
- LCD_RW(0); // 0;
- LCD_EN(0); // 0;
- NOP();
- NOP(); NOP();
- NOP();
- GPIOB->BSRR = (temp<<8) & 0xf000; //B12--B15
- GPIOB->BRR = ((~temp)<<8) & 0xf000;
- NOP(); NOP();
- NOP();
- NOP();
- LCD_EN(1); // 1;
- NOP();
- NOP(); NOP();
- NOP();
- LCD_EN(0); // 0;
- LCD_RS(0); //= 1;
- LCD_RW(0); //= 0;
- LCD_EN(0); //= 0;
- NOP();
- NOP(); NOP();
- NOP();
- GPIOB->BSRR = (temp<<12) & 0xf000; //B4--B7
- GPIOB->BRR = ((~temp)<<12) & 0xf000;
- NOP();
- NOP(); NOP();
- NOP();
- LCD_EN(1); // 1;
- NOP();
- NOP(); NOP();
- NOP();
- LCD_EN(0); // 0;
- }
- void lcd_wdat( long dat)
- { //D′è?×?·???ê?μ?LCD
- while(lcd_bz());
- LCD_RS(1); //= 1;
- LCD_RW(0); //= 0;
- LCD_EN(0); //= 0;
-
- GPIOB->BSRR = (dat<<8) & 0xf000; //P0 = GPIOB.12.13.14.15
- GPIOB->BRR = ((~dat)<<8) & 0xf000;
- NOP();
- NOP();
- NOP();
- NOP();
- LCD_EN(1);// = 1;
- NOP();
- NOP();
- NOP();
- NOP();
- LCD_EN(0);// = 0;
- LCD_RS(1); //= 1;
- LCD_RW(0); //= 0;
- LCD_EN(0); //= 0;
- NOP();
- NOP();
- NOP();
- NOP();
- GPIOB->BSRR = (dat<<12) & 0xf000; ////P0 = dat
- GPIOB->BRR = ((~dat)<<12) & 0xf000;
- NOP();
- NOP();
- NOP();
- NOP();
- LCD_EN(1);// = 1;
- NOP();
- NOP();
- NOP();
- NOP();
- LCD_EN(0);// = 0;
- }
正确使用读忙,解决了显示没有乱码的问题,以及一行显示16位的问题。
简单的移植,就是从八根数据线,转成了四根数据线,就这么多的问题,针对以上三个问题,期待高手能给点思路?
不就是串行方式而已了啊,搜索下应该很多的
串行方式?不是吧。
串行用的是EN,RS,R/W和busy,并行还要加AD0-7
这个用的是 EN RS R/W AD4-AD7 7根线
哦,那还正是出奇啊,没玩过