接口STM32f4与LCD16x2

时间:2017-11-06 09:21:32

标签: c stm32

我用LCD 16x2文本编写程序接口STM32F411vet6但是当我将代码传送到套件时它不能运行。有人可以检查我的代码并找到错误吗?非常感谢你!

描述:

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

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

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

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

Code 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):延迟微秒   void DelayMilis(uint32_t timer):延迟mili秒

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--);
    }
}

我搜索了互联网,但我找不到原因。我是新手。

谢谢!祝你有愉快的一天!

1 个答案:

答案 0 :(得分:0)

你检查了对比度吗?

请记住,LCD 16x2有一个可调节对比度的引脚(引脚3)。您应该将此引脚的电压在0到Vcc之间变化,直到您在液晶显示屏上看到某些内容。

Othewise ...

如果不是这种情况,那么在使用经典的16x2 LCD时会出现很多问题。引脚接触不良,Vcc不足,时序错误或设置正确的位。如果没有董事会,很难说清楚。我不得不把头撞到墙上好几天让它第一次工作,而这不是第一次尝试。祝你好运。