OpenEdv-开源电子网

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

stm32 控制并行通讯的LCD 这样的电路图 程序怎么写

[复制链接]

8

主题

97

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
17563
金钱
17563
注册时间
2016-1-20
在线时间
63 小时
发表于 2016-3-2 16:30:02 | 显示全部楼层 |阅读模式
200金钱
LCD8位的并口与STM32引脚的连接 完全没有章法,这样的电路还能实现显示吗,思路说一下可以吗。 QQ截图20160302162520.png

最佳答案

查看完整内容[请看2#楼]

在各位网友的帮助下 ,写出一个无论用哪一组,用几组IO,IO乱序控制,都直接控制并口lcd的方法,抽出时间把部分代码发出来给大家看一下 ,引脚定义,这里8位的并口用了;两组io ,分别是F3 : F2,D15 : D11。 [mw_shl_code=c,true]uint8_t ReadByteFromLCD(void) { uint8_t res=0; res=(LCD_D0_IN7); //SEGGER_RTT_printf(0,"write byte: 0X%4.4x \n", byte); } #define LCD_RS( ...
---------------------------------------------------
个人论坛博客:macian.cn
个人淘宝小店:macian.taobao.com
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

97

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
17563
金钱
17563
注册时间
2016-1-20
在线时间
63 小时
 楼主| 发表于 2016-3-2 16:30:03 | 显示全部楼层
本帖最后由 YMC 于 2016-4-5 16:46 编辑

在各位网友的帮助下 ,写出一个无论用哪一组,用几组IO,IO乱序控制,都直接控制并口lcd的方法,抽出时间把部分代码发出来给大家看一下 ,引脚定义,这里8位的并口用了;两组io ,分别是F3 : F2,D15 : D11。
[mw_shl_code=c,true]uint8_t  ReadByteFromLCD(void)
{
  uint8_t res=0;                     
        res=(LCD_D0_IN<<0)|(LCD_D1_IN<<1)
           |(LCD_D2_IN<<2)|(LCD_D3_IN<<3)
           |(LCD_D4_IN<<4)|(LCD_D5_IN<<5)
           |(LCD_D6_IN<<6)|(LCD_D7_IN<<7);
  //SEGGER_RTT_printf(0, "read res: 0X%4.4x \n", res);
        return res;
}

void WriteByteToLCD(uint8_t byte)
{
    LCD_D0_OUT((byte&0x01)>>0);
         LCD_D1_OUT((byte&0x02)>>1);
         LCD_D2_OUT((byte&0x04)>>2);
         LCD_D3_OUT((byte&0x08)>>3);
         LCD_D4_OUT((byte&0x10)>>4);
         LCD_D5_OUT((byte&0x20)>>5);
         LCD_D6_OUT((byte&0x40)>>6);
         LCD_D7_OUT((byte&0x80)>>7);
   //SEGGER_RTT_printf(0,"write byte: 0X%4.4x \n", byte);
}



#define   LCD_RS(x)   x ? HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET) : HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET)
#define   LCD_RST(x)  x ? HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_SET) : HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_RESET)
#define   LCD_RW(x)   x ? HAL_GPIO_WritePin(GPIOC, GPIO_PIN_12, GPIO_PIN_SET) : HAL_GPIO_WritePin(GPIOC, GPIO_PIN_12, GPIO_PIN_RESET)         
#define   LCD_EN(x)   x ? HAL_GPIO_WritePin(GPIOC, GPIO_PIN_10, GPIO_PIN_SET) : HAL_GPIO_WritePin(GPIOC, GPIO_PIN_10, GPIO_PIN_RESET)           
#define   LCD_PSB(x)  x ? HAL_GPIO_WritePin(GPIOF, GPIO_PIN_6, GPIO_PIN_SET) : HAL_GPIO_WritePin(GPIOF, GPIO_PIN_6, GPIO_PIN_RESET)         

#define   LCD_D0_OUT(x)  x ? HAL_GPIO_WritePin(GPIOF, GPIO_PIN_3, GPIO_PIN_SET) : HAL_GPIO_WritePin(GPIOF, GPIO_PIN_3, GPIO_PIN_RESET)
#define   LCD_D1_OUT(x)  x ? HAL_GPIO_WritePin(GPIOF, GPIO_PIN_2, GPIO_PIN_SET) : HAL_GPIO_WritePin(GPIOF, GPIO_PIN_2, GPIO_PIN_RESET)
#define   LCD_D2_OUT(x)  x ? HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15, GPIO_PIN_SET) : HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15, GPIO_PIN_RESET)
#define   LCD_D3_OUT(x)  x ? HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_SET) : HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_RESET)
#define   LCD_D4_OUT(x)  x ? HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, GPIO_PIN_SET) : HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, GPIO_PIN_RESET)
#define   LCD_D5_OUT(x)  x ? HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_SET) : HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_RESET)
#define   LCD_D6_OUT(x)  x ? HAL_GPIO_WritePin(GPIOD, GPIO_PIN_11, GPIO_PIN_SET) : HAL_GPIO_WritePin(GPIOD, GPIO_PIN_11, GPIO_PIN_RESET)
#define   LCD_D7_OUT(x)  x ? HAL_GPIO_WritePin(GPIOD, GPIO_PIN_10, GPIO_PIN_SET) : HAL_GPIO_WritePin(GPIOD, GPIO_PIN_10, GPIO_PIN_RESET)

#define   LCD_D0_IN  HAL_GPIO_ReadPin(GPIOF, GPIO_PIN_3)   
#define   LCD_D1_IN  HAL_GPIO_ReadPin(GPIOF, GPIO_PIN_2)     
#define   LCD_D2_IN  HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_15)     
#define   LCD_D3_IN  HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_14)   
#define   LCD_D4_IN  HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_13)     
#define   LCD_D5_IN  HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_12)   
#define   LCD_D6_IN  HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_11)     
#define   LCD_D7_IN  HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_10)  [/mw_shl_code]


---------------------------------------------------
个人论坛博客:macian.cn
个人淘宝小店:macian.taobao.com
回复

使用道具 举报

2

主题

19

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
366
金钱
366
注册时间
2016-1-15
在线时间
72 小时
发表于 2016-3-2 16:59:14 | 显示全部楼层
画这图的人真是个人才
回复

使用道具 举报

8

主题

97

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
17563
金钱
17563
注册时间
2016-1-20
在线时间
63 小时
 楼主| 发表于 2016-3-2 18:33:51 | 显示全部楼层
会划水的小鱼 发表于 2016-3-2 16:59
画这图的人真是个人才

那可不是 无语了,
---------------------------------------------------
个人论坛博客:macian.cn
个人淘宝小店:macian.taobao.com
回复

使用道具 举报

8

主题

97

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
17563
金钱
17563
注册时间
2016-1-20
在线时间
63 小时
 楼主| 发表于 2016-3-2 18:35:05 | 显示全部楼层
yklstudent 发表于 2016-3-2 17:12
可以,只不过数据赋值需要处理;

定义一个变量 当做寄存器一样 把数值存储起来 再分配到相应的引脚吗
---------------------------------------------------
个人论坛博客:macian.cn
个人淘宝小店:macian.taobao.com
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-3-2 20:26:41 | 显示全部楼层
将数据拆分。然后分别赋值给各个IO口。来实现通信。不过速度奇慢。。。。
回复

使用道具 举报

13

主题

276

帖子

0

精华

高级会员

Rank: 4

积分
697
金钱
697
注册时间
2014-6-20
在线时间
146 小时
发表于 2016-3-2 22:11:44 | 显示全部楼层
我能告诉你,能,肯定能,也能告诉你,累死效率低可靠性还低爆了
回复

使用道具 举报

9

主题

167

帖子

0

精华

高级会员

Rank: 4

积分
552
金钱
552
注册时间
2013-12-15
在线时间
29 小时
发表于 2016-3-2 22:47:30 | 显示全部楼层
举例说明以下两条指令

LCD_WR_REG(0xCF);  
LCD_WR_DATA(0xCF);

首先 LCD_WR_REG(0xCF);  

LCD_CS=0;
LCD_RD=1;
LCD_RS=0;
PD[10:15]= 110011;
PF[ 2 – 3] = 11;
LCD_WR=0;
LCD_WR=1;
LCD_CS=1;

以上执行完成LCD_WR_REG(0xCF);  

然后 LCD_WR_DATA(0xCF);
LCD_CS=0;
LCD_RD=1;
LCD_RS=1;
PD[10:15]= 110011;
PF[ 2 – 3] = 11;
LCD_WR=0;
LCD_WR=1;
LCD_CS=1;

以上执行完成LCD_WR_DATA(0xCF);  
我是初学者
专注显示科技 - - - 让每一DOT诠释生命的精彩
TFT显示屏:   https://boy-display.taobao.com
回复

使用道具 举报

9

主题

167

帖子

0

精华

高级会员

Rank: 4

积分
552
金钱
552
注册时间
2013-12-15
在线时间
29 小时
发表于 2016-3-2 22:48:11 | 显示全部楼层
画图的确实奇葩,如果是纯做硬件的,那就真是和做软件的有仇呀!!!
我是初学者
专注显示科技 - - - 让每一DOT诠释生命的精彩
TFT显示屏:   https://boy-display.taobao.com
回复

使用道具 举报

8

主题

97

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
17563
金钱
17563
注册时间
2016-1-20
在线时间
63 小时
 楼主| 发表于 2016-3-3 09:44:18 | 显示全部楼层
豹影显示 发表于 2016-3-2 22:47
举例说明以下两条指令

LCD_WR_REG(0xCF);  

我来试一试,我觉得端序是不是应该
PD[10:15]= 110011;
PF[ 2 – 3] = 11;

写成
PF[ 3 :2] = 11;
PD[15:10]= 001111;
---------------------------------------------------
个人论坛博客:macian.cn
个人淘宝小店:macian.taobao.com
回复

使用道具 举报

8

主题

97

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
17563
金钱
17563
注册时间
2016-1-20
在线时间
63 小时
 楼主| 发表于 2016-3-3 09:47:14 | 显示全部楼层
豹影显示 发表于 2016-3-2 22:48
画图的确实奇葩,如果是纯做硬件的,那就真是和做软件的有仇呀!!!

是啊 ,公司是外聘一个硬件工程师做的板子,我觉得他有点不了解软件 ,而且用的是F0的板子 ,LQFP 100根本没有F8这个引脚 ,第73引脚是F6,真是麻烦要死。。
---------------------------------------------------
个人论坛博客:macian.cn
个人淘宝小店:macian.taobao.com
回复

使用道具 举报

8

主题

97

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
17563
金钱
17563
注册时间
2016-1-20
在线时间
63 小时
 楼主| 发表于 2016-3-3 09:49:11 | 显示全部楼层
正点原子 发表于 2016-3-2 20:26
将数据拆分。然后分别赋值给各个IO口。来实现通信。不过速度奇慢。。。。

原子哥,这样赋值,转来转去的会不会导致LCD显示不稳定,板子有没有必要联系他让他改下。。
---------------------------------------------------
个人论坛博客:macian.cn
个人淘宝小店:macian.taobao.com
回复

使用道具 举报

58

主题

359

帖子

0

精华

高级会员

Rank: 4

积分
987
金钱
987
注册时间
2014-9-29
在线时间
261 小时
发表于 2016-3-3 09:59:58 | 显示全部楼层
你要知道,别人是做硬件的,他的布线会方便很多,哈哈
回复

使用道具 举报

58

主题

359

帖子

0

精华

高级会员

Rank: 4

积分
987
金钱
987
注册时间
2014-9-29
在线时间
261 小时
发表于 2016-3-3 10:01:07 | 显示全部楼层
对了,正常情况下,8位并口应该怎么分布啊。。。
回复

使用道具 举报

58

主题

359

帖子

0

精华

高级会员

Rank: 4

积分
987
金钱
987
注册时间
2014-9-29
在线时间
261 小时
发表于 2016-3-3 10:03:54 | 显示全部楼层
12864的话速度完全够啊,如果是彩屏的当我没问(我也同认为画图的是个奇葩)。。。
回复

使用道具 举报

2

主题

19

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
366
金钱
366
注册时间
2016-1-15
在线时间
72 小时
发表于 2016-3-3 10:17:46 | 显示全部楼层
void LCD12684_Wdat(u8 dat)
{
        while(LCD12864_busy()); //忙检测
        LCD_RS(1);      
        LCD_RW(0);
        LCD_EN(0);
        delay_ms(2);
                 
        GPIOF->ODR=((GPIOF->ODR & 0xfff3)|((dat & 0x03) << 2));
                                                //将数据的最后两位左移2位后赋给GPIOF的三四位
        GPIOD->ODR=((GPIOD->ODR & 0xff03)|((dat & 0xfc) << 8));
                                                //将数据的前6位左移8位后赋给GPIOD的11到16位
        delay_ms(2);
        LCD_EN(1);
        delay_ms(2);
        LCD_EN(0);
}
你看这个思路可不可以?
回复

使用道具 举报

9

主题

167

帖子

0

精华

高级会员

Rank: 4

积分
552
金钱
552
注册时间
2013-12-15
在线时间
29 小时
发表于 2016-3-3 10:25:19 来自手机 | 显示全部楼层
YMC 发表于 2016-3-3 09:44
我来试一试,我觉得端序是不是应该
PD[10:15]= 110011;
PF[ 2 – 3] = 11;

这两个先后沒关系,送出来都是被锁在lo口上的!!
回复

使用道具 举报

9

主题

167

帖子

0

精华

高级会员

Rank: 4

积分
552
金钱
552
注册时间
2013-12-15
在线时间
29 小时
发表于 2016-3-3 10:26:48 来自手机 | 显示全部楼层
YMC 发表于 2016-3-3 09:44
我来试一试,我觉得端序是不是应该
PD[10:15]= 110011;
PF[ 2 – 3] = 11;

你自己再想想高低位吧
回复

使用道具 举报

8

主题

97

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
17563
金钱
17563
注册时间
2016-1-20
在线时间
63 小时
 楼主| 发表于 2016-3-3 10:32:50 | 显示全部楼层
闪电之舞 发表于 2016-3-3 10:01
对了,正常情况下,8位并口应该怎么分布啊。。。

让我画图 也要把并口画在同一组IO上,避免了多少不必要的麻烦 。。。
---------------------------------------------------
个人论坛博客:macian.cn
个人淘宝小店:macian.taobao.com
回复

使用道具 举报

9

主题

167

帖子

0

精华

高级会员

Rank: 4

积分
552
金钱
552
注册时间
2013-12-15
在线时间
29 小时
发表于 2016-3-3 17:03:47 | 显示全部楼层
如果是8位并口,你可以把8位数据线安排在某口的低8位,4个控制线安排在同一个口的高8位上即可,方便编程
我是初学者
专注显示科技 - - - 让每一DOT诠释生命的精彩
TFT显示屏:   https://boy-display.taobao.com
回复

使用道具 举报

9

主题

167

帖子

0

精华

高级会员

Rank: 4

积分
552
金钱
552
注册时间
2013-12-15
在线时间
29 小时
发表于 2016-3-3 17:08:06 | 显示全部楼层
YMC 发表于 2016-3-3 10:32
让我画图 也要把并口画在同一组IO上,避免了多少不必要的麻烦 。。。

为了你的200原子币,我已经很卖力了
我是初学者
专注显示科技 - - - 让每一DOT诠释生命的精彩
TFT显示屏:   https://boy-display.taobao.com
回复

使用道具 举报

8

主题

97

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
17563
金钱
17563
注册时间
2016-1-20
在线时间
63 小时
 楼主| 发表于 2016-3-3 17:10:46 | 显示全部楼层
豹影显示 发表于 2016-3-3 17:03
如果是8位并口,你可以把8位数据线安排在某口的低8位,4个控制线安排在同一个口的高8位上即可,方便编程

对啊  是我也是这么设计 ,不过我不是设计硬件的啊,如果和经理吐槽硬件工程师怎么这么画,会不会被经理骂很没水平。。。
---------------------------------------------------
个人论坛博客:macian.cn
个人淘宝小店:macian.taobao.com
回复

使用道具 举报

8

主题

97

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
17563
金钱
17563
注册时间
2016-1-20
在线时间
63 小时
 楼主| 发表于 2016-3-3 17:12:11 | 显示全部楼层
豹影显示 发表于 2016-3-3 17:08
为了你的200原子币,我已经很卖力了

。。。。再等等看,就把你的设为最佳答案。
论坛扣金币,连积分都扣了,是不是bug,@正点原子
---------------------------------------------------
个人论坛博客:macian.cn
个人淘宝小店:macian.taobao.com
回复

使用道具 举报

8

主题

97

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
17563
金钱
17563
注册时间
2016-1-20
在线时间
63 小时
 楼主| 发表于 2016-3-3 17:13:31 | 显示全部楼层
正点原子 发表于 2016-3-2 20:26
将数据拆分。然后分别赋值给各个IO口。来实现通信。不过速度奇慢。。。。

论坛扣金币,连积分都扣了,是不是bug,@会划水的小鱼
---------------------------------------------------
个人论坛博客:macian.cn
个人淘宝小店:macian.taobao.com
回复

使用道具 举报

9

主题

167

帖子

0

精华

高级会员

Rank: 4

积分
552
金钱
552
注册时间
2013-12-15
在线时间
29 小时
发表于 2016-3-3 17:19:08 | 显示全部楼层
YMC 发表于 2016-3-3 17:10
对啊  是我也是这么设计 ,不过我不是设计硬件的啊,如果和经理吐槽硬件工程师怎么这么画,会不会被经理 ...

如果经理骂,那也只能呵呵了,换公司,到原子的公司去吧
我是初学者
专注显示科技 - - - 让每一DOT诠释生命的精彩
TFT显示屏:   https://boy-display.taobao.com
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-3-4 00:50:14 | 显示全部楼层
YMC 发表于 2016-3-3 09:49
原子哥,这样赋值,转来转去的会不会导致LCD显示不稳定,板子有没有必要联系他让他改下。。

不会,就是速度慢。
最好重画吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-3-4 00:53:38 | 显示全部楼层
YMC 发表于 2016-3-3 17:12
。。。。再等等看,就把你的设为最佳答案。
论坛扣金币,连积分都扣了,是不是bug,@正点原子

应该是只扣金币的哦
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

16

主题

204

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1911
金钱
1911
注册时间
2015-7-5
在线时间
486 小时
发表于 2016-3-4 12:19:51 | 显示全部楼层
真能折腾,瞎凑合,后患无穷,还是把电路图改了吧,重新做PCB
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 03:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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