OpenVINOTM,给你看得见的未来!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 求助,关于用STM32驱动240*128的显示屏的一些问题

共8条 1/1 1 跳转至

求助,关于用STM32驱动240*128的显示屏的一些问题

菜鸟
2013-08-19 17:04:52    评分
   这段时间在用STM32驱动T6963控制的240*128的显示屏,但是驱动不了,在网上查资料后很多说因为显示屏是用5V驱动的,但是STM32只有 3.3V,所以驱动不了,然后现在使用的方案是:设置IO口味开漏输出,在外边接的是1K的上拉电阻,来驱动,还是没有显示,现在不知道是程序的问题还是 硬件部分的问题,我使用的代码是经过在51上使用了的,改了相应的部分来驱动的,希望大虾帮忙解决,谢谢。
部分程序如下:
#include "t6963.h"
#include "led.h"
#include "delay.h"



/*******************************************************************************
* Function Name  : Lcd_Configuration        LCD的IO端口定义
* Description    : Configures LCD Control lines
* Input          : None
* Output         : None
* Return         : None
* Attention                 : None
*******************************************************************************/
void LCD_Configuration(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
       
        /* Enable GPIOD and GPIOE clocks */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOB, ENABLE);  
                            
        /* 数据端口  PE.8(D0), PE.9(D1), PE.10(D2), PE.11(D3), PE.12(D4), PE.13(D5), PE.14(D6), PE.15(D7)   */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 |GPIO_Pin_10 |GPIO_Pin_11 |GPIO_Pin_12 |GPIO_Pin_13 |GPIO_Pin_14 |GPIO_Pin_15;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_OD; //GPIO_Mode_Out_PP;
        GPIO_Init(GPIOB, &GPIO_InitStructure);

        /* 控制端口  PE.10(Fs), PE.6(RST), PE.5(CD), PE.4(CE), PE.2(WR)
        ***********************************PC.6(CD), PC.8()CE,PC.11(WR) ************/
        GPIO_InitStructure.GPIO_Pin = /* GPIO_Pin_10| GPIO_Pin_6|*/GPIO_Pin_6|GPIO_Pin_8|GPIO_Pin_11;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_OD; //        GPIO_Mode_Out_PP;
        GPIO_Init(GPIOC, &GPIO_InitStructure);
       
        /* 读端口配置  PE.3(RD)   PC12(RD)     */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;//GPIO_Mode_Out_PP;
        GPIO_Init(GPIOC, &GPIO_InitStructure);
}

/*******************************************************************************
* Function Name  : LCD_WriteReg
* Description    : LCD控制器寄存器地址
* Input          : - index: 寄存器地址
* Output         : None
* Return         : None
* Attention                 : None
******************************************************************************
**************写命令函数************************************************/
void LCD_WriteIndex(uint16_t index)
{
                 
        Set_Cd;                                         /* CD=1,写命令*/
        delay_us(1);
        Clr_Ce;
        delay_us(1);
        Clr_nWr;
        delay_us(1);
        GPIOB->ODR|=(((index << 8)|(GPIO_ReadInputData(GPIOB)&0x00FF)));
//        Write_GPIOB_ODR((index << 8)|(Read_GPIOB_IDR&0x00FF));
        delay_us(3);
        Set_nWr;   
        Set_Ce;
        delay_us(1);
}
/*******************************************************************************
* Function Name  : LCD_WriteReg
* Description    : LCD寄存器数据
* Input          : - index: 寄存器数据
* Output         : None
* Return         : None
* Attention                 : None
******************************************************************************
****************写数据函数*********************/
void LCD_WriteData(uint16_t data)
{
                 
        Clr_Cd;                                          /*CD为0,写数据*/
        delay_us(1);
        Clr_Ce;
         delay_us(1);
        Clr_nWr;
         delay_us(1);
        GPIOB->ODR|=(((data << 8)|(GPIO_ReadInputData(GPIOB)&0x00FF)));
//        Write_GPIOB_ODR((data<< 8)|(Read_GPIOB_IDR&0x00FF));
        delay_us(3);
        Set_nWr;
        Set_Ce;
        delay_us(1);
}
/*****************************************************************************
                                清屏函数
**************************************************************************/
void clr_lcd(uchar x,uchar y,uint length)
{
        uint i,place;
        place=x*30+y;
        LCD_WriteData(place&0xff);         //
        LCD_WriteData(place/256);         //
        LCD_WriteIndex(0x24);        //设置将地址写入地址指针计数器中
        LCD_WriteIndex(0xb0);          //设置数据自动写
        for(i=0;i<length;i++)
        {
                LCD_WriteData(0xf0);
                LED1=!LED1;
        }
        LCD_WriteIndex(0xb2);        //关闭自动写
}
/*******************************************************************************
* Function Name  : LCD_Initializtion
* Description    : Initialize LCD Controller.
* Input          : None
* Output         : None
* Return         : None
* Attention                 : None
*******************************************************************************/
void LCD_Initializtion(void)
{
        LCD_Configuration();

        LCD_WriteData(0);
        LCD_WriteData(0);        //图形首地址
        LCD_WriteIndex(0x42);     //图形首地址设置
         
        LCD_WriteData(30);
        LCD_WriteData(0);
        LCD_WriteIndex(0x43);     //图形区域设置

        LCD_WriteIndex(0x80); //设置为OR模式
        LCD_WriteIndex(0x9a); //关闭文本显示,开图形显示
        clr_lcd(0,0,240*128);  //对指定区域清屏

//        Delay_MS(2);       
                       
}

这是t6963.c文件里的,t6963.h文件如下:
#ifndef __t6963_H
#define __t6963_H

/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"

#define uchar unsigned char
#define uint unsigned int

/* 液晶端口的配置,设置液晶端口 */
//#define Set_Fs      GPIO_SetBits(GPIOD, GPIO_Pin_10)         /* 高电平,选择6X8的字体*/
//#define Clr_Fs      GPIO_ResetBits(GPIOD, GPIO_Pin_10)   /* 低电平,选择8X8的字体*/

//#define Set_Rst       GPIO_SetBits(GPIOE, GPIO_Pin_6)            /* 复位是低电平有效,接三极管就变成高电平有效 */
//#define Clr_Rst                  GPIO_ResetBits(GPIOE, GPIO_Pin_6)        /* 低电平不复位LCD */

#define Set_Cd        GPIO_SetBits(GPIOC, GPIO_Pin_6)          /* 寄存器选择端,高选择命令寄存器 */
#define Clr_Cd        GPIO_ResetBits(GPIOC, GPIO_Pin_6)   /* 寄存器选择端,低选择数据寄存器 */

#define Set_Ce        GPIO_SetBits(GPIOC, GPIO_Pin_8)         /* 片选信号 */
#define Clr_Ce        GPIO_ResetBits(GPIOC, GPIO_Pin_8)  /* 片选信号 */

#define Set_nWr       GPIO_SetBits(GPIOC, GPIO_Pin_11)        /* 写信号 */
#define Clr_nWr       GPIO_ResetBits(GPIOC, GPIO_Pin_11)        /* 写信号 */
                                         
#define Set_nRd       GPIO_SetBits(GPIOC, GPIO_Pin_12)        /* 读信号 */
#define Clr_nRd       GPIO_ResetBits(GPIOC, GPIO_Pin_12)        /* 读信号 */

#define Write_GPIOB_ODR(Index)     (GPIO_Write(GPIOB, Index))  /* 写数据 */   
#define Read_GPIOB_IDR                           (GPIO_ReadInputData(GPIOB)) /* 读数据 */     

#define Set_GPIOB_CRH_Input                   GPIOB->CRH = 0x44444444       
#define Set_GPIOB_CRL_Input        GPIOB->CRL = 0x44444444       

#define Set_GPIOB_CRH_Output       GPIOB->CRH = 0x33333333  
#define Set_GPIOB_CRL_Output       GPIOB->CRL = 0x33333333

/* T6963C 的数据宏定义 */
#define  LCD_Add_Zero      0x00
#define  LCD_Data_Zero     0x00
#define  LCD_Data_Fill     0xFF

/* T6963C 命令定义 */
#define  LCD_CUR_POS  0x21      /* 光标位置设置(只有设置到有效显示地址并打开显示时才看到) */
#define  LCD_CGR_POS  0x22      /* CGRAM偏置地址设置(可以增加自已的符号) */
#define  LCD_ADR_POS  0x24      /* 地址指针位置(设置读写操作指针) */
#define  LCD_TXT_STP  0x40      /* 文本区首址(从此地址开始向屏幕左上角显示字符) */
#define  LCD_TXT_WID  0x41      /* 文本区宽度(设置显示宽度,N/6或N/8,其中N为x轴的点数) */
#define  LCD_GRH_STP  0x42      /* 图形区首址(从此地址开始向屏幕左上角显示点) */
#define  LCD_GRH_WID  0x43      /* 图形区宽度(设置显示宽度,N/6或N/8,其中N为x轴的点数) */
#define  LCD_MOD_OR   0x80      /* 显示方式:逻辑或 */
#define  LCD_MOD_XOR  0x81      /* 显示方式:逻辑异或 */
#define  LCD_MOD_AND  0x82      /* 显示方式:逻辑与 */
#define  LCD_MOD_TCH  0x83      /* 显示方式:文本特征 */
#define  LCD_DIS_SW   0x90      /* 显示开关:D0=1/0,光标闪烁启用/禁用 */
                                                       /*        D1=1/0,光标显示启用/禁用 */
                                                       /*        D2=1/0,文本显示启用/禁用(打开后再使用) */
                                                      /*        D3=1/0,图形显示启用/禁用(打开后再使用) */
              
#define  LCD_CUR_SHP  0xA0      /* 光标形状选择:0xA0-0xA7表示光标占的行数 */
#define  LCD_AUT_WR   0xB0      /* 自动写设置 */
#define  LCD_AUT_RD   0xB1      /* 自动读设置 */
#define  LCD_AUT_OVR  0xB2      /* 自动读/写结束 */
#define  LCD_INC_WR   0xC0      /* 数据一次写,地址加1 */
#define  LCD_INC_RD   0xC1      /* 数据一次读,地址加1 */
#define  LCD_DEC_WR   0xC2      /* 数据一次写,地址减1 */
#define  LCD_DEC_RD   0xC3      /* 数据一次读,地址减1 */
#define  LCD_NOC_WR   0xC4      /* 数据一次写,地址不变 */
#define  LCD_NOC_RD   0xC5      /* 数据一次读,地址不变 */
      
#define  LCD_SCN_RD   0xE0      /* 屏读 */
      
#define  LCD_SCN_CP   0xE8      /* 屏拷贝 */
#define  LCD_BIT_OP   0xF0      /* 位操作:D0-D2--定义D0-D7位,D3--1为置位,0为清除 */


/*   以8*8字符计算,显示屏横向、纵向可以显示的字符个数
     以240*128为例:                 */
#define LineChar   30    //一行16个字符(8*8)
#define ColumnChar 16    //总共16列



/* Private function prototypes -----------------------------------------------*/
void LCD_Configuration(void);
void delay(uint k);
void LCD_WriteIndex(uint16_t index);
void LCD_WriteData(uint16_t data);
void clr_lcd(uchar x,uchar y,uint length);
void LCD_Initializtion(void);
#endif




关键词: T6963     STM32    

院士
2013-08-19 17:10:15    评分
2楼

这看着的确是有些头晕啊

 


专家
2013-08-19 22:10:16    评分
3楼
这个表示没有亲自使用过,不过 开漏输出以提高驱动能力这个做法倒是有人试过。

菜鸟
2013-08-20 09:55:15    评分
4楼
求高手指教啊,程序可以发过去帮忙看看到,我的QQ1017927377

高工
2013-08-20 11:00:24    评分
5楼
上个接口图看看

菜鸟
2013-08-20 11:12:43    评分
6楼


VCC用的是5V的VCC用的是5V

高工
2013-08-20 11:16:15    评分
7楼
会不会是电平不匹配的问题呢

菜鸟
2013-08-20 11:21:09    评分
8楼
试过了,设置的是开漏输出,外加1K的上拉电阻,测试电压在4.2V左右,但是还是现实不了...在网上看资料说的是电平不匹配,但是还有人说直接用STM32驱动了其他的显示屏,如12864这样的5V驱动的屏....

共8条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]