stm32驱动lcd1602至少要几个io口?
oled呢?
什么时候采用OLED更合适
STM32驱动LCD1602至少需要几个IO口?
STM32驱动LCD1602时,最少需要6个IO口。其中:
4个数据线(D4,D5,D6,D7)
1个寄存器选择线(RS)
1个使能线(EN)
这种配置即为4位模式。若采用8位模式,则需使用10个IO口。
OLED屏需要多少个IO口?
对于OLED显示器驱动,主要依赖以下两种通信协议:
I2C:至少需要2个IO口(SDA和SCL)
SPI:至少需要3个IO口(MOSI, SCK, CS),如果需要控制DC信号,需要加一个IO口(共4个)
什么时候采用OLED更合适?
OLED相较于LCD具有以下优势:
更高的对比度和更宽的视角
更快的响应速度
能更好地在低温环境下工作
更薄,更轻巧
低功耗
因此,在对显示质量、对比度、低温性能、快速响应以及轻巧程度有较高要求的场景下,采用OLED会更合适。
1.由于程序并不需要显示所有的中文,所以将对应需要的文字添加到程序就可以了。
.2.名字对应的储存格式
使用STM32驱动LCD1602需要4个IO口,分别是RS、RW、E和D0-D7。
当使用OLED时,需要2个IO口,分别是SCL(时钟线)和SDA(数据线)。
选择OLED比较合适的情况是需要显示更精细的图形、需要更高的分辨率和更广的视角、需要更低的耗电量和更小的尺寸。此外,OLED还具有响应速度快、颜色鲜艳、对比度高等优点。
以下是使用STM32驱动LCD的代码:
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_tim.h"
#include "stm32f10x_usart.h"
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#define RS_Pin GPIO_Pin_0
#define RW_Pin GPIO_Pin_1
#define E_Pin GPIO_Pin_2
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//配置RS RW E引脚
GPIO_InitStructure.GPIO_Pin = RS_Pin | RW_Pin | E_Pin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//配置D0-D7引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 |
GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void LCD_Init(void)
{
GPIO_SetBits(GPIOA, RW_Pin); //RW = 1
GPIO_SetBits(GPIOA, E_Pin); //E = 1
Delay(20); //延时等待>
GPIO_SetBits(GPIOA, RS_Pin); //RS = 1
GPIO_ResetBits(GPIOB, GPIO_Pin_13); //D7 = 0
GPIO_ResetBits(GPIOB, GPIO_Pin_12); //D6 = 0
GPIO_ResetBits(GPIOB, GPIO_Pin_11); //D5 = 0
GPIO_ResetBits(GPIOB, GPIO_Pin_10); //D4 = 0
GPIO_ResetBits(GPIOA, E_Pin); //E = 0
Delay(20); //延时等待>
GPIO_SetBits(GPIOA, E_Pin); //E = 1
GPIO_SetBits(GPIOB, GPIO_Pin_10); //D4 = 1
GPIO_ResetBits(GPIOA, E_Pin); //E = 0
Delay(10); //延时等待>
//执行显控函数场
//清屏函数
}
void LCD_WriteCmd(uint8_t cmd)
{
GPIO_ResetBits(GPIOA, RW_Pin); //RW = 0
GPIO_ResetBits(GPIOA, RS_Pin); //RS = 0
GPIOB->ODR = (GPIOB->ODR&0x00FF) | (cmd<<8);
GPIO_SetBits(GPIOA, E_Pin); //E = 1
GPIO_ResetBits(GPIOA, E_Pin); //E = 0
Delay(10); //延时等待>
}
void LCD_WriteData(uint8_t data)
{
GPIO_ResetBits(GPIOA, RW_Pin); //RW = 0
GPIO_SetBits(GPIOA, RS_Pin); //RS = 1
GPIOB->ODR = (GPIOB->ODR&0x00FF) | (data<<8);
GPIO_SetBits(GPIOA, E_Pin); //E = 1
GPIO_ResetBits(GPIOA, E_Pin); //E = 0
Delay(10); //延时等待>
}
void LCD_Clear(void)
{
LCD_WriteCmd(0x01);
Delay(10); //延时等待>
}
void LCD_SetCursor(uint8_t row, uint8_t col)
{
uint8_t addr = 0x80;
if(row == 0) addr += col;
else if(row == 1) addr += col + 0x40;
LCD_WriteCmd(addr);
}
void LCD_WriteString(uint8_t row, uint8_t col, char* str)
{
LCD_SetCursor(row, col);
while(*str)
{
LCD_WriteData(*str++);
}
}
int main(void)
{
RCC_Configuration();
GPIO_Configuration();
LCD_Init();
LCD_WriteString(0, 0, "Hello, World!");
while(1)
{
}
}
以下是使用OLED的代码:
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "OLEDFont.h"
#include "OLED.h"
int main(void)
{
OLED_Init();
OLED_Clear();
OLED_ShowCHinese(0, 0, 0, 1);//显示中文“姓”
OLED_ShowCHinese(18, 0, 1, 2);//显示中文“名”
OLED_ShowString(1, 0, "Hello, World!");
while(1)
{
}
}