板子是原子旗舰版的STM32开发板,液晶是2.8寸的320*240彩色液晶。由于现在是刚学stm32不久,所以就先从模拟8080口驱动液晶开始,以后再学fsmc驱动,这样就对液晶的驱动更加了解,还有就是降低初学者的门槛。 现在我把液晶的中文还有英文手册都看了很多遍,还有原子哥stm32mini板的液晶驱动也看了很多遍,但自己写了个模拟8080口的液晶驱动去驱动液晶就是一点反应都没有,究竟程序出问题了呢?求救,这问题纠结了我很久呢!!!!!
#include "stm32f10x_conf.h"
#include "Board_def.h" //针对板子专门定义的一个头文件
/**
*显示函数
*开显示:IO口配置成默认的推挽输出,打开背光
*关显示:IO口配置成上拉输入,关背光
*/
void Display(FunctionalState NewState)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG,ENABLE);
if(NewState!=DISABLE)
{
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOD,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOG,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOB,&GPIO_InitStructure);
LCD_BL=1; //打开背光
}
else
{
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Init(GPIOD,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Init(GPIOG,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOB,&GPIO_InitStructure);
LCD_BL=0; //关闭背光
}
}
/**
*写配置
*ENABLE则是推挽输出,DISABLE则是上拉输入
*
*/
void Write_config(FunctionalState NewState)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);
if(NewState!=DISABLE)
{
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_8|
GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOD,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7|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_PP;
GPIO_Init(GPIOE,&GPIO_InitStructure);
}
else
{
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_8|
GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Init(GPIOD,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7|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_IPU;
GPIO_Init(GPIOE,&GPIO_InitStructure);
}
}
/**
*写数据
*把离散的IO口封装起来用一个函数来操作
*
*/
void Write_data(short unsigned int Data)
{
short unsigned int temp=0x0000;
temp=Data;
Data0_OUT=(temp>>0)&0x0001;
Data1_OUT=(temp>>1)&0x0001;
Data2_OUT=(temp>>2)&0x0001;
Data3_OUT=(temp>>3)&0x0001;
Data4_OUT=(temp>>4)&0x0001;
Data5_OUT=(temp>>5)&0x0001;
Data6_OUT=(temp>>6)&0x0001;
Data7_OUT=(temp>>7)&0x0001;
Data8_OUT=(temp>>8)&0x0001;
Data9_OUT=(temp>>9)&0x0001;
Data10_OUT=(temp>>10)&0x0001;
Data11_OUT=(temp>>11)&0x0001;
Data12_OUT=(temp>>12)&0x0001;
Data13_OUT=(temp>>13)&0x0001;
Data14_OUT=(temp>>14)&0x0001;
Data15_OUT=(temp>>15)&0x0001;
}
/**
*读数据
*把离散的IO口封装起来一个函数操作
*
*/
short unsigned int Capture_data(void)
{
short unsigned int temp=0x0000;
temp=(Data15_IN&0x0001)<<15|(Data14_IN&0x0001)<<14|(Data13_IN&0x0001)<<13|
(Data12_IN&0x0001)<<12|(Data11_IN&0x0001)<<11|(Data10_IN&0x0001)<<10|
(Data9_IN&0x0001)<<9|(Data8_IN&0x0001)<<8|(Data7_IN&0x0001)<<7|
(Data6_IN&0x0001)<<6|(Data5_IN&0x0001)<<5|(Data4_IN&0x0001)<<4|
(Data3_IN&0x0001)<<3|(Data2_IN&0x0001)<<2|(Data1_IN&0x0001)<<1|(Data0_IN&0x0001)<<0;
return(temp);
}
/**
*LCD写数据
*
*
*/
void LCD_write_data(short unsigned int Data)
{
Write_config(ENABLE);
CS=0;
RS=1;
RD=1;
Write_data(Data);
WR=0;
WR=1;
CS=1;
}
/**
*LCD写命令
*
*·
*/
void LCD_write_cmd(short unsigned int Cmd)
{
Write_config(ENABLE);
CS=0;
RS=0;
RD=1;
Write_data(Cmd);
WR=0;
WR=1;
CS=1;
}
/**
*LCD读数据
*
*
*/
short unsigned int LCD_read_data(void)
{
short unsigned int temp=0;
Write_config(DISABLE);
CS=0;
RS=1;
WR=1;
RD=0;
RD=1;
temp=Capture_data();
CS=1;
return(temp);
}
/**
*LCD初始化
*
*
*/
void Init_lcd(void)
{
Display(ENABLE);
Write_config(ENABLE);
LCD_write_cmd(0xcf);
LCD_write_data(0x00);
LCD_write_data(0xc1);
LCD_write_data(0x30);
LCD_write_cmd(0xed);
LCD_write_data(0x64);
LCD_write_data(0x03);
LCD_write_data(0x12);
LCD_write_data(0x81);
LCD_write_cmd(0xe8);
LCD_write_data(0x85);
LCD_write_data(0x00);
LCD_write_data(0x7a);
LCD_write_cmd(0xcb);
LCD_write_data(0x39);
LCD_write_data(0x2c);
LCD_write_data(0x00);
LCD_write_data(0x34);
LCD_write_data(0x02);
LCD_write_cmd(0xf7);
LCD_write_data(0x20);
LCD_write_cmd(0xea);
LCD_write_data(0x00);
LCD_write_data(0x00);
LCD_write_cmd(0xc0); //power control
LCD_write_data(0x21); //vrh[5:0]
LCD_write_cmd(0xc1); //power control
LCD_write_data(0x11); //sap[2:0];bt[3:0]
LCD_write_cmd(0xc5); //vcm control
LCD_write_data(0x31);
LCD_write_data(0x3c);
LCD_write_cmd(0xc7); //vcm control2
LCD_write_data(0x9f);
LCD_write_cmd(0x36); //memory access control
LCD_write_data(0x08);
LCD_write_cmd(0xb1);
LCD_write_data(0x00);
LCD_write_data(0x1b);
LCD_write_cmd(0xb6); //display function control
LCD_write_data(0x0a);
LCD_write_data(0xa2);
LCD_write_cmd(0xf2); //3gamma function disable
LCD_write_data(0x00);
LCD_write_cmd(0x26); //gamma curve selected
LCD_write_data(0x01);
LCD_write_cmd(0xe0); //set gamma
LCD_write_data(0x0f);
LCD_write_data(0x20);
LCD_write_data(0x1d);
LCD_write_data(0x0b);
LCD_write_data(0x10);
LCD_write_data(0x0a);
LCD_write_data(0x49);
LCD_write_data(0xa9);
LCD_write_data(0x3b);
LCD_write_data(0x0a);
LCD_write_data(0x15);
LCD_write_data(0x06);
LCD_write_data(0x0c);
LCD_write_data(0x06);
LCD_write_data(0x00);
LCD_write_cmd(0xe1); //set gamma
LCD_write_data(0x00);
LCD_write_data(0x1f);
LCD_write_data(0x22);
LCD_write_data(0x04);
LCD_write_data(0x0f);
LCD_write_data(0x05);
LCD_write_data(0x36);
LCD_write_data(0x46);
LCD_write_data(0x46);
LCD_write_data(0x05);
LCD_write_data(0x0b);
LCD_write_data(0x09);
LCD_write_data(0x33);
LCD_write_data(0x39);
LCD_write_data(0x0f);
}
/**
*LCD进入睡眠模式
*
*
*/
void LCD_enter_sleep(void)
{
LCD_write_cmd(0x28); //display off
// delay_20ms();
LCD_write_cmd(0x10); //enter sleep mode
}
/**
*LCD退出睡眠模式
*
*
*/
void LCD_exit_sleep(void)
{
LCD_write_cmd(0x11); //sleep out
// delay_120ms();
LCD_write_cmd(0x29); //display on
}
下面就是随便的在屏幕中显示几个点出来具体函数:
int main(void)
{
Init_lcd();
while(1)
{
LCD_write_cmd(0x4e);
LCD_write_data(10);
LCD_write_cmd(0x4f);
LCD_write_data(20);
LCD_write_cmd(R34);
LCD_write_data(0xf0f0);
LCD_write_cmd(0x4e);
LCD_write_data(11);
LCD_write_cmd(0x4f);
LCD_write_data(21);
LCD_write_cmd(R34);
LCD_write_data(0xf0f0);
LCD_write_cmd(0x4e);
LCD_write_data(12);
LCD_write_cmd(0x4f);
LCD_write_data(22);
LCD_write_cmd(R34);
LCD_write_data(0xf0f0);
LCD_write_cmd(0x4e);
LCD_write_data(13);
LCD_write_cmd(0x4f);
LCD_write_data(23);
LCD_write_cmd(R34);
LCD_write_data(0xf0f0);
}
}
具体的端口位操作为(实际在Board_def.h头文件中):
/****************以下是LCD端口的定义********************/
#define CS *((volatile unsigned int *)(0x1200C*32+12*4+0x42000000)) //PG12->ODR
#define RS *((volatile unsigned int *)(0x1200C*32+0*4+0x42000000)) //PG0->ODR
#define WR *((volatile unsigned int *)(0x1400C*32+5*4+0x42000000)) //PD5->ODR
#define RD *((volatile unsigned int *)(0x1400C*32+4*4+0x42000000)) //PD4->ODR
#define LCD_BL *((volatile unsigned int *)(0x10C0C*32+0*4+0x42000000)) //PB0->ODR
#define Data0_OUT *((volatile unsigned int *)(0x1400C*32+14*4+0x42000000)) //PD14->ODR
#define Data1_OUT *((volatile unsigned int *)(0x1400C*32+15*4+0x42000000)) //PD15->ODR
#define Data2_OUT *((volatile unsigned int *)(0x1400C*32+0*4+0x42000000)) //PD0->ODR
#define Data3_OUT *((volatile unsigned int *)(0x1400C*32+1*4+0x42000000)) //PD1->ODR
#define Data4_OUT *((volatile unsigned int *)(0x1180C*32+7*4+0x42000000)) //PE7->ODR
#define Data5_OUT *((volatile unsigned int *)(0x1180C*32+8*4+0x42000000)) //PE8->ODR
#define Data6_OUT *((volatile unsigned int *)(0x1180C*32+9*4+0x42000000)) //PE9->ODR
#define Data7_OUT *((volatile unsigned int *)(0x1180C*32+10*4+0x42000000)) //PE10->ODR
#define Data8_OUT *((volatile unsigned int *)(0x1180C*32+11*4+0x42000000)) //PE11-ODR
#define Data9_OUT *((volatile unsigned int *)(0x1180C*32+12*4+0x42000000)) //PE12->ODR
#define Data10_OUT *((volatile unsigned int *)(0x1180C*32+13*4+0x42000000)) //PE13->ODR
#define Data11_OUT *((volatile unsigned int *)(0x1180C*32+14*4+0x42000000)) //PE14->ODR
#define Data12_OUT *((volatile unsigned int *)(0x1180C*32+15*4+0x42000000)) //PE15->ODR
#define Data13_OUT *((volatile unsigned int *)(0x1400C*32+8*4+0x42000000)) //PD8->ODR
#define Data14_OUT *((volatile unsigned int *)(0x1400C*32+9*4+0x42000000)) //PD9->ODR
#define Data15_OUT *((volatile unsigned int *)(0x1400C*32+10*4+0x42000000)) //PD10->ODR
#define Data0_IN *((volatile unsigned int *)(0x14008*32+14*4+0x42000000)) //PD14->IDR
#define Data1_IN *((volatile unsigned int *)(0x14008*32+15*4+0x42000000)) //PD15->IDR
#define Data2_IN *((volatile unsigned int *)(0x14008*32+0*4+0x42000000)) //PD0->IDR
#define Data3_IN *((volatile unsigned int *)(0x14008*32+1*4+0x42000000)) //PD1->IDR
#define Data4_IN *((volatile unsigned int *)(0x11808*32+7*4+0x42000000)) //PE7->IDR
#define Data5_IN *((volatile unsigned int *)(0x11808*32+8*4+0x42000000)) //PE8->IDR
#define Data6_IN *((volatile unsigned int *)(0x11808*32+9*4+0x42000000)) //PE9->IDR
#define Data7_IN *((volatile unsigned int *)(0x11808*32+10*4+0x42000000)) //PE10->IDR
#define Data8_IN *((volatile unsigned int *)(0x11808*32+11*4+0x42000000)) //PE11-IDR
#define Data9_IN *((volatile unsigned int *)(0x11808*32+12*4+0x42000000)) //PE12->IDR
#define Data10_IN *((volatile unsigned int *)(0x11808*32+13*4+0x42000000)) //PE13->IDR
#define Data11_IN *((volatile unsigned int *)(0x11808*32+14*4+0x42000000)) //PE14->IDR
#define Data12_IN *((volatile unsigned int *)(0x11808*32+15*4+0x42000000)) //PE15->IDR
#define Data13_IN *((volatile unsigned int *)(0x14008*32+8*4+0x42000000)) //PD8->IDR
#define Data14_IN *((volatile unsigned int *)(0x14008*32+9*4+0x42000000)) //PD9->IDR
#define Data15_IN *((volatile unsigned int *)(0x14008*32+10*4+0x42000000)) //PD10->IDR
求大神看看到底是哪里出问题了??????????
|