OpenEdv-开源电子网

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

12864LCD并口通信引脚不在一个组内如何解决?

[复制链接]

2

主题

12

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2018-9-3
在线时间
4 小时
发表于 2018-10-13 08:49:17 | 显示全部楼层 |阅读模式
1金钱
我用的是STM32F103RBT6,12864显示屏,但是很奇怪,原理图上,读写脚接地,不能用串口通信,只能够用并口(不敢确定,请大神指导确认..),LCD并口8个数据口居然不在一个IO组内,分到了四个IO组,我查了很多资料,都没有这样的配置,请问这种情况该如何使用12864LCD

最佳答案

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

这个的确有些奇葩。。。。但也不是不能做,只不过程序效率低一点点,编写起来稍微复杂一点点。 有个思路就是,编写两个函数,形参接收8bit也就是一个字节的数据;然后函数内部利用位操作将这8bit中的每个比特提取出来,然后再按照原理图上给出来的接线方式,分别送到相应的引脚中,实现写功能;另外一个函数则相反,从这些引脚中一个一个把所有的bit读出来,然后拼成一个字节,最后作为一个字节的返回值返回。 这样在外部程 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

756

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4163
金钱
4163
注册时间
2017-10-24
在线时间
251 小时
发表于 2018-10-13 08:49:18 | 显示全部楼层
这个的确有些奇葩。。。。但也不是不能做,只不过程序效率低一点点,编写起来稍微复杂一点点。

有个思路就是,编写两个函数,形参接收8bit也就是一个字节的数据;然后函数内部利用位操作将这8bit中的每个比特提取出来,然后再按照原理图上给出来的接线方式,分别送到相应的引脚中,实现写功能;另外一个函数则相反,从这些引脚中一个一个把所有的bit读出来,然后拼成一个字节,最后作为一个字节的返回值返回。

这样在外部程序看来,向液晶屏幕写一个字节的数据或者读一个字节的数据,只需要调用这两个函数就行了,不需要关注最底层的接线了。
十六进制带我飞。
回复

使用道具 举报

2

主题

12

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2018-9-3
在线时间
4 小时
 楼主| 发表于 2018-10-13 08:55:13 | 显示全部楼层

RE: 12864LCD并口通信引脚不在一个组内如何解决?

下面是原理图

1.PNG
捕获.PNG
回复

使用道具 举报

13

主题

611

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1929
金钱
1929
注册时间
2014-10-6
在线时间
625 小时
发表于 2018-10-13 09:41:26 | 显示全部楼层
也没有规定一定要在同一组啊,在同一组使用方便点,不在同一组,要重新映射到一个新建的组
回复

使用道具 举报

3

主题

288

帖子

0

精华

高级会员

Rank: 4

积分
865
金钱
865
注册时间
2018-8-28
在线时间
130 小时
发表于 2018-10-13 10:05:01 | 显示全部楼层
12864不能用串口吗???普通的12864是可以的。
回复

使用道具 举报

3

主题

288

帖子

0

精华

高级会员

Rank: 4

积分
865
金钱
865
注册时间
2018-8-28
在线时间
130 小时
发表于 2018-10-13 10:05:38 | 显示全部楼层
你可以查看一下资料你的12864是不是支持串口,可以就简单了
回复

使用道具 举报

2

主题

12

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2018-9-3
在线时间
4 小时
 楼主| 发表于 2018-10-13 10:11:30 | 显示全部楼层
douxiaolingyun 发表于 2018-10-13 10:05
12864不能用串口吗???普通的12864是可以的。

因为读写引脚接地了,不能转换,而用串口需要转换的
回复

使用道具 举报

2

主题

12

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2018-9-3
在线时间
4 小时
 楼主| 发表于 2018-10-13 10:15:28 | 显示全部楼层
DreamWaterPro 发表于 2018-10-13 09:53
这个的确有些奇葩。。。。但也不是不能做,只不过程序效率低一点点,编写起来稍微复杂一点点。

有个思路 ...

不太好搞,我试试看
回复

使用道具 举报

2

主题

12

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2018-9-3
在线时间
4 小时
 楼主| 发表于 2018-10-13 10:17:09 | 显示全部楼层
烟酒不沾 发表于 2018-10-13 09:41
也没有规定一定要在同一组啊,在同一组使用方便点,不在同一组,要重新映射到一个新建的组

数据不知如何写了
回复

使用道具 举报

2

主题

12

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2018-9-3
在线时间
4 小时
 楼主| 发表于 2018-10-13 11:25:26 | 显示全部楼层
DreamWaterPro 发表于 2018-10-13 09:53
这个的确有些奇葩。。。。但也不是不能做,只不过程序效率低一点点,编写起来稍微复杂一点点。

有个思路 ...

我这样写了一个,但好像不能显示,你看这样可以吗
#define DB0 PAout(15)
#define DB1 PCout(10)
#define DB2 PCout(11)
#define DB3 PCout(12)
#define DB4 PDout(2)
#define DB5 PBout(3)
#define DB6 PBout(4)
#define DB7 PBout(5)

void writdd(u8 dd)
{
        DB0=dd&0x01;
        DB1=((dd>>1)&0x01);
        DB2=((dd>>2)&0x01);
        DB3=((dd>>3)&0x01);
        DB4=((dd>>4)&0x01);
        DB5=((dd>>5)&0x01);
        DB6=((dd>>6)&0x01);
        DB7=((dd>>7)&0x01);
}

void WriteData(u8 data)
{
        RS=1;
        EN=1;
//        DisIO=data;
        writdd(data);
        delay_us(2);
        EN=0;
        delay_us(2);
}
回复

使用道具 举报

2

主题

12

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2018-9-3
在线时间
4 小时
 楼主| 发表于 2018-10-13 11:25:47 | 显示全部楼层
DreamWaterPro 发表于 2018-10-13 09:53
这个的确有些奇葩。。。。但也不是不能做,只不过程序效率低一点点,编写起来稍微复杂一点点。

有个思路 ...

我这样写了一个,但好像不能显示,你看这样可以吗
#define DB0 PAout(15)
#define DB1 PCout(10)
#define DB2 PCout(11)
#define DB3 PCout(12)
#define DB4 PDout(2)
#define DB5 PBout(3)
#define DB6 PBout(4)
#define DB7 PBout(5)

void writdd(u8 dd)
{
        DB0=dd&0x01;
        DB1=((dd>>1)&0x01);
        DB2=((dd>>2)&0x01);
        DB3=((dd>>3)&0x01);
        DB4=((dd>>4)&0x01);
        DB5=((dd>>5)&0x01);
        DB6=((dd>>6)&0x01);
        DB7=((dd>>7)&0x01);
}

void WriteData(u8 data)
{
        RS=1;
        EN=1;
//        DisIO=data;
        writdd(data);
        delay_us(2);
        EN=0;
        delay_us(2);
}
回复

使用道具 举报

9

主题

165

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
251
金钱
251
注册时间
2018-4-6
在线时间
31 小时
发表于 2018-10-13 12:11:27 | 显示全部楼层
本帖最后由 15353920254 于 2018-10-13 12:15 编辑

路过路过
回复

使用道具 举报

2

主题

756

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4163
金钱
4163
注册时间
2017-10-24
在线时间
251 小时
发表于 2018-10-14 11:08:42 | 显示全部楼层
相宜 发表于 2018-10-13 11:25
我这样写了一个,但好像不能显示,你看这样可以吗
#define DB0 PAout(15)
#define DB1 PCout(10)

目测程序是没有太大的问题;

不过从原理图可以看到,有些引脚是和JTAG的引脚共用了;你可能需要检查一下是否禁用了JTAG功能;顺便也检查一下用到的所有的引脚是否被正确初始化,是否开启了相应端口的时钟。
十六进制带我飞。
回复

使用道具 举报

2

主题

12

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2018-9-3
在线时间
4 小时
 楼主| 发表于 2018-10-14 13:37:02 | 显示全部楼层
DreamWaterPro 发表于 2018-10-14 11:08
目测程序是没有太大的问题;

不过从原理图可以看到,有些引脚是和JTAG的引脚共用了;你可能需要检查一 ...

我的JTAG用的是SWD模式,只用到JIDCK,JIDMS两个,其它都没有用到了,我看到JLINK原理图引脚也只能用SWD模式了,所以没有用到复用功能。LCD的引脚是通用GPIO口吧?JTAG才是复用GPIO吧?
我是这样配置的:

void lcd_init(void)
{
        GPIO_InitTypeDef GPIO_InitStru;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD,ENABLE);
       
        GPIO_InitStru.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStru.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStru.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12;        //RS EN
        GPIO_Init(GPIOA,&GPIO_InitStru);
       
        GPIO_InitStru.GPIO_Pin = GPIO_Pin_8;//CS1 PSB
        GPIO_Init(GPIOB,&GPIO_InitStru);
        GPIO_SetBits(GPIOB,GPIO_Pin_8);
       
       
        //D0~D7
        //GPIO_InitStru.GPIO_Pin = Data;        //RS EN
        //GPIO_Init(GPIOO,&GPIO_InitStru);
//        GPIO_InitStru.GPIO_Mode = GPIO_Mode_IN_FLOATING;
//        GPIO_InitStru.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStru.GPIO_Pin = GPIO_Pin_15;        //D0
        GPIO_Init(GPIOA,&GPIO_InitStru);
       
        GPIO_InitStru.GPIO_Pin = GPIO_Pin_2;        //D4
        GPIO_Init(GPIOD,&GPIO_InitStru);
       
        GPIO_InitStru.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12;        //D1  D2 D3
        GPIO_Init(GPIOC,&GPIO_InitStru);
       
        GPIO_InitStru.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 ;        //D5 D6 D7
        GPIO_Init(GPIOB,&GPIO_InitStru);
}


jlink.PNG
回复

使用道具 举报

2

主题

756

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4163
金钱
4163
注册时间
2017-10-24
在线时间
251 小时
发表于 2018-10-15 08:09:57 | 显示全部楼层
相宜 发表于 2018-10-14 13:37
我的JTAG用的是SWD模式,只用到JIDCK,JIDMS两个,其它都没有用到了,我看到JLINK原理图引脚也只能用SWD ...

硬件上是只用到了SWD两根引脚,但是单片机JTAG口依旧得禁用啊
十六进制带我飞。
回复

使用道具 举报

0

主题

5

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2020-11-3
在线时间
3 小时
发表于 2020-11-3 16:10:54 | 显示全部楼层
请问这个问题解决了吗,求指教,多谢
回复

使用道具 举报

4

主题

32

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
270
金钱
270
注册时间
2015-10-8
在线时间
64 小时
发表于 2020-11-3 17:10:13 | 显示全部楼层
你的硬件接错了,WR脚的作用是写使能、RD脚的作用是读使能。从你的12864的接口定义来看,此LCD不支持SPI,如果你不读的话,可以把RD接VDD。WR接GPIO。此LCD是8080并口模式,你电路和代码使用的是6800模式。当然不显示了。跳线吧。
       RS=1; //data RS=0;//command
        WR=0;
        writdd(data);
        delay_us(2);
        WR=1;
        delay_us(2);
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 10:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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