Raspberry PI的C程序,HD44780 LCD没有初始化显示

时间:2014-08-26 20:39:34

标签: c linux raspberry-pi

我一直在编写一个程序,用于连接覆盆子pi和HD44780 LCD。

我编写的代码似乎没有初始化显示,从数据表中可以看出我正在做正确的过程。

我知道代码不是很好,但我只是专注于让它工作,然后整理它等等。这是为了帮助我学习C.我正在使用mikem的bcm2835库。

代码如下:

#include <stdio.h>
#include <bcm2835.h>

#define RS RPI_GPIO_P1_26 //GPIO 7
#define En RPI_GPIO_P1_24 //GPIO 8
#define D4 RPI_GPIO_P1_11 //GPIO 17
#define D5 RPI_GPIO_P1_12 //GPIO 18
#define D6 RPI_GPIO_P1_13 //GPIO 27
#define D7 RPI_GPIO_P1_15 //GPIO 22

#define FUNC_4b_2L_5X8 0x28
#define DISP_ON_CURS_ON_BLINK_OFF 0x0E
#define INC_ON_SHIFT_OFF 0x06
#define CNTRL_LINES_LOW 0xFFF8
#define CURS_LEFT 0x10
#define CURS_RIGHT 0x14
#define CLR_DISP 0x01
#define SHIFT_LEFT 0x18
#define SHIFT_RIGHT 0x1C
#define ROW_0_START 0x80
#define ROW_1_START 0xC0
#define RETURN_HOME 0x2



void lcd_gpio_low(void)
{
    bcm2835_gpio_write(RS, LOW);
    bcm2835_gpio_write(En, LOW);
    bcm2835_gpio_write(D4, LOW);
    bcm2835_gpio_write(D5, LOW);
    bcm2835_gpio_write(D6, LOW);
    bcm2835_gpio_write(D7, LOW);
}

void assign_bits(uint8_t data)
{
    switch(data)
    {
        case 0:
            bcm2835_gpio_write(D4, LOW);
            bcm2835_gpio_write(D5, LOW);
            bcm2835_gpio_write(D6, LOW);
            bcm2835_gpio_write(D7, LOW);
            break;

        case 1:
            bcm2835_gpio_write(D4, HIGH);
            bcm2835_gpio_write(D5, LOW);
            bcm2835_gpio_write(D6, LOW);
            bcm2835_gpio_write(D7, LOW);
            break;

        case 2:
            bcm2835_gpio_write(D4, LOW);
            bcm2835_gpio_write(D5, HIGH);
            bcm2835_gpio_write(D6, LOW);
            bcm2835_gpio_write(D7, LOW);
            break;

        case 3:
            bcm2835_gpio_write(D4, HIGH);
            bcm2835_gpio_write(D5, HIGH);
            bcm2835_gpio_write(D6, LOW);
            bcm2835_gpio_write(D7, LOW);
            break;

        case 4:
            bcm2835_gpio_write(D4, LOW);
            bcm2835_gpio_write(D5, LOW);
            bcm2835_gpio_write(D6, HIGH);
            bcm2835_gpio_write(D7, LOW);
            break;

        case 5:
            bcm2835_gpio_write(D4, HIGH);
            bcm2835_gpio_write(D5, LOW);
            bcm2835_gpio_write(D6, HIGH);
            bcm2835_gpio_write(D7, LOW);
            break;

        case 6:
            bcm2835_gpio_write(D4, LOW);
            bcm2835_gpio_write(D5, HIGH);
            bcm2835_gpio_write(D6, HIGH);
            bcm2835_gpio_write(D7, LOW);
            break;

        case 7:
            bcm2835_gpio_write(D4, HIGH);
            bcm2835_gpio_write(D5, HIGH);
            bcm2835_gpio_write(D6, HIGH);
            bcm2835_gpio_write(D7, LOW);
            break;

        case 8:
            bcm2835_gpio_write(D4, LOW);
            bcm2835_gpio_write(D5, LOW);
            bcm2835_gpio_write(D6, LOW);
            bcm2835_gpio_write(D7, HIGH);
            break;

        case 9:
            bcm2835_gpio_write(D4, HIGH);
            bcm2835_gpio_write(D5, LOW);
            bcm2835_gpio_write(D6, LOW);
            bcm2835_gpio_write(D7, HIGH);
            break;

        case 10:
            bcm2835_gpio_write(D4, LOW);
            bcm2835_gpio_write(D5, HIGH);
            bcm2835_gpio_write(D6, LOW);
            bcm2835_gpio_write(D7, HIGH);
            break;

        case 11:
            bcm2835_gpio_write(D4, HIGH);
            bcm2835_gpio_write(D5, HIGH);
            bcm2835_gpio_write(D6, LOW);
            bcm2835_gpio_write(D7, HIGH);
            break;

        case 12:
            bcm2835_gpio_write(D4, LOW);
            bcm2835_gpio_write(D5, LOW);
            bcm2835_gpio_write(D6, HIGH);
            bcm2835_gpio_write(D7, HIGH);
            break;

        case 13:
            bcm2835_gpio_write(D4, HIGH);
            bcm2835_gpio_write(D5, LOW);
            bcm2835_gpio_write(D6, HIGH);
            bcm2835_gpio_write(D7, HIGH);
            break;

        case 14:
            bcm2835_gpio_write(D4, LOW);
            bcm2835_gpio_write(D5, HIGH);
            bcm2835_gpio_write(D6, HIGH);
            bcm2835_gpio_write(D7, HIGH);
            break;

        case 15:
            bcm2835_gpio_write(D4, HIGH);
            bcm2835_gpio_write(D5, HIGH);
            bcm2835_gpio_write(D6, HIGH);
            bcm2835_gpio_write(D7, HIGH);
            break;
    }
}

void pulse_enable_line(void)
{
    bcm2835_gpio_write(En, HIGH);
    bcm2835_delayMicroseconds(1);

    bcm2835_gpio_write(En, LOW);
    bcm2835_delayMicroseconds(1);
}

void send_nyble(uint8_t data)
{
    assign_bits(data);
    bcm2835_delayMicroseconds(10);

    pulse_enable_line();
}

void send_byte(uint8_t data)
{
    send_nyble(data >> 4);
    bcm2835_delayMicroseconds(10);

    send_nyble(data & 0x0F);
    bcm2835_delayMicroseconds(10);
}

void write_inst(uint8_t data)
{
    lcd_gpio_low();
    bcm2835_delayMicroseconds(1);
    send_byte(data);
    bcm2835_delayMicroseconds(10);
}

void clear_disp(void)
{
    // Clear display
    write_inst(CLR_DISP);
    bcm2835_delayMicroseconds(40);
}

void write_data(uint8_t data)
{
    bcm2835_gpio_write(RS, HIGH);
    send_byte(data);
    bcm2835_delay(5);
    bcm2835_gpio_write(RS, LOW);
}

// Displays character, pass in a character 
void disp_char(char *text)
{
    // Set all outputs to 0
    lcd_gpio_low();
    // Set RS to 1
    bcm2835_gpio_write(RS, HIGH);
    bcm2835_delayMicroseconds(1);
    // Set the passed in value 
    send_byte(*text);
    bcm2835_delayMicroseconds(40);
    // Set all outputs to 0
    lcd_gpio_low();
    bcm2835_delayMicroseconds(40); 
}



void lcd_init(void)
{
    //Set lines as outputs
    bcm2835_gpio_fsel(RS, BCM2835_GPIO_FSEL_OUTP);
    bcm2835_gpio_fsel(En, BCM2835_GPIO_FSEL_OUTP);
    bcm2835_gpio_fsel(D4, BCM2835_GPIO_FSEL_OUTP);
    bcm2835_gpio_fsel(D5, BCM2835_GPIO_FSEL_OUTP);
    bcm2835_gpio_fsel(D6, BCM2835_GPIO_FSEL_OUTP);
    bcm2835_gpio_fsel(D7, BCM2835_GPIO_FSEL_OUTP);

    lcd_gpio_low();

    bcm2835_delay(42);


    // Send function set data as 8 bits, 2 lines and 5x8
    write_inst(FUNC_4b_2L_5X8);

    bcm2835_delay(5);

    // Send function set data as 8 bits, 2 lines and 5x8
    write_inst(FUNC_4b_2L_5X8);

    bcm2835_delayMicroseconds(110);

    // Send function set data as 8 bits, 2 lines and 5x8
    write_inst(FUNC_4b_2L_5X8);
    bcm2835_delayMicroseconds(40);

    // Send function set data as 8 bits, 2 lines and 5x8
    write_inst(FUNC_4b_2L_5X8);
    bcm2835_delayMicroseconds(40);

    // Send Display control. Disp on, cursor on and blinking off
    write_inst(DISP_ON_CURS_ON_BLINK_OFF);
    bcm2835_delayMicroseconds(40);

    // Send Entry mode set. Increment on, shift off
    write_inst(INC_ON_SHIFT_OFF);
    bcm2835_delayMicroseconds(40);

    // Clear Display
    clear_disp();
}

int main()
{
    //bcm2835_set_debug(1);

    if (!bcm2835_init())
        return 1;

    lcd_init();

    write_data(0x48);

    printf("%d",'F');

    bcm2835_delay(10000);

    return 0;
}

0 个答案:

没有答案