基于STM32的LCD12864数字字母中文图形显示proteus仿真

硬件设计

链接: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;
}

.

.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值