OpenEdv-开源电子网

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

5V液晶12864已经用STM32驱动成功

[复制链接]

23

主题

143

帖子

1

精华

高级会员

Rank: 4

积分
933
金钱
933
注册时间
2012-4-23
在线时间
68 小时
发表于 2012-7-11 18:47:37 | 显示全部楼层 |阅读模式
试了两天终于成功了。

我写的这个程序,如果大家要参考移植的话,12864.c这个文件一个字也不用动,所有需要移植的部分我全部写到12864.h文件来了。方便大家查看。

这两天发现几个问题特别需要注意一下。

一。要开启功能复用IO口时钟,我用的是PB口。STM32F10x系列的MCU复位后,PA13/14/15 & PB3/4默认配置为JTAG功能。有时我们为了充分利用MCU I/O口的资源,会把这些端口设置为普通I/O口。所以要关闭 JTAG 


二。写液晶指令或者数据的时候要注意,出错的话也是不能显示的。我用宏定义来写。
#define  LCD_WriteData(x)     {LCD12864_GPIO->BSRR = x<<8 & 0xff00;LCD12864_GPIO->BRR = ((~x)<<8) & 0xff00;}
 //高8位的数据


三。PB2是BOOT1,这个脚不要用,不然USB线下载不进去。


四。因为液晶要检测忙状态,所以控制的5个引脚我设置成推挽输出模式,但是8个数据引脚PB8~PB15我设置成开漏输出模式。在开漏模式状态下,对输入寄存器的读访问可获得I/O端口状态。PB15为忙状态检测位。


耐心做。没做出来的话之前的付出都白费了。







DIS12864.zip

305.42 KB, 下载次数: 13347

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2015-3-18
在线时间
3 小时
发表于 2015-6-10 16:55:20 | 显示全部楼层
不带字库的怎么驱动显示啊。。。求解。。。
回复 支持 1 反对 0

使用道具 举报

23

主题

143

帖子

1

精华

高级会员

Rank: 4

积分
933
金钱
933
注册时间
2012-4-23
在线时间
68 小时
 楼主| 发表于 2012-7-11 18:51:32 | 显示全部楼层
回复【楼主位】李牧林:
---------------------------------
这算是一个开始。都是比较简单的,刚开始学。希望大家一起交流交流。有问题多发帖子,问题解决后也发帖子,特别是后者很重要!
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2201
金钱
2201
注册时间
2012-2-8
在线时间
35 小时
发表于 2012-7-11 20:31:21 | 显示全部楼层
谢谢楼主分享经验,

二. 看楼主这是高 8 位用作数据位了,楼主可以试试这里的方法,http://www.openedv.com/posts/list/5215.htm,不过 12864 本身的速度也不快就无所谓了。

四。"但是8个数据引脚PB8~PB15我设置成开漏输出模式。" 发现楼主没有提到上拉,但我看了 ST9720 的文档,已经有内部上拉了,发个图上来强调一下,开漏的使用是需要注意的。



https://github.com/roxma
回复 支持 反对

使用道具 举报

23

主题

143

帖子

1

精华

高级会员

Rank: 4

积分
933
金钱
933
注册时间
2012-4-23
在线时间
68 小时
 楼主| 发表于 2012-7-11 20:42:15 | 显示全部楼层
回复【3楼】Pony279:
谢谢楼主分享经验,
二. 看楼主这是高 8 位用作数据位了,楼主可以试试这里的方法,http://www.openedv.com/posts/list/5215.htm,不过 12864 本身的速度也不快就无所谓了。
四。"但是8个数据引脚PB8~PB15我设置成开漏输出模式。" 发现楼主没有提到上拉,但我看了 ST9720 的文档,已经有内部上拉了,发个图上来强调一下,开漏的使用是需要注意的。

---------------------------------
多谢 楼上 提醒。



下面是我找的一些资料,也贴出来给大家看看。
(1)GPIO_Mode_AIN 模拟输入
(2)GPIO_Mode_IN_FLOATING 浮空输入
(3)GPIO_Mode_IPD 下拉输入
(4)GPIO_Mode_IPU 上拉输入
(5)GPIO_Mode_Out_OD 开漏输出
(6)GPIO_Mode_Out_PP 推挽输出
(7)GPIO_Mode_AF_OD 复用开漏输出
(8)GPIO_Mode_AF_PP 复用推挽输出

推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高。输出既可以向负载灌电流,也可以从负载抽取电流。推拉式输出级既提高电路的负载能力,又提高开关速度。

开漏输出:输出端相当于三极管的集电极. 要得到高电平状态需要上拉电阻才行. 适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内).
开漏形式的电路有以下几个特点:
1. 利用外部电路的驱动能力,减少IC内部的驱动。当IC内部MOSFET导通时,驱动电流是从外部的VCC流经R pull-up ,MOSFET到GND。IC内部仅需很下的栅极驱动电流。
2. 一般来说,开漏是用来连接不同电平的器件,匹配电平用的,因为开漏引脚不连接外部的上拉电阻时,只能输出低电平,如果需要同时具备输出高电平的功能,则需要接上拉电阻,很好的一个优点是通过改变上拉电源的电压,便可以改变传输电平。比如加上上拉电阻就可以提供TTL/CMOS电平输出等。(上拉电阻的阻值决定了逻辑电平转换的沿的速度 。阻值越大,速度越低功耗越小,所以负载电阻的选择要兼顾功耗和速度。)
3. OPEN-DRAIN提供了灵活的输出方式,但是也有其弱点,就是带来上升沿的延时。因为上升沿是通过外接上拉无源电阻对负载充电,所以当电阻选择小时延时就小,但功耗大;反之延时大功耗小。所以如果对延时有要求,则建议用下降沿输出。
4. 可以将多个开漏输出的Pin,连接到一条线上。通过一只上拉电阻,在不增加任何器件的情况下,形成“与逻辑”关系。这也是I2C,SMBus等总线判断总线占用状态的原理。补充:什么是“线与”?:
在一个结点(线)上, 连接一个上拉电阻到电源 VCC 或 VDD 和 n 个 NPN 或 NMOS 晶体管的集电极 C 或漏极 D, 这些晶体管的发射极 E 或源极 S 都接到地线上, 只要有一个晶体管饱和, 这个结点(线)就被拉到地线电平上. 因为这些晶体管的基极注入电流(NPN)或栅极加上高电平(NMOS),晶体管就会饱和, 所以这些基极或栅极对这个结点(线)的关系是或非 NOR 逻辑. 如果这个结点后面加一个反相器, 就是或 OR 逻辑.
其实可以简单的理解为:在所有引脚连在一起时,外接一上拉电阻,如果有一个引脚输出为逻辑0,相当于接地,与之并联的回路“相当于被一根导线短路”,所以外电路逻辑电平便为0,只有都为高电平时,与的结果才为逻辑1。

由于浮空输入一般多用于外部按键输入,结合图上的输入部分电路,我理解为浮空输入状态下,IO的电平状态是不确定的,完全由外部输入决定,如果在该引脚悬空的情况下,读取该端口的电平是不确定的。
上拉输入/下拉输入/模拟输入:这几个概念很好理解,从字面便能轻易读懂。
复用开漏输出、复用推挽输出:可以理解为GPIO口被用作第二功能时的配置情况(即并非作为通用IO口使用)
最后总结下使用情况:
在STM32中选用IO模式
(1) 浮空输入_IN_FLOATING ——浮空输入,可以做KEY识别,RX1
(2)带上拉输入_IPU——IO内部上拉电阻输入
(3)带下拉输入_IPD—— IO内部下拉电阻输入
(4) 模拟输入_AIN ——应用ADC模拟输入,或者低功耗下省电
(5)开漏输出_OUT_OD ——IO输出0接GND,IO输出1,悬空,需要外接上拉电阻,才能实现输出高电平。当输出为1时,IO口的状态由上拉电阻拉高电平,但由于是开漏输出模式,这样IO口也就可以由外部电路改变为低电平或不变。可以读IO输入电平变化,实现C51的IO双向功能
(6)推挽输出_OUT_PP ——IO输出0-接GND, IO输出1 -接VCC,读输入值是未知的
(7)复用功能的推挽输出_AF_PP ——片内外设功能(I2C的SCL,SDA)
(8)复用功能的开漏输出_AF_OD——片内外设功能(TX1,MOSI,MISO.SCK.SS)
STM32设置实例:
(1)模拟I2C使用开漏输出_OUT_OD,接上拉电阻,能够正确输出0和1;读值时先GPIO_SetBits(GPIOB, GPIO_Pin_0);拉高,然后可以读IO的值;使用GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0);
(2)如果是无上拉电阻,IO默认是高电平;需要读取IO的值,可以使用带上拉输入_IPU和浮空输入_IN_FLOATING和开漏输出_OUT_OD;
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-7-11 21:39:45 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

233

主题

961

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1815
金钱
1815
注册时间
2011-10-9
在线时间
230 小时
发表于 2012-7-16 17:54:10 | 显示全部楼层
PB2 是可以使用的 接个下拉电阻即可      100k的 好像10k的也可以
回复 支持 反对

使用道具 举报

6

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2012-3-4
在线时间
0 小时
发表于 2012-7-17 18:08:51 | 显示全部楼层
回复【3楼】Pony279:
---------------------------------
既然使用开漏形式驱动液晶屏,那么读取数据的时候也得先输出1,跟51类似的。
回复 支持 反对

使用道具 举报

2

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2012-9-12
在线时间
13 小时
发表于 2012-9-12 11:12:17 | 显示全部楼层
请问液晶的5v电源怎么提供的? 稳定性怎么样?
回复 支持 反对

使用道具 举报

0

主题

79

帖子

0

精华

初级会员

Rank: 2

积分
165
金钱
165
注册时间
2012-4-25
在线时间
10 小时
发表于 2012-9-12 13:47:21 | 显示全部楼层
你这个液晶是带字库的么?
QQ:747764222?可接项目 和 毕设等
? 可以出售各种LED灯,以及控制方案。
? ? LED灯已经出口到全球各地,控制方案也很有经验。
回复 支持 反对

使用道具 举报

39

主题

2026

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2020
金钱
2020
注册时间
2013-5-1
在线时间
87 小时
发表于 2013-5-1 21:41:05 | 显示全部楼层
测试了一下这个程序,程序下进去之后可以显示,但是JTAG就检测不到了...
再次下程序的时候需要一直按住复位键,才能下,之前觉得是PB口和Jlink冲突了,但是我把PB口全换成PC口后,情况还是一样,LZ有这个情况么?



找到问题了,在端口配置中把    GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);    //把调试设置普通IO口
这一句屏蔽掉就好了,或者在后面加一句开JTAG,不然不能下载了......
博观而约取,厚积而薄发。
回复 支持 反对

使用道具 举报

50

主题

201

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
423
金钱
423
注册时间
2013-4-9
在线时间
1 小时
发表于 2013-5-2 15:26:38 | 显示全部楼层
void LCD12684_Wcmd(u8 dat)
{
 while(LCD12864_busy()); //忙检测


************************************************************************************************/
u8 LCD12864_busy(void)
{
 u8 x;
 LCD_RS(0);
 LCD_RW(1); 
 LCD_EN(1);
 NOP();
 NOP();
 x=Text_Busy;
 LCD_EN(0);
 return x;
}

#define  Text_Busy          GPIO_ReadInputDataBit(LCD12864_GPIO  ,Busy)  //PBin(7) 

这位大哥 小弟有幸拜读您的代码 感恩涕零
激动之余 却有一事不详    
你这个判断信号忙的引脚对应下图的哪个引脚


谢谢 谢谢
回复 支持 反对

使用道具 举报

45

主题

248

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
448
金钱
448
注册时间
2013-5-18
在线时间
0 小时
发表于 2013-8-31 08:44:54 | 显示全部楼层
楼主可以在12864上画点吗?求助啊
回复 支持 反对

使用道具 举报

221

主题

501

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1238
金钱
1238
注册时间
2013-1-9
在线时间
121 小时
发表于 2013-11-15 10:17:17 | 显示全部楼层
请问楼主数据引脚还那几根控制引脚都要不要接上上拉电阻呢
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2013-11-15
在线时间
4 小时
发表于 2013-11-15 11:35:06 | 显示全部楼层
回复【11楼】charlieholy:
---------------------------------
忙信号不是有专门的引脚的,是数据最高位DB7为忙标志
回复 支持 反对

使用道具 举报

50

主题

201

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
423
金钱
423
注册时间
2013-4-9
在线时间
1 小时
发表于 2013-11-15 16:54:38 | 显示全部楼层
回复【14楼】wodefans7:
---------------------------------
回看自己发的帖子 一转眼已经是11月了 
问题早已经解决
谢谢
回复 支持 反对

使用道具 举报

1

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2013-2-19
在线时间
1 小时
发表于 2013-11-16 16:04:52 | 显示全部楼层
顶一个!
回复 支持 反对

使用道具 举报

221

主题

501

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1238
金钱
1238
注册时间
2013-1-9
在线时间
121 小时
发表于 2013-11-22 18:16:46 | 显示全部楼层
连接DB0到DB7的引脚为什么一定要开启复用时钟才行呢? 对于双向传输的数据口必须设置成复用输出模式
回复 支持 反对

使用道具 举报

1

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2013-12-25
在线时间
8 小时
发表于 2014-3-4 16:50:38 | 显示全部楼层
学习了,赞一个。
回复 支持 反对

使用道具 举报

0

主题

10

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2013-9-3
在线时间
3 小时
发表于 2014-4-4 10:27:33 | 显示全部楼层
我用了这个附件的程序,原始不动烧入到战舰板子,按照程序中h文件中链接的线。烧入后第一次有显示,但是现实的汉子都是错的,只有qq号码是对的。

然后我修改了引脚 


我用的是5V 12864 所以图中3.3V的  我都改为5V 然后RST我接的是PB12 
接线完毕 ,然后我改程序 主要是引脚配置问题 但是烧入后没有显示。不知道什么原因,我都弄了好几天了。一直卡着,都要疯了
上传一下我改的程序 其中

#define  LCD_WriteData(x)     {LCD12864_GPIO_DATA->BSRR = x<<8 & 0xff00;LCD12864_GPIO_DATA->BRR = ((~x)<<8) & 0xff00;}  //高8位的数据
//#define  LCD_WriteData(x)   {LCD12864_GPIO_DATA->BSRR = x    & 0x00ff;LCD12864_GPIO_DATA->BRR = ((~x)<<8) & 0x00ff;}  //低8位的数据
这两行 我换着用都不行。屏幕什么都没显示



DIS128641.zip

2.12 MB, 下载次数: 1162

回复 支持 反对

使用道具 举报

19

主题

199

帖子

0

精华

高级会员

Rank: 4

积分
512
金钱
512
注册时间
2012-11-18
在线时间
72 小时
发表于 2014-4-4 10:31:26 | 显示全部楼层
楼主能显示8行的英文么?
我看见别人做到了.
好像是5*8的字体
回复 支持 反对

使用道具 举报

14

主题

191

帖子

0

精华

QQ游客

积分
813
金钱
813
注册时间
2013-6-9
在线时间
181 小时
发表于 2014-4-4 11:15:03 | 显示全部楼层
楼主8个数据引脚PB8~PB15设置成开漏输出模式,是否要接上拉电阻,电阻是不是接到5V,一般阻值用多大的?
回复 支持 反对

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2013-4-19
在线时间
4 小时
发表于 2014-4-24 18:37:04 | 显示全部楼层
我下载进去怎么没有显示
回复 支持 反对

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2013-4-19
在线时间
4 小时
发表于 2014-4-27 10:27:24 | 显示全部楼层
回复【楼主位】李牧林:
---------------------------------
请问下怎么显示变量,  显示不出变量呀
回复 支持 反对

使用道具 举报

56

主题

289

帖子

0

精华

高级会员

Rank: 4

积分
865
金钱
865
注册时间
2012-11-16
在线时间
65 小时
发表于 2014-5-5 19:36:14 | 显示全部楼层
我下到MINI板中发现是可以的,接的是5V电源,不知道芯片会不会有什么不好的影响
回复 支持 反对

使用道具 举报

9

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2014-6-3
在线时间
2 小时
发表于 2014-6-3 23:19:36 | 显示全部楼层
我按照你的接线 ,可以只是12864的背光亮,没有显示,是怎么回事呀
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2014-5-22
在线时间
0 小时
发表于 2014-6-4 17:00:01 | 显示全部楼层

请问12864用STM32驱动控制端口和数据端口如何配置

回复 支持 反对

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2014-10-27
在线时间
0 小时
发表于 2014-10-29 21:48:02 | 显示全部楼层
想问下楼主配置开漏输出,硬件电路接上拉电阻到5V了吗?不接可以显示吗?我搭电路的时候忘了接上拉电阻,用别人的程序不能显示。想看下楼主这个是否不需要接上拉电阻也可显示。
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2014-12-23
在线时间
0 小时
发表于 2014-12-23 22:32:20 | 显示全部楼层
回复【10楼】745021926:
---------------------------------
请问楼主:用别的STM32板可以吗
希望有大神帮助
回复 支持 反对

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2015-1-22
在线时间
0 小时
发表于 2015-5-25 15:03:42 | 显示全部楼层
整了好久,也没有整出来,谢谢楼主分享。
回复 支持 反对

使用道具 举报

4

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2015-3-28
在线时间
0 小时
发表于 2015-5-30 17:39:55 | 显示全部楼层
 我用你的程序想改成寄存器版本的,可是编译通过但是就是不显示
下面这个事12864.c文件内容
[mw_shl_code=c,true]#include "stm32f10x.h" #include"12864.h" #include"delay.h" /************************************************************************************************ //FILE:液晶12864驱动程序 //VERS:1.0 //AUTHOR:福建师范大学林木泉 //DATE:2012/07/11 ************************************************************************************************/ /************************************************************************************************ @f_name: void LCD12864_InitPort(void) @brief: 初始化硬件端口配置 @param: None @return: None ************************************************************************************************/ void LCD12864_InitPort(void) { RCC->APB2ENR|=1<<3; GPIOB->CRH&=0; GPIOB->CRH|=0X77777777; GPIOB->ODR=0XFFFF; GPIOB->CRL&=0XFF000F00; GPIOB->CRL|=0X00333033; GPIOB->ODR=0Xffff; } /************************************************************************************************ @f_name: void NOP(void) @brief: 延时函数 @param: None @return: None ************************************************************************************************/ void NOP(void) { u8 i; for(i=0; i<100; i++); } /************************************************************************************************ @f_name: u8 LCD12864_busy(void) @brief: 检测忙状态 @param: None @return: None ************************************************************************************************/ u8 LCD12864_busy(void) { u8 x; RS=0; RW=1; EN=1; NOP(); NOP(); x=Text_Busy; EN=0; return x; } /************************************************************************************************ @f_name: void LCD12684_Wcmd(u8 dat) @brief: 写指令 @param: u8 dat 输入指令 @return: None ************************************************************************************************/ void LCD12684_Wcmd(u8 dat) { while(LCD12864_busy()); //忙检测 RS=0; RW=0; EN=0; NOP(); NOP(); LCD_WriteData(dat); NOP(); NOP(); EN=1; NOP(); NOP(); EN=0; } /************************************************************************************************ @f_name: void LCD12684_Wcmd(u8 dat) @brief: 写数据 @param: u8 dat 输入数据 @return: None ************************************************************************************************/ void LCD12684_Wdat(u8 dat) { while(LCD12864_busy()); //忙检测 RS=1; RW=0; EN=0; NOP(); NOP(); LCD_WriteData(dat); NOP(); NOP(); EN=1; NOP(); NOP(); EN=0; } /************************************************************************************************ @f_name: void LCD12864_Init(void) @brief: 液晶初始化 @param: None @return: None ************************************************************************************************/ void LCD12864_Init(void) { PSB=1; //并口方式 RST=0; //液晶复位 低电平有效 delay_ms(3); RST=1; //置高电平等待复位 delay_ms(3); LCD12684_Wcmd(0x34); //扩充指令操作 delay_ms(5); LCD12684_Wcmd(0x30); //基本指令操作 delay_ms(5); LCD12684_Wcmd(0x0c); //显示开,关光标 delay_ms(5); LCD12684_Wcmd(0x01); //清除LCD的显示内容 delay_ms(5); } /************************************************************************************************ @f_name: void LCD12864_Clr(void) @brief: 清屏 @param: None @return: None ************************************************************************************************/ void LCD12864_Clr(void) { LCD12684_Wcmd(0x34); //扩充指令操作 “绘图” delay_ms(5); LCD12684_Wcmd(0x30); //基本指令操作 delay_ms(5); LCD12684_Wcmd(0x01); //清屏 delay_ms(5); } /************************************************************************************************ @f_name: void LCD12864_Pos(u8 x,u8 y) @brief: 设置显示位置 @param: u8 x:X轴 u8 y:Y轴 @return: None ************************************************************************************************/ void LCD12864_Pos(u8 x,u8 y) { u8 pos; if (x==1) {x=0x80;} else if (x==2) {x=0x90;} else if (x==3) {x=0x88;} else if (x==4) {x=0x98;} else x=0x80; pos = x+y ; LCD12684_Wcmd(pos); //显示地址 } /************************************************************************************************ @f_name: void LCD12864_PhotoDis(u8 *bmp) @brief: 显示图形 @param: u8 *bmp 图形数组 @return: None ************************************************************************************************/ void LCD12864_PhotoDis(u8 *bmp) { u8 i,j; LCD12684_Wcmd(0x34); //关闭图形显示 for(i=0;i<32;i++) { LCD12684_Wcmd(0x80+i); //先写入水平坐标值 LCD12684_Wcmd(0x80); //写入垂直坐标值 for(j=0;j<16;j++) //再写入两个8位元的数据 LCD12684_Wdat(*bmp++); delay_ms(1); } for(i=0;i<32;i++) { LCD12684_Wcmd(0x80+i); LCD12684_Wcmd(0x88); for(j=0;j<16;j++) LCD12684_Wdat(*bmp++); delay_ms(1); } LCD12684_Wcmd(0x36); //写完数据,开图形显示 } /************************************************************************************************ @f_name: void LCD_ShowString(u8 x,u8 y,const u8 *p) @brief: 显示字符串 @param: u8 *bmp 图形数组 @return: None ************************************************************************************************/ void LCD_ShowString(u8 x,u8 y,const u8 *p) { u8 temp; if(x>4) {x=1;} if(y>4) {y=0;} LCD12864_Pos(x,y); temp=*p; while(temp!='\0') { LCD12684_Wdat(temp); temp=*(++p); } } [/mw_shl_code]
这个是12864.h文件内容
[mw_shl_code=c,true]#ifndef __12864_H_ #define __12864_H_ #include"sys.h" //管脚定义,移植修改区 //************************************************************************************************************************** #define LCD12864_GPIO GPIOB #define GPIOCLK RCC_APB2Periph_GPIOB #define RS PBout(0) #define RW PBout(1) #define EN PBout(3) #define PSB PBout(4) #define RST PBout(5) #define Busy PBout(15) #define LCD_GPIO_DAT GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10 |GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15 #define LCD_GPIO_CMD GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5 #define LCD_RS(x) x ? GPIOB->ODR|=0X0001: GPIOB->ODR&=~0X0001 //置1或置0 但是我发现我这样用用不了。。。。 #define LCD_RW(x) x ? GPIOB->ODR|=0X0002: GPIOB->ODR&=~0X0002 #define LCD_EN(x) x ? GPIOB->ODR|=0X0004: GPIOB->ODR&=~0X0004 #define LCD_PSB(x) x ? GPIOB->ODR|=0X0008: GPIOB->ODR&=~0X0008 #define LCD_RST(x) x ? GPIOB->ODR|=0X0010: GPIOB->ODR&=~0X0010 #define Text_Busy PBin(15) //PBin(7) #define LCD_WriteData(x) {LCD12864_GPIO->BSRR = x<<8 & 0xff00;LCD12864_GPIO->BRR = ((~x)<<8) & 0xff00;} //高8位的数据 //#define LCD_WriteData(x) GPIOB->ODR=(GPIOB->ODR&0x00ff)|(x&0xff00); //高8位的数据 //#define LCD_WriteData(x) {LCD12864_GPIO->BSRR = x & 0x00ff;LCD12864_GPIO->BRR = ((~x)<<8) & 0x00ff;} //低8位的数据 void LCD12864_InitPort(void); //硬件端口初始化 void NOP(void); //延时函数 u8 LCD12864_busy(void); //检测忙状态 void LCD12684_Wcmd(u8 dat); //写指令 void LCD12684_Wdat(u8 dat); //写数据 void LCD12864_Init(void); //液晶初始化 void LCD12864_Clr(void); // 清屏 void LCD12864_Pos(u8 x,u8 y); //设置显示位置 void LCD12864_PhotoDis(u8 *bmp); // 显示图片 void LCD_ShowString(u8 x,u8 y,const u8 *p); // 显示字符串 //********************************************************************************************************************** #endif [/mw_shl_code]

回复 支持 反对

使用道具 举报

2

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2015-3-18
在线时间
3 小时
发表于 2015-6-9 11:57:35 | 显示全部楼层
led.c: Error:  #5: cannot open source input file "..\HARDWARE\LED\led.c": No such file or directory。。。为什么会提示这个?打开文件夹,里面确实没有LED.C这个程序文件。。。什么原因???
回复 支持 反对

使用道具 举报

0

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2015-5-9
在线时间
11 小时
发表于 2015-6-15 09:51:50 | 显示全部楼层
楼主,12864.h中管脚定义部分,我用的好几个IO口,在向你这样定义可以吗

#define  LCD12864_GPIO    GPIOB|GPIOA|GPIOC
#define  GPIOCLK          RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC

#define  RS      GPIO_Pin_0
#define  RW      GPIO_Pin_1
#define  EN      GPIO_Pin_2
#define  SB      GPIO_Pin_0
#define  RST      GPIO_Pin_5
#define  Busy        GPIO_Pin_7
#define  LCD_GPIO_DAT   GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2 |GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7
#define  LCD_GPIO_CMD GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5
回复 支持 反对

使用道具 举报

0

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2015-5-9
在线时间
11 小时
发表于 2015-6-15 10:05:26 | 显示全部楼层
回复【2楼】李牧林:
---------------------------------
楼主,12864.h中管脚定义部分,我用的好几个IO口,在向你这样定义可以吗 


#define  LCD12864_GPIO    GPIOB|GPIOA|GPIOC 
#define  GPIOCLK          RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC
 
#define  RS      GPIO_Pin_0 
#define  RW      GPIO_Pin_1 
#define  EN      GPIO_Pin_2 
#define  SB      GPIO_Pin_0 
#define  RST      GPIO_Pin_5 
#define  Busy        GPIO_Pin_7 
#define  LCD_GPIO_DAT   GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2 |GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7
 #define  LCD_GPIO_CMD GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5
回复 支持 反对

使用道具 举报

3

主题

15

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2013-7-21
在线时间
0 小时
发表于 2015-6-16 10:01:16 | 显示全部楼层
12864使用起来太麻烦了,有了我们这款屏,那才叫简单,而且是TFT彩屏哦 http://item.taobao.com/item.htm?spm=a1z10.1-c.w137712-2123499765.8.LUBB6n&id=520108039755
51/avr/stm32驱动TFT彩屏。http://tftmcu.taobao.com/
回复 支持 反对

使用道具 举报

0

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2013-3-3
在线时间
10 小时
发表于 2015-6-18 14:00:04 | 显示全部楼层
"三。PB2是BOOT1,这个脚不要用,不然USB线下载不进去。"
回复楼主,此引脚可以用,Boot0=0,boot1=X,说明开机Boot1可以是任意电平。
回复 支持 反对

使用道具 举报

11

主题

52

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2015-7-6
在线时间
5 小时
发表于 2015-7-8 14:55:00 | 显示全部楼层
感谢分享!!
回复 支持 反对

使用道具 举报

15

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2015-5-14
在线时间
6 小时
发表于 2015-7-9 15:52:00 | 显示全部楼层
楼主可否换个头像先
回复 支持 反对

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2015-9-15
在线时间
2 小时
发表于 2015-11-9 21:43:55 | 显示全部楼层
回复【10楼】745021926:
---------------------------------
你的能烧进去了吗,我把PB3、PB4改了,烧进去了一次,我是用J-link烧的,烧进去一次再也烧不进去了,我把你说的那句话屏蔽到了还是不行,你能帮我分析一下原因吗。谢谢了。我换别的板烧的不是用原子哥的板
I Can!
回复 支持 反对

使用道具 举报

5

主题

163

帖子

0

精华

高级会员

Rank: 4

积分
615
金钱
615
注册时间
2011-11-7
在线时间
180 小时
发表于 2015-11-9 22:15:32 | 显示全部楼层
谢谢分享,最近自己也想做块小板,用STM32来驱动吃灰的5V单色点阵液晶,不过我加了外部5V上拉,现在还在画板
回复 支持 反对

使用道具 举报

160

主题

967

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2097
金钱
2097
注册时间
2014-3-7
在线时间
491 小时
发表于 2015-12-11 18:32:36 | 显示全部楼层
回复【27楼】zhaopengdt:
---------------------------------
(5)开漏输出_OUT_OD ——IO输出0接GND,IO输出1,悬空,需要外接上拉电阻,才能实现输出高电平。
回复 支持 反对

使用道具 举报

1

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2015-12-15
在线时间
28 小时
发表于 2016-5-11 15:45:52 | 显示全部楼层
#define  LCD_WriteData(x)     {LCD12864_GPIO->BSRR = x<<8 & 0xff00;LCD12864_GPIO->BRR = ((~x)<<8) & 0xff00;}
回复 支持 反对

使用道具 举报

1

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2015-12-15
在线时间
28 小时
发表于 2016-5-11 15:46:59 | 显示全部楼层
#define  LCD_WriteData(x)     {LCD12864_GPIO->BSRR = x<<8 & 0xff00;LCD12864_GPIO->BRR = ((~x)<<8) & 0xff00;}          我现在用的是F407的板子    407里面没有BSRR和BRR指令 ,请问我该如何操作对数据写
回复 支持 反对

使用道具 举报

4

主题

74

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
201
金钱
201
注册时间
2017-4-5
在线时间
24 小时
发表于 2017-5-21 19:55:05 | 显示全部楼层
瞎忽悠人
回复 支持 反对

使用道具 举报

4

主题

74

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
201
金钱
201
注册时间
2017-4-5
在线时间
24 小时
发表于 2017-5-22 19:48:38 | 显示全部楼层
为啥我的不行,硬件有啥要求啊
回复 支持 反对

使用道具 举报

4

主题

74

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
201
金钱
201
注册时间
2017-4-5
在线时间
24 小时
发表于 2017-5-22 19:48:50 | 显示全部楼层
噶起不到
回复 支持 反对

使用道具 举报

4

主题

74

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
201
金钱
201
注册时间
2017-4-5
在线时间
24 小时
发表于 2017-5-22 19:49:07 | 显示全部楼层
搞不懂啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
回复 支持 反对

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2017-8-2
在线时间
4 小时
发表于 2017-8-19 00:32:58 | 显示全部楼层
pinghaowin 发表于 2014-4-4 10:27
我用了这个附件的程序,原始不动烧入到战舰板子,按照程序中h文件中链接的线。烧入后第一次有显示,但是现 ...

我试了一下,你把
#define &nbsp;LCD_WriteData(x) &nbsp; &nbsp; {LCD12864_GPIO_DATA->BSRR = x<<8 & 0xff00;LCD12864_GPIO_DATA->BRR = ((~x)<<8) & 0xff00;} &nbsp;//高8位的数据
//#define &nbsp;LCD_WriteData(x) &nbsp; {LCD12864_GPIO_DATA->BSRR = x &nbsp; &nbsp;& 0x00ff;LCD12864_GPIO_DATA->BRR = ((~x)<<8) & 0x00ff;} &nbsp;//低8位的数据
换成#define  LCD_WriteData(x)   GPIO_Write(GPIOC,x)
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

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

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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