基于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驱动代码
#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. 框图
程序流程
硬件框图