我一直在编写一个程序,用于连接覆盆子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;
}