打印
[应用相关]

关于STM32驱动液晶的问题

[复制链接]
8025|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kfawj|  楼主 | 2008-7-16 10:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我的液晶到现在无法驱动。
用的是RA8835 驱动320240液晶,
供电电压3.3V,数据口曾试过加上拉电阻。
沙发
kfawj|  楼主 | 2008-7-16 10:29 | 只看该作者

下面是lcd.h

#ifndef __LCD_H

#define __LCD_H
#include "stm32f10x_lib.h"

#define LCD_WR         GPIOC, GPIO_Pin_8
#define LCD_RD         GPIOC, GPIO_Pin_6
#define LCD_A0         GPIOC, GPIO_Pin_9
#define LCD_CS         GPIOC, GPIO_Pin_7
#define LCD_ON         GPIO_ResetBits(LCD_CS);
#define LCD_OFF        GPIO_SetBits(LCD_CS);

#define LAMP_ON        GPIO_SetBits(GPIOC, GPIO_Pin_13);
#define LAMP_OFF       GPIO_ResetBits(GPIOC, GPIO_Pin_13);

#define DB0            GPIOA, GPIO_Pin_0
#define DB1            GPIOA, GPIO_Pin_1
#define DB2            GPIOA, GPIO_Pin_4
#define DB3            GPIOA, GPIO_Pin_5
#define DB4            GPIOA, GPIO_Pin_6
#define DB5            GPIOA, GPIO_Pin_7
#define DB6            GPIOA, GPIO_Pin_8
#define DB7            GPIOA, GPIO_Pin_12

#define LCD_C_Init     0x40
#define LCD_C_Free     0x53
#define LCD_C_DisOn    0x59
#define LCD_C_DisOff   0x58
#define LCD_C_Scroll   0x44
#define LCD_C_Cur      0x5D
#define LCD_C_CGRAM    0x5C
#define LCD_C_CurMove  0x4C
#define LCD_Right      0x00
#define LCD_Left       0x01
#define LCD_Up         0x02
#define LCD_Down       0x03
#define LCD_C_Dot      0x5A
#define LCD_C_Scr      0x5B
#define LCD_C_SetC     0x46
#define LCD_C_ReadC    0x47
#define LCD_C_WrDat    0x42
#define LCD_C_RdDat    0x43

void LCD_Data_O(u8 Dat);
u8 LCD_Data_I(void);
u8 LCD_RdStat(void);
void LCD_Com_W(u8 Com);
u8 LCD_Com_R(void);
void LCD_Dat_W(u8 Dat);
u8 LCD_Dat_R(void);
void LCD_Init(void);
void LCD_Gotoxy(u8 x,u8 y);
void LCD_Clrscr(void);
#endif

使用特权

评论回复
板凳
kfawj|  楼主 | 2008-7-16 10:30 | 只看该作者

下面是lcd.c


#include "LCD.h"

void LCD_Data_O(u8 Dat)
{
  if(Dat & 0x01)
    GPIO_SetBits(DB0);
  else
     GPIO_ResetBits(DB0);
  
  if(Dat & 0x02)
    GPIO_SetBits(DB1);
  else
     GPIO_ResetBits(DB1);
  
  if(Dat & 0x04)
    GPIO_SetBits(DB2);
  else
     GPIO_ResetBits(DB2);
  
  if(Dat & 0x08)
    GPIO_SetBits(DB3);
  else
     GPIO_ResetBits(DB3);
  
  if(Dat & 0x10)
    GPIO_SetBits(DB4);
  else
     GPIO_ResetBits(DB4);
  
  if(Dat & 0x20)
    GPIO_SetBits(DB5);
  else
     GPIO_ResetBits(DB5);
  
  if(Dat & 0x40)
    GPIO_SetBits(DB6);
  else
    GPIO_ResetBits(DB6);
  
  if(Dat & 0x80)
    GPIO_SetBits(DB7);
  else
    GPIO_ResetBits(DB7);
}

u8 LCD_Data_I(void)
{
  u8 i;
  i=0;
  if(GPIO_ReadInputDataBit(DB0))
     i |= 0x01;
  if(GPIO_ReadInputDataBit(DB1))
     i |= 0x02;
  if(GPIO_ReadInputDataBit(DB2))
     i |= 0x04;
  if(GPIO_ReadInputDataBit(DB3))
     i |= 0x08;
  if(GPIO_ReadInputDataBit(DB4))
     i |= 0x10;
  if(GPIO_ReadInputDataBit(DB5))
     i |= 0x20;
  if(GPIO_ReadInputDataBit(DB6))
     i |= 0x40;
  if(GPIO_ReadInputDataBit(DB7))
     i |= 0x80;
  
  return i;
}

u8 LCD_RdStat(void)
{
  u8 i;
  GPIO_ResetBits(LCD_A0);
  GPIO_ResetBits(LCD_RD);
  GPIO_SetBits(LCD_WR);
  i = LCD_Data_I();
  GPIO_SetBits(LCD_RD);
  return i;
}

void LCD_Com_W(u8 Com)
{
  while(LCD_RdStat() & 0x40);
  GPIO_SetBits(LCD_A0);
  GPIO_SetBits(LCD_RD);
  LCD_Data_O(Com);
  GPIO_ResetBits(LCD_WR);
  GPIO_SetBits(LCD_WR);
}

u8 LCD_Com_R(void)
{
  u8 i;
  //while(LCD_RdStat() & 0x40);
  GPIO_ResetBits(LCD_A0);
  GPIO_ResetBits(LCD_RD);
  i = LCD_Data_I();
  GPIO_SetBits(LCD_RD);
  return i;
}

void LCD_Dat_W(u8 Dat)
{
  while(LCD_RdStat() & 0x40);
  GPIO_ResetBits(LCD_A0);
  GPIO_SetBits(LCD_RD);
  LCD_Data_O(Dat);
  GPIO_ResetBits(LCD_WR);
  GPIO_SetBits(LCD_WR);
}

u8 LCD_Dat_R(void)
{
  u8 i;
  //while(LCD_RdStat() & 0x40);
  GPIO_SetBits(LCD_A0);
  GPIO_ResetBits(LCD_RD);
  i = LCD_Data_I();
  GPIO_SetBits(LCD_RD);
  return i;
}

void LCD_Init(void)
{
  LCD_Com_W(LCD_C_Init);
  LCD_Dat_W(0x30);
  LCD_Dat_W(0x87);
  LCD_Dat_W(0x07);
  LCD_Dat_W(0x27);
  LCD_Dat_W(0x37);
  LCD_Dat_W(0xEF);
  LCD_Dat_W(0x28);
  LCD_Dat_W(0x00);
  
  LCD_Com_W(LCD_C_Scroll);
  LCD_Dat_W(0x00);
  LCD_Dat_W(0x00);
  LCD_Dat_W(0xF0);
  LCD_Dat_W(0x80);
  LCD_Dat_W(0x25);
  LCD_Dat_W(0xF0);
  LCD_Dat_W(0x00);
  LCD_Dat_W(0x3A);
  LCD_Dat_W(0x00);
  LCD_Dat_W(0x3A);
  
  LCD_Com_W(LCD_C_Dot);
  LCD_Dat_W(0x00);
  
  LCD_Com_W(LCD_C_DisOff);
  LCD_Dat_W(0x54);
  
  LCD_Com_W(LCD_C_Cur);
  LCD_Dat_W(0x00);
  LCD_Dat_W(0x00);
  
  LCD_Com_W(LCD_C_DisOn);
  LCD_Dat_W(0x54);
  
  LCD_Com_W(LCD_C_Scr);
  LCD_Dat_W(0xC0);
}

void LCD_Gotoxy(u8 x,u8 y)
{
  LCD_Com_W(LCD_C_SetC);
  LCD_Dat_W(x);
  LCD_Dat_W(y);
}

void LCD_Clrscr(void)
{
  u16 i;
  LCD_Com_W(LCD_C_CurMove);
  LCD_Gotoxy(0,0);
  LCD_Com_W(LCD_C_WrDat);
  for(i=0;i<0x7FFF;i++){
    LCD_Dat_W(0x00);
  }
}

使用特权

评论回复
地板
kfawj|  楼主 | 2008-7-16 10:33 | 只看该作者

注解

数据口,为复合推挽
控制口,为推挽输出

使用特权

评论回复
5
香水城| | 2008-7-16 10:47 | 只看该作者

为什么数据口为复合推挽?

使用特权

评论回复
6
kfawj|  楼主 | 2008-7-16 14:02 | 只看该作者

不会是用复合极漏吧?

为什么呢?
您建议用什么方式?
至于其他的输入方式我都已经试过了。
似乎总是不能通过读系统忙处!又开始郁闷啦5555555555
(香主的回复速度真够快的)

使用特权

评论回复
7
香水城| | 2008-7-16 17:24 | 只看该作者

不明白你说的复合推挽或复合极漏是什么?

是否指复用功能,如果是就很奇怪了,你使用的是GPIO操作,没有必要用复用功能。

你应该把线路图贴出来讨论。

使用特权

评论回复
8
kfawj|  楼主 | 2008-7-17 13:09 | 只看该作者

这就是液晶部分的原理图

液晶现在改用3V供电啦!香主或哪位大侠帮着看看吧!!!
[img]https://bbs.21ic.com/upfiles/img/20079/20079113248115.jpg

使用特权

评论回复
9
starm| | 2008-7-17 13:18 | 只看该作者

不知道是否可以把数据端口设置为开路输出?

如果要读取 LCD 数据, 端口输出 0xFF
如果要写入 LCD 数据, 端口输出 欲写的数值。

使用特权

评论回复
10
kfawj|  楼主 | 2008-7-17 13:28 | 只看该作者

开漏方式?

请问楼上怎么读数据口上的参数呢?
还望给解释一下!

使用特权

评论回复
11
香水城| | 2008-7-17 14:59 | 只看该作者

9楼的方法是对的

使用特权

评论回复
12
kfawj|  楼主 | 2008-7-17 15:03 | 只看该作者

如果是开漏

还可以准确地读出数据口上的参数值吗?
香主,帮助解释一下吧!

使用特权

评论回复
13
zyok| | 2008-7-17 15:30 | 只看该作者

有上拉电阻就可以。。。

7.1.8 Output configuration
When the I/O Port is programmed as Output:
● The Output Buffer is enabled:
– Open Drain Mode: A “0” in the Output register activates the N-MOS while a “1” in
the Output register leaves the port in Hi-Z. (the P-MOS is never activated)
– Push-Pull Mode: A “0” in the Output register activates the N-MOS while a “1” in the
Output register activates the P-MOS.
● The Schmitt Trigger Input is activated.
● The weak pull-up and pull-down resistors are disabled.
● ● ● The data present on the I/O pin is sampled into the Input Data Register every APB2 clock cycle
● A read access to the Input Data Register gets the I/O state in open drain mode
● A read access to the Output Data register gets the last written value in Push-Pull mode

使用特权

评论回复
14
kfawj|  楼主 | 2008-7-18 08:56 | 只看该作者

to:zyok

这个方法已经试过了。

使用特权

评论回复
15
香水城| | 2008-7-18 10:49 | 只看该作者

我以前就12楼的问题有一个解释

请参看我在下面这个帖子中5楼的解释:关于STM32的GPIO操作疑问

使用特权

评论回复
16
kfawj|  楼主 | 2008-7-18 16:12 | 只看该作者

55555555……


晕死了!
为什么PA8总被拉高呢?
不会是uart1的原因吧?

另外试了一下
结果还是不行!
郁闷之极!
相关链接:https://bbs.21ic.com/club/bbs/list.asp?boardid=49&page=1&t=3035923&tp=%u9686%u91CD%u63A8%u51FASTM32F%u7684LCD320*240%u9A71%u52A8%u7A0B%u5E8F

使用特权

评论回复
17
香水城| | 2008-7-18 16:31 | 只看该作者

你先把这个有问题的PA8所连接的电路,只保留上拉看看是否

如果也有问题,有可能是芯片管脚被烧坏。

从8楼给的电路看,你的LCD是5V器件;从2楼的程序看,DB0~DB7是双向的;因为你曾经把这些管脚配置为推挽输出,这样当LCD的DB0~DB7也是输出时,可能会烧坏STM32的管脚。

使用特权

评论回复
18
hanker510| | 2008-7-18 16:32 | 只看该作者

猜测

  感觉楼主肯定 在之前的总线配置、和时钟初始化函数中 对uart配置了
只不过用户程序里没有用到 。
  检查一遍吧  我也犯过类似错误

使用特权

评论回复
19
kfawj|  楼主 | 2008-7-18 16:36 | 只看该作者

再去查查程序

同时,听香主的,换一个i/o口再试一下!

使用特权

评论回复
20
kfawj|  楼主 | 2008-7-19 09:12 | 只看该作者

io口试过啦

没有问题。
方法:ResetBits(GPIOA,GPIO_Pin_All);
SetBits(GPIOA,GPIO_Pin_All);
测量相关的数据口没有发现问题。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

44

主题

293

帖子

2

粉丝