gpt4 book ai didi

c - 带 LCD16x2 的 STM32f4 接口(interface)

转载 作者:行者123 更新时间:2023-11-30 16:39:13 24 4
gpt4 key购买 nike

我使用 LCD 16x2 文本编写程序接口(interface) STM32F411vet6,但是当我将代码交付给套件时,它无法运行。有人可以检查我的代码并发现错误吗?非常感谢!

描述:

  • void ENEable(void):WAITING微秒到RS引脚可以接收命令。

  • void WriteNibble(int8_t data, int8_t flag):写入高半字节(flag =0) 和低半字节(flag = 1)

  • void LCDCmd(int8_t cmd):需要 KIT 运行命令

  • void LCDInit(void):初始化LCD。

代码 LCD 16x2:

void ENEable(void)
{
HIGH_PIN(EN_PIN);
DelayMicros(5);
LOW_PIN(EN_PIN);
DelayMicros(100);
}

void WriteNibble(int8_t data, int8_t flag)
{
flag = 4 * flag;
if(data & (0x80 >> flag))
{
HIGH_PIN(D7_PIN);
}
else
{
LOW_PIN(D7_PIN);
}

if(data & (0x40 >> flag))
{
HIGH_PIN(D6_PIN);
}
else
{
LOW_PIN(D6_PIN);
}

if(data & (0x20 >> flag))
{
HIGH_PIN(D5_PIN);
}
else
{
LOW_PIN(D5_PIN);
}

if(data & (0x10 >> flag))
{
HIGH_PIN(D4_PIN);
}
else
{
LOW_PIN(D4_PIN);
}
}

void LCDCmd(int8_t cmd)
{
LOW_PIN(RS_PIN);
DelayMicros(100);

WriteNibble(cmd, 0);
ENEable();
WriteNibble(cmd, 1);
ENEable();

switch(cmd){
case 0x01:
case 0x02:
DelayMilis(2);
DelayMicros(250);
break;
default:
DelayMicros(53);
break;
}
}

void LCDInit(void)
{
DelayMilis(15);

LCDCmd(0x03);
ENEable();

DelayMilis(4); //delay 4.1 milisencond
DelayMicros(100);

LCDCmd(0x03);
ENEable();
DelayMicros(100); //delay 100 microsecond

LCDCmd(0x03);
ENEable();
DelayMicros(100); //delay 100 microsecond

LCDCmd(0x02);
ENEable();
DelayMicros(100); //delay 100 microsecond

LCDCmd(0x28); // use control: 4 bit, 2 line, 5x8;
LCDCmd(0x0F); // turn on display, setting, cusor blink
LCDCmd(0x01); // clear lcd
LCDCmd(0x06); // set entry mode
}

void SendData(int8_t data)
{
HIGH_PIN(RS_PIN);
DelayMicros(5);

WriteNibble(data, 0);
ENEable();
WriteNibble(data, 1);
ENEable();
}

延迟功能:

描述:

void DelayMicros(uint32_t timer): Delay micro second
void DelayMilis(uint32_t timer): Delay mili second

void DelayMicros(uint32_t timer)
{
uint32_t count = 0;

while(timer--)
{
count = SystemCoreClock / 1000 / 1000 / 4;
while(count--);
}
}

void DelayMilis(uint32_t timer)
{
uint32_t count = 0;

while(timer--)
{
count = SystemCoreClock / 1000 / 4;
while(count--);
}
}

网上查了也没找到原因。我是新手。

谢谢!祝你有美好的一天!

最佳答案

你检查过对比度吗?

请记住,LCD 16x2 有一个用于调整对比度的引脚(引脚 3)。您应该在 0 到 Vcc 之间改变该引脚的电压,直到您在 LCD 上看到某些内容。

否则...

如果情况并非如此,那么在经典 16x2 LCD 上工作时可能会出现很多问题。引脚接触不良、Vcc 不足、时序错误或要设置的正确位。手里没有板子很难说。我不得不用头撞墙好几天才能让它第一次工作,而且这不是第一次尝试。祝你好运。

关于c - 带 LCD16x2 的 STM32f4 接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47133487/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com