[C] 纯文本查看 复制代码
#define USE_HORIZONTAL 0 //设置横屏或者竖屏显示 0或1为竖屏 2或3为横屏
#if USE_HORIZONTAL==0||USE_HORIZONTAL==1
#define LCD_W 240
#define LCD_H 320
#else
#define LCD_W 240
#define LCD_H 240
#endif
//#define u8 unsigned char
//#define u16 unsigned int
//#define u32 unsigned long
//-----------------测试LED端口定义----------------
#define LED_ON GPIO_ResetBits(GPIOA,GPIO_Pin_15)
#define LED_OFF GPIO_SetBits(GPIOA,GPIO_Pin_15)
//-----------------OLED端口定义----------------
#define DATAOUT(x) GPIOD->ODR=x; //数据输出
#define DATAIN GPIOD->IDR; //数据输入
//#define DATAOUT(x) DATAchange(x);
//#define DATAIN GPIOE->IDR; //数据输入
#define LCD_RST_SET GPIOB->BSRR=1<<3 //复位 PB15
#define LCD_CS_SET GPIOA->BSRR=1<<15 //片选端口 PB14
#define LCD_DC_SET GPIOC->BSRR=1<<10 //数据/命令 PB13
#define LCD_WR_SET GPIOC->BSRR=1<<11 //写数据 PB12
#define LCD_RD_SET GPIOC->BSRR=1<<12 //读数据 PB11
#define LCD_RST_CLR GPIOB->BRR=1<<3 //复位 PB15
#define LCD_CS_CLR GPIOA->BRR=1<<15 //片选端口 PB14
#define LCD_DC_CLR GPIOC->BRR=1<<10 //数据/命令 PB13
#define LCD_WR_CLR GPIOC->BRR=1<<11 //写数据 PB12
#define LCD_RD_CLR GPIOC->BRR=1<<12 //读数据 PB11
/******************************************************************************
函数说明:LCD并行数据写入函数
入口数据:dat 要写入的并行数据
返回值: 无
******************************************************************************/
void LCD_Writ_Bus(u8 dat)
{
LCD_CS_CLR;
LCD_WR_CLR;
DATAOUT(dat);
LCD_WR_SET;
LCD_CS_SET;
}
/******************************************************************************
函数说明:LCD写入数据
入口数据:dat 写入的数据
返回值: 无
******************************************************************************/
void LCD_WR_DATA8(u8 dat)
{
LCD_DC_SET;//写数据
LCD_Writ_Bus(dat);
}
/******************************************************************************
函数说明:LCD写入数据
入口数据:dat 写入的数据
返回值: 无
******************************************************************************/
void LCD_WR_DATA(u16 dat)
{
LCD_DC_SET;//写数据
LCD_Writ_Bus(dat>>8);
LCD_Writ_Bus(dat);
}
/******************************************************************************
函数说明:LCD写入命令
入口数据:dat 写入的命令
返回值: 无
******************************************************************************/
void LCD_WR_REG(u8 dat)
{
LCD_DC_CLR;//写命令
LCD_Writ_Bus(dat);
}
/******************************************************************************
函数说明:设置起始和结束地址
入口数据:x1,x2 设置列的起始和结束地址
y1,y2 设置行的起始和结束地址
返回值: 无
******************************************************************************/
void LCD_Address_Set(u16 x1,u16 y1,u16 x2,u16 y2)
{
if(USE_HORIZONTAL==0)
{
LCD_WR_REG(0x2a);//列地址设置
LCD_WR_DATA(x1);
LCD_WR_DATA(x2);
LCD_WR_REG(0x2b);//行地址设置
LCD_WR_DATA(y1);
LCD_WR_DATA(y2);
LCD_WR_REG(0x2c);//储存器写
}
else if(USE_HORIZONTAL==1)
{
LCD_WR_REG(0x2a);//列地址设置
LCD_WR_DATA(x1);
LCD_WR_DATA(x2);
LCD_WR_REG(0x2b);//行地址设置
LCD_WR_DATA(y1+80);
LCD_WR_DATA(y2+80);
LCD_WR_REG(0x2c);//储存器写
}
else if(USE_HORIZONTAL==2)
{
LCD_WR_REG(0x2a);//列地址设置
LCD_WR_DATA(x1);
LCD_WR_DATA(x2);
LCD_WR_REG(0x2b);//行地址设置
LCD_WR_DATA(y1);
LCD_WR_DATA(y2);
LCD_WR_REG(0x2c);//储存器写
}
else
{
LCD_WR_REG(0x2a);//列地址设置
LCD_WR_DATA(x1+80);
LCD_WR_DATA(x2+80);
LCD_WR_REG(0x2b);//行地址设置
LCD_WR_DATA(y1);
LCD_WR_DATA(y2);
LCD_WR_REG(0x2c);//储存器写
}
}
/******************************************************************************
函数说明:LCD初始化函数 模拟8080协议并口屏 FSMC引脚被占用
入口数据:无
返回值: 无
******************************************************************************/
void Lcd_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO, ENABLE); //使能A端口时钟
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
GPIO_Init(GPIOD, &GPIO_InitStructure); //初始化GPIOA
GPIO_SetBits(GPIOD,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //RESET
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化GPIOA
GPIO_SetBits(GPIOB,GPIO_Pin_3);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; //CS
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOA
GPIO_SetBits(GPIOA,GPIO_Pin_15);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12; //RS WR RD
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化GPIOA
GPIO_SetBits(GPIOC,GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //RS WR RD
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOA
GPIO_SetBits(GPIOA,GPIO_Pin_11);
GPIO_WriteBit(GPIOA,GPIO_Pin_11,Bit_RESET);//拉低使能
LCD_RST_CLR;
delay_ms(100);
LCD_RST_SET;
// OLED_BLK_Set();
delay_ms(100);
LCD_WR_REG(0x11);
LCD_WR_DATA8(0x00);
delay_ms(120);
//************* Start Initial Sequence **********//
LCD_WR_REG(0x36);
if(USE_HORIZONTAL==0)LCD_WR_DATA8(0x00);
else if(USE_HORIZONTAL==1)LCD_WR_DATA8(0xC0);
else if(USE_HORIZONTAL==2)LCD_WR_DATA8(0x70);
else LCD_WR_DATA8(0xA0);
LCD_WR_REG(0x3A);
LCD_WR_DATA(0x05);
LCD_WR_REG(0xB2);
LCD_WR_DATA(0x0C);
LCD_WR_DATA(0x0C);
LCD_WR_DATA(0x00);
LCD_WR_DATA(0x33);
LCD_WR_DATA(0x33);
LCD_WR_REG(0xB7);
LCD_WR_DATA8(0x35);
LCD_WR_REG(0xBB);
LCD_WR_DATA8(0x19);
LCD_WR_REG(0xC0);
LCD_WR_DATA8(0x2C);
LCD_WR_REG(0xC2);
LCD_WR_DATA8(0x01);
LCD_WR_REG(0xC3);
LCD_WR_DATA8(0x12);
LCD_WR_REG(0xC4);
LCD_WR_DATA8(0x20);
LCD_WR_REG(0xC6);
LCD_WR_DATA8(0x0F);
LCD_WR_REG(0xD0);
LCD_WR_DATA8(0xA4);
LCD_WR_DATA8(0xA1);
LCD_WR_REG( 0xE0);
LCD_WR_DATA( 0xD0);
LCD_WR_DATA( 0x08);
LCD_WR_DATA( 0x0E);
LCD_WR_DATA( 0x09);
LCD_WR_DATA( 0x09);
LCD_WR_DATA( 0x05);
LCD_WR_DATA( 0x31);
LCD_WR_DATA( 0x33);
LCD_WR_DATA( 0x48);
LCD_WR_DATA( 0x17);
LCD_WR_DATA( 0x14);
LCD_WR_DATA( 0x15);
LCD_WR_DATA( 0x31);
LCD_WR_DATA( 0x34);
LCD_WR_REG( 0xE1);
LCD_WR_DATA( 0xD0);
LCD_WR_DATA( 0x08);
LCD_WR_DATA( 0x0E);
LCD_WR_DATA( 0x09);
LCD_WR_DATA( 0x09);
LCD_WR_DATA( 0x15);
LCD_WR_DATA( 0x31);
LCD_WR_DATA( 0x33);
LCD_WR_DATA( 0x48);
LCD_WR_DATA( 0x17);
LCD_WR_DATA( 0x14);
LCD_WR_DATA( 0x15);
LCD_WR_DATA( 0x31);
LCD_WR_DATA( 0x34);
LCD_WR_REG(0x21);
LCD_WR_REG(0x29);
}
/******************************************************************************
函数说明:LCD清屏函数
入口数据:无
返回值: 无
******************************************************************************/
void LCD_Clear(u16 Color)
{
u16 i,j;
LCD_Address_Set(0,0,LCD_W-1,LCD_H-1);
for(i=0;i<LCD_W;i++)
{
for (j=0;j<LCD_H;j++)
{
LCD_WR_DATA(Color);
}
}
}
/******************************************************************************
函数说明:显示图片
入口数据:x,y起点坐标
length 图片长度
width 图片宽度
pic[] 图片数组
返回值: 无
******************************************************************************/
void LCD_ShowPicture(u16 x,u16 y,u16 length,u16 width,const u8 pic[])
{
u16 i,j;
u32 k=0;
LCD_Address_Set(x,y,x+length-1,y+width-1);
for(i=0;i<length;i++)
{
for(j=0;j<width;j++)
{
LCD_WR_DATA8(pic[k*2]);
LCD_WR_DATA8(pic[k*2+1]);
k++;
}
}
return;
}
void LCD_Clear_def(u16 x,u16 y,u16 length,u16 width,u16 Color)
{
u16 i,j;
LCD_Address_Set(x,y,x+length-1,y+width-1);
for(i=0;i<length;i++)
{
for (j=0;j<width;j++)
{
LCD_WR_DATA(Color);
}
}
}