最近想用STM32控制12864做显示,本来是仿照做的,可是程序烧进去什么都不显示,我的连接电路如下,我开始以为是没接上接电阻,后来我看了开发板TFT的电路也没有接上接电阻,现在就不知道问题出在哪里了,麻烦各位帮忙看下,谢谢!
LCD程序如下:
#include "LCD.h"
#include "zimo.h"
#include "delay.h"
#define DisIO GPIOA //定义12864要使用的I/O端口。
#define DisClk RCC_APB2Periph_GPIOA //定义12864要使用的I/O端口的时钟。
#define IOData 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 RS_H GPIO_SetBits(GPIOE,GPIO_Pin_1) //RS=1
#define RS_L GPIO_ResetBits(GPIOE,GPIO_Pin_1) //RS=0
#define RW_H GPIO_SetBits(GPIOB,GPIO_Pin_10) //RW=1
#define RW_L GPIO_ResetBits(GPIOB,GPIO_Pin_10); //RW = 0
#define EN_H GPIO_SetBits(GPIOD,GPIO_Pin_7); //EN = 1.
#define EN_L GPIO_ResetBits(GPIOD,GPIO_Pin_7); //EN = 0
#define CS1_H GPIO_SetBits(GPIOD,GPIO_Pin_4); //CS1 = 1.
#define CS1_L GPIO_ResetBits(GPIOD,GPIO_Pin_4); //CS1 = 0.
#define CS2_H GPIO_SetBits(GPIOD,GPIO_Pin_5); //CS2 = 1.
#define CS2_L GPIO_ResetBits(GPIOD,GPIO_Pin_5); //CS2 = 0.
/****************全局变量定义*******************/
Uchar col,row,cbyte; /*列x,行(页)y,输出数据 */
char x,y,xy; /*画线方向标志:1水平 */
char conv; //反转显示标志
/****************************************/
/* 清屏,全屏幕清零 */
/****************************************/
void Lcmcls( void )
{
for(row=0;row<8;row++)
for(col=0;col<LCMLIMIT;col++) Wrdata(0);
}
/****************************************/
/* 数据写输出 */
/****************************************/
void Wrdata(Uchar X)
{
Locatexy(); /*坐标定位,返回时保留分区状态不变 */
// wtcom();
RS_H; //RS = 1.
RW_L; //RW = 0.
DisIO->ODR=((DisIO->ODR & 0xff00)|X); //同上。
EN_H; //EN = 1.
delay_ms(2);
EN_L; //EN = 0;
delay_ms(2);
}
/********************************/
/* 命令输出到左区控制口 */
/********************************/
void WrcmdL(Uchar X)
{
lcdbusyL(); /*确定分区,返回时保留分区状态不变*/
RS_L; //RS = 0.
RW_L; //RW = 0.
DisIO->ODR=((DisIO->ODR & 0xff00)|X); //此处直接操作寄存器
EN_H; //EN = 1.
delay_ms(2);
EN_L; //EN = 0;
delay_ms(2);
}
/********************************/
/* 命令输出到右区控制口 */
/********************************/
void WrcmdR(Uchar X)
{
lcdbusyR(); /*确定分区,返回时保留分区状态不变 */
RS_L; //RS = 0.
RS_L; //RW = 0.
DisIO->ODR=((DisIO->ODR & 0xff00)|X); //此处直接操作寄存器;
EN_H; //EN = 1.
delay_ms(2);
EN_L; //EN = 0;
delay_ms(2);
}
/********************************************************/
/* 分区操作允许等待,返回时保留分区选择状态 */
/********************************************************/
void lcdbusyL(void)
{
CS1_H; //CS1 = 1.
CS2_L; //CS2 = 0.
wtcom(); /* waitting for enable */
}
void lcdbusyR(void)
{
CS1_L; //CS1 = 0.
CS2_H; //CS2 = 1.
wtcom(); /* waitting for enable */
}
void wtcom(void)
{
LCDIO_IN(); //把数据引脚定义为浮空输入;
RS_L; //RS = 0.
RW_H; //RW = 1.
EN_H; //EN = 1.
delay_ms(2);
while(GPIO_ReadInputData(DisIO) & 0x0080); ////只要位7的值,位7是忙标志位。
EN_L; //EN = 0;
delay_ms(2);
LCDIO_OUT(); //把所有引脚定义为输出。
}
/********************************************************/
/*根据设定的坐标数据,定位LCM上的下一个操作单元位置 */
/********************************************************/
void Locatexy(void)
{
unsigned char x,y;
switch (col&0xc0) /* col.and.0xC0 */
{ /*条件分支执行 */
case 0: {lcdbusyL();break;} /*左区 */
case 0x40: {lcdbusyR();break;} /*右区 */
}
x = col&0x3F|SETX; /* col.and.0x3f.or.setx */
y = row&0x07|SETY; /* row.and.0x07.or.sety */
wtcom(); /* waitting for enable */
RS_L; //RS = 0.
RW_L; //RW = 0.
DisIO->ODR=((DisIO->ODR & 0xff00)|y); //此处直接操作寄存器;
EN_H; //EN = 1.
delay_ms(2);
EN_L; //EN = 0;
wtcom(); /* waitting for enable */
RS_L; //RS = 0.
RW_L; //RW = 0.
DisIO->ODR=((DisIO->ODR & 0xff00)|x); //此处直接操作寄存器;
EN_H; //EN = 1.
delay_ms(2);
EN_L; //EN = 0;
delay_ms(2);
}
/********************************/
/*液晶屏初始化 */
/********************************/
void Lcminit(void)
{
cbyte = DISPOFF; /*关闭显示屏 */
WrcmdL(cbyte);
WrcmdR(cbyte);
delay_ms(2);
cbyte = DISPON; /*打开显示屏 */
WrcmdL(cbyte);
WrcmdR(cbyte);
delay_ms(2);
cbyte = DISPFIRST; /*定义显示起始行为零 */
WrcmdL(cbyte);
WrcmdR(cbyte);
delay_ms(2);
Lcmcls(); /*清屏 */
col=0;
row=0;
Locatexy();
}
//初始化lcd
void IO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC |
RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE , ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//定义数据引脚为浮空输入的变量初始化。
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = IOData;
GPIO_Init(DisIO,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5; //LCD_CS1/CS2
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_ResetBits(GPIOD,GPIO_Pin_4 | GPIO_Pin_5);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //LCD_RS
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_ResetBits(GPIOE,GPIO_Pin_1);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //LCD_RW
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_ResetBits(GPIOB,GPIO_Pin_10);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //LCD_EN
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_ResetBits(GPIOD,GPIO_Pin_7);
}
//数据引脚设置为浮空输入
void LCDIO_IN(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
GPIO_InitStructure.GPIO_Pin = IOData;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
//数据引脚设置推挽输出
void LCDIO_OUT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
GPIO_InitStructure.GPIO_Pin = IOData;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
主程序如下:
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "lcd.h"
//ALIENTEK战舰STM32开发板实验1
//跑马灯实验
//技术支持:www.openedv.com
//广州市星翼电子科技有限公司
extern unsigned char col,row,cbyte; //列x,行(页)y,输出数据
extern char xy; //画线方向标志:1水平
extern char conv; //反转显示标志
int main(void)
{
int i=0;
IO_Init(); //端口初始化
delay_init(); //延时函数初始化
LED_Init(); //初始化与LED连接的硬件接口
delay_ms(50); //延时40ms
Lcminit(); //液晶模块初始化,包括全屏幕清屏
row=2;
col=0;
for(i=0;i<32;i++) //显示横线
{
col=i;
Wrdata(1);
}
while(1)
{
LED0=0;
LED1=1;
delay_ms(300); //延时300ms
LED0=1;
LED1=0;
delay_ms(300); //延时300ms
}
}
|