仿真圖proteus 8.9
程序編譯器:keil 5
編程語言:C語言
設(shè)計編號:C0094
1.主要功能
1.使用Proteus仿真軟件和STM32F103系列芯片設(shè)計LCD1602顯示電路。
2.開始仿真后數(shù)碼管LCD1602第一行顯示hello world。第二行顯示字母和數(shù)字。
3.使用STM32CubeMx圖像化工具新建工程。
主要硬件設(shè)備:STM32F103C6+LCD1602液晶
0. 資料清單&下載鏈接
0、常見使用問題及解決方法–必讀!?。?!
1、程序代碼
2、Proteus仿真
3、功能要求
4、設(shè)計報告
5、講解視頻
6、框圖
Altium Designer 安裝破解
KEIL+proteus 單片機(jī)仿真設(shè)計教程
KEIL安裝破解
Proteus元器件查找
Proteus安裝
Proteus簡易使用教程
單片機(jī)學(xué)習(xí)資料
相關(guān)數(shù)據(jù)手冊
答辯技巧
設(shè)計報告常用描述
鼠標(biāo)雙擊打開查找嘉盛單片機(jī)51 STM32單片機(jī)課程畢業(yè)設(shè)計.url
資料下載鏈接:
百度網(wǎng)盤鏈接:
https://pan.baidu.com/s/1TltN_W-7AI_xivUP2dFZDQ?pwd=7fty
2.仿真設(shè)計
打開仿真工程,雙擊proteus中的單片機(jī),選擇hex文件路徑,然后開始仿真。
開始仿真后LCD1602第一行顯示hello world。第二行顯示字母和數(shù)字num=87654321。
3. 程序設(shè)計
程序是用keil5 mdk版本打開的,如果打開有問題,核實(shí)下keil的版本。程序是HAL版本編寫的,有stm32cubemx配置文件。有注釋可以結(jié)合講解視頻理解。
lcd1602驅(qū)動代碼
#include "system.h"
#include "lcd1602.h"
//D0-D7設(shè)定方向: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讀數(shù)據(jù)
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寫數(shù)據(jù)
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數(shù)據(jù)寄存器
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); //清屏 會有抖動現(xiàn)象
uint8_t i=0;
//設(shè)置顯示起始位置
if(x == 0)
LCD_Write_Cmd(0x80|y);
else if(x == 1)
LCD_Write_Cmd(0xc0|y);
//輸出字符串
for(i=0; i<16 && str[i]!='?'; i++)
{
LCD_Write_Data(str[i]);
HAL_Delay(2);
}
}
void LCD_ShowChar(uint8_t x, uint8_t y,uint8_t dat)
{
//設(shè)置顯示起始位置
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)顯示數(shù)字
void LCD_ShowNum(uint8_t x, uint8_t y,uint8_t num)
{
//設(shè)置顯示起始位置
if(x == 0)
LCD_Write_Cmd(0x80|y);
else if(x == 1)
LCD_Write_Cmd(0xc0|y);
LCD_ShowChar(x,y,num+'0');
}
4. 設(shè)計報告
54534字設(shè)計報告,內(nèi)容包括硬件設(shè)計、軟件設(shè)計、結(jié)論等。
5. 框圖
程序流程
硬件框圖