这段时间在用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
|
|