基于STM32的LCD1602显示Proteus仿真设计(仿真+程序+设计报告+讲解视频)

这里写目录标题

基于STM32的LCD1602显示Proteus仿真设计(仿真+程序+设计报告+讲解视频)

仿真图proteus 8.9

程序编译器:keil 5

编程语言:C语言

设计编号:C0094

1.主要功能

1.使用Proteus仿真软件和STM32F103系列芯片设计LCD1602显示电路。

2.开始仿真后数码管LCD1602第一行显示hello world。第二行显示字母和数字。

3.使用STM32CubeMx图像化工具新建工程。

主要硬件设备:STM32F103C6+LCD1602液晶

0. 资料清单&下载链接

0、常见使用问题及解决方法--必读!!!!

1、程序代码

2、Proteus仿真

3、功能要求

4、设计报告

5、讲解视频

6、框图

Altium Designer 安装破解

KEIL+proteus 单片机仿真设计教程

KEIL安装破解

Proteus元器件查找

Proteus安装

Proteus简易使用教程

单片机学习资料

相关数据手册

答辩技巧

设计报告常用描述

鼠标双击打开查找嘉盛单片机51 STM32单片机课程毕业设计.url

资料下载链接:

百度网盘链接:

https://pan.baidu.com/s/1TltN_W-7AI_xivUP2dFZDQ?pwd=7fty

2.仿真设计

打开仿真工程,双击proteus中的单片机,选择hex文件路径,然后开始仿真。

开始仿真后LCD1602第一行显示hello world。第二行显示字母和数字num=87654321。

3. 程序设计

程序是用keil5 mdk版本打开的,如果打开有问题,核实下keil的版本。程序是HAL版本编写的,有stm32cubemx配置文件。有注释可以结合讲解视频理解。

lcd1602驱动代码

c 复制代码
#include "system.h"
#include "lcd1602.h"
//D0-D7设定方向:I-输入;O-输出
void DataDir(char dir)
{
	GPIO_InitTypeDef GPIO_InitStruct = {0};
	HAL_GPIO_WritePin(GPIOA, LED0_Pin|LED1_Pin|LED2_Pin|LED3_Pin|LED4_Pin|LED5_Pin|LED6_Pin|LED7_Pin, GPIO_PIN_SET);
	GPIO_InitStruct.Pin = LED0_Pin|LED1_Pin|LED2_Pin|LED3_Pin|LED4_Pin|LED5_Pin|LED6_Pin|LED7_Pin;
	GPIO_InitStruct.Pull = GPIO_PULLUP;
	if(dir == 'I')
	{
		GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
	}
	else if(dir == 'O')
	{
		GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
		GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
	}
	HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}

//D0-D7读数据
uint8_t ReadData(void)
{
	uint8_t dat=0;
	//DataDir('I');
	if(HAL_GPIO_ReadPin(GPIOA, LED0_Pin)==GPIO_PIN_SET) dat|=0x01;
	if(HAL_GPIO_ReadPin(GPIOA, LED1_Pin)==GPIO_PIN_SET) dat|=0x02;
	if(HAL_GPIO_ReadPin(GPIOA, LED2_Pin)==GPIO_PIN_SET) dat|=0x04;
	if(HAL_GPIO_ReadPin(GPIOA, LED3_Pin)==GPIO_PIN_SET) dat|=0x08;
	if(HAL_GPIO_ReadPin(GPIOA, LED4_Pin)==GPIO_PIN_SET) dat|=0x10;
	if(HAL_GPIO_ReadPin(GPIOA, LED5_Pin)==GPIO_PIN_SET) dat|=0x20;
	if(HAL_GPIO_ReadPin(GPIOA, LED6_Pin)==GPIO_PIN_SET) dat|=0x40;
	if(HAL_GPIO_ReadPin(GPIOA, LED7_Pin)==GPIO_PIN_SET) dat|=0x80;
	return dat;
}

//D0-D7写数据
void WriteData(uint8_t dat)
{
	uint16_t Set_Pins = 0, Rst_Pins = 0;
	//DataDir('O');
	if(dat & 0x01) Set_Pins |= LED0_Pin;
	else Rst_Pins |= LED0_Pin;
	if(dat & 0x02) Set_Pins |= LED1_Pin;
	else Rst_Pins |= LED1_Pin;
	if(dat & 0x04) Set_Pins |= LED2_Pin;
	else Rst_Pins |= LED2_Pin;
	if(dat & 0x08) Set_Pins |= LED3_Pin;
	else Rst_Pins |= LED3_Pin;
	if(dat & 0x10) Set_Pins |= LED4_Pin;
	else Rst_Pins |= LED4_Pin;
	if(dat & 0x20) Set_Pins |= LED5_Pin;
	else Rst_Pins |= LED5_Pin;
	if(dat & 0x40) Set_Pins |= LED6_Pin;
	else Rst_Pins |= LED6_Pin;
	if(dat & 0x80) Set_Pins |= LED7_Pin;
	else Rst_Pins |= LED7_Pin;
	
	HAL_GPIO_WritePin(GPIOA, Set_Pins, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOA, Rst_Pins, GPIO_PIN_RESET);
}

//LCD忙等待
void LCD_Busy_Wait(void)
{
	uint8_t status;
	DataDir('I');
	RS_InstructionR();
	RW_Read();
	do
	{
		E_Set();
		__NOP();
		status = ReadData();
		E_Rst();
	}
	while(status & 0x80);
}

//写LCD指令
void LCD_Write_Cmd(uint8_t cmd)
{
	DataDir('O');
	WriteData(cmd);
	RS_InstructionR();
	RW_Write();
	E_Rst();
	RS_InstructionR();
	RW_Write();
	E_Set();
	__NOP();
	E_Rst();
	LCD_Busy_Wait();
}

//写LCD数据寄存器
void LCD_Write_Data(uint8_t dat)
{
	DataDir('O');
	WriteData(dat);
	RS_DataR();
	RW_Write();
	E_Set();
	__NOP();
	E_Rst();
	LCD_Busy_Wait();
}

//LCD初始化
void LCD_Init(void)
{
	LCD_Write_Cmd(0x38);
	HAL_Delay(2);
	LCD_Write_Cmd(0x01);
	HAL_Delay(2);
	LCD_Write_Cmd(0x06);
	HAL_Delay(2);
	LCD_Write_Cmd(0x0c);
	HAL_Delay(2);
}


//在x行(0-1),y列(0-15)显示字符串
void LCD_ShowString(uint8_t x, uint8_t y, char *str)
{
//	LCD_Write_Cmd(0x01);  //清屏 会有抖动现象
	uint8_t i=0;
	//设置显示起始位置
	if(x == 0)
		LCD_Write_Cmd(0x80|y);
	else if(x == 1)
		LCD_Write_Cmd(0xc0|y);
	//输出字符串
	for(i=0; i<16 && str[i]!='\0'; i++)
	{
		LCD_Write_Data(str[i]);
		HAL_Delay(2);
	}
}

void LCD_ShowChar(uint8_t x, uint8_t y,uint8_t dat)
{

	//设置显示起始位置
	if(x == 0)
		LCD_Write_Cmd(0x80|y);
	else if(x == 1)
		LCD_Write_Cmd(0xc0|y);
   LCD_Write_Data(dat);
}

//在x行(0-1),y列(0-15)显示数字
void LCD_ShowNum(uint8_t x, uint8_t y,uint8_t num)
{     

	//设置显示起始位置
	if(x == 0)
		LCD_Write_Cmd(0x80|y);
	else if(x == 1)
		LCD_Write_Cmd(0xc0|y);
	
   LCD_ShowChar(x,y,num+'0');
	
} 

4. 设计报告

54534字设计报告,内容包括硬件设计、软件设计、结论等。

5. 框图

程序流程

硬件框图

相关推荐
无人装备硬件开发爱好者6 小时前
STM32G474 + 1.32 寸 OLED(128×96)俄罗斯方块游戏实现指南
stm32·嵌入式硬件·游戏
潜创微科技7 小时前
IT6636+USB 协同芯片 3 进 1 出 HDMI2.1 KVM 切换器一体化方案
嵌入式硬件·音视频
dqsh067 小时前
关于STM32G474芯片有规律的自动重启的问题
stm32·单片机·嵌入式硬件·系统重启·原因解析
yong99908 小时前
基于 STM32 的 4×4 矩阵键盘源码
stm32·矩阵·计算机外设
国产芯片设计8 小时前
【LCD驱动实战】单颗YL1621脚位不足?双芯片联动驱动方案详解
stm32·单片机·mcu·51单片机·硬件工程
ADI_OP8 小时前
用SigmaStudio+软件来开发ADSP-21565
算法·音视频·adi dsp中文资料·adi音频dsp·adi dsp开发教程
笨笨小乌龟1111 小时前
单片机的半主机模式与 MicroLib 机制(Keil UseMicroLIB)
stm32·单片机·嵌入式硬件
苏州汇成元电子科技14 小时前
从I-PEX 82441-100B-02-D看14Pin极细同轴线束怎么选?
音视频·硬件工程·信号处理·材料工程
ZC跨境爬虫14 小时前
跟着 MDN 学 HTML day_33:(Attr 接口与属性节点的深入理解)
前端·javascript·ui·html·音视频·html5
旧梦吟15 小时前
5.9 电工考试-易错题
stm32·嵌入式硬件