硬件设计
链接:https://pan.baidu.com/s/19bjqRFOxaBl4kuKJBye5bg
提取码:wevs
仿真图如下所示:
程序设计
#include "lcd.h"
#include "delay.h"
static u8 INITIAL_COLUNM=0;
void LCD_FUNCTION_Config(void)
{
GPIO_InitTypeDef LCD_Struct;
RCC_APB2PeriphClockCmd(LCD12864_Periph,ENABLE);
LCD_Struct.GPIO_Mode = GPIO_Mode_Out_PP;
LCD_Struct.GPIO_Speed = GPIO_Speed_50MHz;
LCD_Struct.GPIO_Pin = LCD12864_RES_GPIO;
GPIO_Init(LCD12864_GPIO,&LCD_Struct);
LCD_Struct.GPIO_Pin = LCD12864_E_GPIO;
GPIO_Init(LCD12864_GPIO,&LCD_Struct);
LCD_Struct.GPIO_Pin = LCD12864_RS_GPIO;
GPIO_Init(LCD12864_GPIO,&LCD_Struct);
LCD_Struct.GPIO_Pin = LCD12864_RW_GPIO;
GPIO_Init(LCD12864_GPIO,&LCD_Struct);
LCD_Struct.GPIO_Pin = LCD12864_CS1_GPIO;
GPIO_Init(LCD12864_GPIO,&LCD_Struct);
LCD_Struct.GPIO_Pin = LCD12864_CS2_GPIO;
GPIO_Init(LCD12864_GPIO,&LCD_Struct);
}
void LCD_GPIO_Config(void)
{
GPIO_InitTypeDef LCD_Struct;
RCC_APB2PeriphClockCmd(LCD12864_Periph,ENABLE);
LCD_Struct.GPIO_Mode = GPIO_Mode_Out_OD;
LCD_Struct.GPIO_Speed = GPIO_Speed_50MHz;
LCD_Struct.GPIO_Pin = LCD12864_DATA_GPIO;
GPIO_Init(LCD12864_GPIO,&LCD_Struct);
}
void LCD_Init(void) //lcd初始化
{
LCD_GPIO_Config();
LCD_FUNCTION_Config();
LCD12864_RES_0;
delay_ms(10);
LCD12864_RES_1;
delay_ms(50);
LCD_CMD_DIS(ON);
LCD_INITIAL_COLUNM(INITIAL_COLUNM);
}
void LCD_GPIO_MASK(u8 data) //数据掩码包装
{
u16 mask;
mask = GPIO_ReadOutputData(LCD12864_GPIO) & 0XFF00 ;
mask = mask | data ;
GPIO_Write(LCD12864_GPIO,mask);
}
void LCD_CMD_BUSY(void) //忙检测
{
LCD12864_RS_CMD;
LCD12864_RW_R;
LCD12864_E_1;
LCD_GPIO_MASK(0xFF);
while(1)
{
LCD12864_E_0;
delay_us(2);
LCD12864_E_1;
if(!(GPIO_ReadInputData(LCD12864_GPIO)&CMD_BUSY))
break;
}
LCD12864_E_0;
}
//parameter: ON/OFF
void LCD_CMD_DIS(u8 Switch)
{
LCD_CMD_BUSY();
LCD12864_RS_CMD;
LCD12864_RW_W;
LCD12864_E_1;
if(Switch)
LCD_GPIO_MASK(CMD_DIS_ON);
else
LCD_GPIO_MASK(CMD_DIS_OFF);
delay_us(2);
LCD12864_E_0;
}
void LCD_DIS_SELECT(u8 select) //0全灭 1左屏 2右屏 3全屏
{
select%=4;
switch(select)
{
case DIS_RIGHT:
LCD12864_CS2_ON;
LCD12864_CS1_OFF;
break;
case DIS_LEFT:
LCD12864_CS2_OFF;
LCD12864_CS1_ON;
break;
case DIS_ALL:
LCD12864_CS2_ON;
LCD12864_CS1_ON;
break;
case DIS_NONE:
LCD12864_CS2_OFF;
LCD12864_CS1_OFF;
break;
}
}
//指令起始行
//parameter: 0-63
void LCD_INITIAL_COLUNM(u8 Colunm)
{
Colunm%=64;
Colunm = 64 - Colunm;
LCD_CMD_BUSY();
LCD12864_RS_CMD;
LCD12864_RW_W;
LCD12864_E_1;
Colunm = CMD_COLUNM|Colunm;
LCD_GPIO_MASK(Colunm);
delay_us(2);
LCD12864_E_0;
}
//指令写入数据显示列
//parameter: 0-128
void LCD_CMD_Line(u8 Line)
{
Line %= 128;
if(Line<64)
{
LCD_DIS_SELECT(DIS_LEFT);
}
else
{
LCD_DIS_SELECT(DIS_RIGHT);
}
LCD_CMD_BUSY();
LCD12864_RS_CMD;
LCD12864_RW_W;
LCD12864_E_1;
Line = CMD_LINE|Line;
LCD_GPIO_MASK(Line);
delay_us(2);
LCD12864_E_0;
}
//指令写入数据显示页
//parameter: 0-7
void LCD_CMD_PAGE(u8 Page)
{
Page%=8;
LCD_CMD_BUSY();
LCD12864_RS_CMD;
LCD12864_RW_W;
LCD12864_E_1;
Page = CMD_PAGE|Page;
LCD_GPIO_MASK(Page);
delay_us(2);
LCD12864_E_0;
}
//写入数据0-7行
void LCD_CMD_COLUNM(u8 Colunm)
{
Colunm%=8;
Colunm=Colunm-INITIAL_COLUNM/8;
LCD_CMD_PAGE(Colunm);
}
//计算数据长度
u8 LCD_NUMS_SIZE(int num)
{
u8 size=0;
while(num)
{
size++;
num=num/10;
}
return size;
}
int LCD_POW(u8 mi) //计算10的次方
{
int di=1;
while(mi--)
{
di=di*10;
}
return di;
}
void LCD_DATA_WRIRE(u8 data) //写一位数据
{
LCD_CMD_BUSY();
LCD12864_RS_DATA;
LCD12864_RW_W;
LCD12864_E_1;
LCD_GPIO_MASK(data);
delay_us(2);
LCD12864_E_0;
}
.
.