打印

stm32并行驱动12864程序

[复制链接]
21559|48
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本菜鸟一枚,用stm32f103c8t6并行驱动12864zw液晶屏

具体连接:
          PA0~PA7接D0~D7,RS、RW、E、RST分别接PB0、PB1、PB2、PB4

采用库函数操作,程序如下:

*********************************************************

#include "stm32f10x.h"
#define RS_ON      GPIO_SetBits(GPIOB,GPIO_Pin_0);
#define RS_OFF     GPIO_ResetBits(GPIOB,GPIO_Pin_0);
#define RW_ON      GPIO_SetBits(GPIOB,GPIO_Pin_1);
#define RW_OFF     GPIO_ResetBits(GPIOB,GPIO_Pin_1);
#define E_ON       GPIO_SetBits(GPIOB,GPIO_Pin_2);
#define E_OFF      GPIO_ResetBits(GPIOB,GPIO_Pin_2);
#define RST_ON     GPIO_SetBits(GPIOB,GPIO_Pin_4);
#define RST_OFF    GPIO_ResetBits(GPIOB,GPIO_Pin_4);
#define LcdData(x) GPIOB->ODR=(GPIOB->ODR&0xff00)|(x&0x00FF);
void delay(unsigned int ms)
{
unsigned int x,y;
for(x=0;x<ms;x++)
for(y=0;y<8000;y++);
}


void LcdWcom(unsigned char WCom)
{
delay(10);
RS_OFF;
RW_OFF;
LcdData(WCom);
E_ON;
delay(10);
E_OFF;
}

void LcdWdata(unsigned char WData)
{
delay(10);
RS_ON;
RW_OFF;
LcdData(WData);
E_ON;
delay(10);
E_OFF;
}

void DisplayInit(void)
{
delay(10);

RST_OFF;
delay(10);
RST_ON;

LcdWcom(0x30);
LcdWcom(0x0c);
LcdWcom(0x01);
}
void SetCursor(unsigned char x,unsigned char y)
{
unsigned char i;
  switch(x)
{
  case 0x00: i=0x80;
   break;
    case 0x01: i=0x90;
   break;
    case 0x02: i=0x88;
   break;
    case 0x03: i=0x98;
   break;
    default: break;
  }
i=y+i;
LcdWcom(i);
}

int main(void)
{
GPIO_InitTypeDef myStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);

myStructure.GPIO_Pin=GPIO_Pin_All;
myStructure.GPIO_Mode=GPIO_Mode_Out_PP;
myStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&myStructure);
myStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;
GPIO_Init(GPIOB,&myStructure);

DisplayInit();
delay(10);
SetCursor(0,0);
delay(10);
LcdWdata(0x31);
}

*************************************************************

但是液晶屏没有任何显示!!液晶屏5V供电!!

求各位大神帮忙看下程序有没有问题!!

谢了:handshake
沙发
logokfu| | 2013-6-2 00:09 | 只看该作者
1,确保硬件接口是外部上拉电阻。内部设置开漏输出。
2,应该还有读忙信号吧。

使用特权

评论回复
评论
feiyinglala 2016-4-14 23:09 回复TA
天哪,我调了好几天,一直判忙不通过,结果接了上拉瞬间好了。 
板凳
nishispm|  楼主 | 2013-6-2 10:15 | 只看该作者
**kfu 发表于 2013-6-2 00:09
1,确保硬件接口是外部上拉电阻。内部设置开漏输出。
2,应该还有读忙信号吧。 ...

1.这样当然最好,不过论坛上有大神说“5V给12864供电,STM32的3.3vIO可以直接驱动12864"
2.哦,那在什么时候需要“读忙”?不能我每执行一条指令之前都要读吧?

使用特权

评论回复
地板
nishispm|  楼主 | 2013-6-2 10:19 | 只看该作者
nishispm 发表于 2013-6-2 10:15
1.这样当然最好,不过论坛上有大神说“5V给12864供电,STM32的3.3vIO可以直接驱动12864"
2.哦,那在什么 ...

第二点可能没说明白:就是什么时候用延时函数?什么时候读忙?

使用特权

评论回复
5
logokfu| | 2013-6-2 12:10 | 只看该作者
nishispm 发表于 2013-6-2 10:19
第二点可能没说明白:就是什么时候用延时函数?什么时候读忙?

由于你的写入速度可能太快了,显示屏反应不过来,所以要读忙,忙标志位如果显示不忙的话,你就可以接着写命令,写数据了。当然如果你要是经过多次调试的话,可以调试出这个大概时间,那样你加个延时,也是可以省去读忙的。

注意:好久没有玩过12864,很早以前只玩过一次,玩过1602,这个我知道就是这样处理的。我记得12864控制方法和1602是一样差不多的。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
nishispm + 1 很给力!
6
logokfu| | 2013-6-2 12:15 | 只看该作者
本帖最后由 **kfu 于 2013-6-2 12:17 编辑
nishispm 发表于 2013-6-2 10:15
1.这样当然最好,不过论坛上有大神说“5V给12864供电,STM32的3.3vIO可以直接驱动12864"
2.哦,那在什么 ...


这个我没有具体验证过,理论上是这样的。直接连接应该可以。





使用特权

评论回复
7
lcdi| | 2013-6-2 16:32 | 只看该作者
本帖最后由 lcdi 于 2013-6-2 16:38 编辑

楼主啊,你说PA口连的液晶数据口,可是程序里define 的却是PB口输出数据,然后其他控制也是PB的,乱套了呀!

另外,MCU可不可以直连5V,不但要看具体的IO能不能承受,还要看液晶模块的电平要求,模块跟模块是不同的,别人的能行,你的也不一定哦!
要想做稳定,一定要满足数据手册里的条件,MCU和液晶的数据手册要仔细研读,每条线的电平要求都要清楚,要不然即使能用也不稳定。

使用特权

评论回复
8
zhongruitai88| | 2013-6-2 16:39 | 只看该作者
NTN 7011UCDB/GNP5  轴承批发 022-87503007

使用特权

评论回复
9
zhongruitai88| | 2013-6-2 16:40 | 只看该作者
:kiss:

使用特权

评论回复
10
hawksabre| | 2013-6-2 20:46 | 只看该作者
不是很了解这一块   楼主   帮你顶一个  看看别人的意见   应该是可以解决的

使用特权

评论回复
11
nishispm|  楼主 | 2013-6-2 22:06 | 只看该作者
lcdi 发表于 2013-6-2 16:32
楼主啊,你说PA口连的液晶数据口,可是程序里define 的却是PB口输出数据,然后其他控制也是PB的,乱套了呀 ...

哦!确实粗心了:$,可是改过之后依然没有显示啊!

我按照您说的将IO口配置为开漏输出,接10K上拉电阻后接到液晶屏上,可依然没显示!!

只有背光加矩形点阵!!这是什么问题呢?

求指教!:hug:

使用特权

评论回复
12
nishispm|  楼主 | 2013-6-2 22:06 | 只看该作者
hawksabre 发表于 2013-6-2 20:46
不是很了解这一块   楼主   帮你顶一个  看看别人的意见   应该是可以解决的  ...

谢谢啊!我正在试图解决呢:hug:

使用特权

评论回复
13
lcdi| | 2013-6-2 22:32 | 只看该作者
nishispm 发表于 2013-6-2 22:06
哦!确实粗心了,可是改过之后依然没有显示啊!

我按照您说的将IO口配置为开漏输出,接10K上拉电阻后 ...

各信号线连接肯定没有问题了吧。
有点阵了就是有进步了,那就一步一步来。按照数据手册检查模块复位电平和复位时间够不?设置合适的对比度。
然后看各控制信号电平和时序对不对?
仔细对照模块的时序要求,分析你的程序是不是配合?
细心一点一定可以发现问题的!

使用特权

评论回复
14
lcdi| | 2013-6-2 22:40 | 只看该作者
我读不懂你具体的写命令和写数据的函数。请你对照液晶模块的数据手册仔细检查各信号时序。

使用特权

评论回复
15
liang5319| | 2013-6-2 23:03 | 只看该作者
用示波器看看吧。。。看看IO工作是否正常。。之前试过12864的,3.3V可以用的。。不过最好还是用5V

使用特权

评论回复
16
grasswolfs| | 2013-6-3 09:35 | 只看该作者
lcdi 发表于 2013-6-2 22:40
我读不懂你具体的写命令和写数据的函数。请你对照液晶模块的数据手册仔细检查各信号时序。 ...

除了配置管脚和初始化,其他的所有单片机的写1264的C程序都是一样的,为什么要自己写时序?找一个例程调试吧

使用特权

评论回复
17
nishispm|  楼主 | 2013-6-3 12:37 | 只看该作者
lcdi 发表于 2013-6-2 22:32
各信号线连接肯定没有问题了吧。
有点阵了就是有进步了,那就一步一步来。按照数据手册检查模块复位电平 ...


显示点阵是不是就说明对比度应该没问题?

就这样,手机照的,不很清楚。:hug:

使用特权

评论回复
评论
logokfu 2013-6-3 12:58 回复TA
这个还是属于初始化没初始化好 
18
lcdi| | 2013-6-3 13:29 | 只看该作者
nishispm 发表于 2013-6-3 12:37
显示点阵是不是就说明对比度应该没问题?

就这样,手机照的,不很清楚。 ...

你可以修改不同的对比度,试试效果,如果无变化,那还是你的写入函数不对。
时序配合好了就会成功。
努力一下,把这部分做出来,以后你遇到其他模块,其他器件就心里有谱了,知道怎么找问题了。

使用特权

评论回复
19
nishispm|  楼主 | 2013-6-3 21:49 | 只看该作者
lcdi 发表于 2013-6-3 13:29
你可以修改不同的对比度,试试效果,如果无变化,那还是你的写入函数不对。
时序配合好了就会成功。
努力 ...

呵呵,已经可以显示字符了!!:lol

谢谢各位大侠!!:handshake

明天上图!!:D:victory:

使用特权

评论回复
评论
logokfu 2013-6-3 22:22 回复TA
到底什么原因,先说说。硬件怎么连接的,接外部上拉没有。 
20
nishispm|  楼主 | 2013-6-4 10:36 | 只看该作者
先说硬件连接:
加不加上拉电阻都行(实验证明),加上拉时io要设置成开漏输出,不加时要设置成推挽输出!!
液晶的VDD一定接5V,否则无法显示!!
VO、VOUT空接,PSB直接接5V,RS、RW、E、RST分别接PA8~PA11,DB0~DB7分别接PB6~PB13!

我这块12864的对比度根本不用调,在VO口串了个10k电位器,调节它没有任何改变,可能出厂的时候就已经调好了!!

程序上:
本来写了一个读忙函数,可以运行成功!!但是实验证明,不加读忙只要在几个地方加个小延时就可以了!!
另外,关于向DB0~DB7写入内容(数据或命令)这一块,本来是借鉴别人的程序,在开头这样写:
#define  LcdData(x)   GPIOB->ODR=(GPIOB->ODR&0xc03f)|(x&0x3fc0)
但是运行后发现不能显示,然后自己写了一个用库函数操作的:
void LcdData(unsigned char Data)
{
GPIO_Write(GPIOB,Data<<6);
}
发现就好使了!这一点我也没搞太明白:L

使用特权

评论回复
评论
logokfu 2013-6-4 10:57 回复TA
#define LcdData(x) GPIOB->ODR=(GPIOB->ODR&0xc03f)|(xUL&0x3fc0) 
logokfu 2013-6-4 10:48 回复TA
你这个X,数据长度是多长的?能和后面的0x3fc0对其么。 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

18

帖子

0

粉丝