搜索
bottom↓
回复: 15

求助,stm32F单片机操作1602的数据端口不是同一组该如何操作

[复制链接]

出0入0汤圆

发表于 2018-11-6 17:47:07 | 显示全部楼层 |阅读模式
需要用stm32f操作1602液晶,画板子时只考虑了布线方便,没有把数据口放在一起,结果出现了下图的情况,对于这种情况,我用下面的方法操作是否可行?
如果不可行,还请各位高手能提供可行的方式,小弟感激不尽。
#define        DATAOUT(x)        GPIO_Write(GPIOC, x & 0x03)        | GPIO_Write(GPIOA, x & 0xfc)        |


void LCD1602_Write_Cmd(u8 cmd)
{
        LCD1602_Wait_Ready();  //判断忙不忙
        LCD_RS_Clr();   
        LCD_RW_Clr();
        DATAOUT(cmd);  //先传高四位
        LCD_EN_Set();
        LCD_EN_Clr();
       
        DATAOUT(cmd<<4); //低四位左移到高四位
        LCD_EN_Set();
        LCD_EN_Clr();
}
无标题.png

出0入0汤圆

发表于 2018-11-6 18:02:54 来自手机 | 显示全部楼层
真是蛋疼啊……用位带吧,反正1602是很低速的。

出0入9汤圆

发表于 2018-11-6 18:09:16 | 显示全部楼层
楼上正解,数据线位操作。

出0入0汤圆

发表于 2018-11-6 18:10:58 | 显示全部楼层
GPIO_Write(GPIOC, x & 0x03) 这样会影响其它脚
我是这样用:
GPIOC->ODR |=...
GPIOC->ODR &=...
或者
GPIOC->ODR =(GPIOC->ODR & ...)|...

出0入4汤圆

发表于 2018-11-6 22:55:35 来自手机 | 显示全部楼层
用子函数或者define把他们组合起来就行了

出0入0汤圆

 楼主| 发表于 2018-11-7 15:18:56 | 显示全部楼层
确实很蛋疼

出0入4汤圆

发表于 2018-11-7 17:30:34 | 显示全部楼层
这种情况我会用函数

出0入0汤圆

发表于 2018-11-7 17:44:31 | 显示全部楼层
蛋疼。
这硬件设计也奇葩了。
呵呵。

出0入0汤圆

发表于 2018-11-7 22:34:07 来自手机 | 显示全部楼层
硬件不足软件补

出0入0汤圆

 楼主| 发表于 2018-11-8 11:26:35 | 显示全部楼层
lcw_swust 发表于 2018-11-6 18:10
GPIO_Write(GPIOC, x & 0x03) 这样会影响其它脚
我是这样用:
GPIOC->ODR |=...

我定义了一个函数,如下所示,请问这样写可以吗?原理图见楼主位,谢谢。
void DATAOUT(u8 data)
{
GPIOC->ODR = (GPIOC->ODR &0xF7FF) | data;  //GPIOC11
GPIOC->ODR = (GPIOC->ODR &0xFBFF) | data;         // GPIOC10
GPIOA->ODR = (GPIOA->ODR &0x7FFF) | data;         //GPIOA15
GPIOA->ODR = (GPIOA->ODR &0xEFFF) | data;         // GPIOA12       
}

出0入0汤圆

发表于 2018-11-8 20:43:59 | 显示全部楼层
deiwgah 发表于 2018-11-8 11:26
我定义了一个函数,如下所示,请问这样写可以吗?原理图见楼主位,谢谢。
void DATAOUT(u8 data)
{

GPIOC11 、GPIOC10可以两位一起操作,不需要一位一位操作。
data不需要移位吗?

出0入0汤圆

发表于 2018-11-8 20:51:23 | 显示全部楼层
用软件可以解决的,我以前也试过其它液晶屏,数据口不在同一组IO上,只能调软件了

出0入0汤圆

发表于 2018-11-9 10:14:48 | 显示全部楼层
wei669 发表于 2018-11-7 22:34
硬件不足软件补

一天进嘴四两土,白天不够夜里补!呵呵!只能软件搞!

出0入0汤圆

 楼主| 发表于 2018-11-9 15:22:55 | 显示全部楼层
懒得折腾了,用了网友的方法:
   if( data & 0x80) LCD_D7_1;
   else         LCD_D7_0;
           
   if( data & 0x40) LCD_D6_1;
   else         LCD_D6_0;
           
   if( data & 0x20) LCD_D5_1;
   else         LCD_D5_0;
           
   if( data & 0x10) LCD_D4_1;
   else         LCD_D4_0;

出0入0汤圆

 楼主| 发表于 2018-11-9 15:24:14 | 显示全部楼层
现在用mdk在线调试没问题,全速运行就乱码,靠,估计是延时不够吧。

出0入0汤圆

发表于 2018-11-9 15:34:05 来自手机 | 显示全部楼层
不是说了用位带吗,你不仔细看看?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 10:20

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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