#include <bcm2835.h>
#include <stdio.h>
#define D0 6
#define D1 5
#define D2 13
#define D3 19
#define D4 26
#define D5 21
#define D6 20
#define D7 16
#define RS 17
#define RW 27
#define E 22
int data_pin[]={D0,D1,D2,D3,D4,D5,D6,D7};
char lcdbuf[]={"hello Raspberry!"};
#define LEAVE_CHAR (16-(sizeof(lcdbuf)-1))
void display_string(int x,int y,char *s);
void display_xy(int x,int y);
void lcd_dataWrite(char data);
void WriteDatalcd(char Wdata);
void lcd_init(void);
void WriteCommandlcd(char Wdata);
void gpio_init(void);
void display_char(int x,int y,char s);
void move_display(void);
int main(int argc, char **argv)
{
if (!bcm2835_init())return 1;
gpio_init();
lcd_init();
while(1)
{
WriteCommandlcd(0x01);//clear screen
move_display();
bcm2835_delay(500);
}
bcm2835_close();
return 0;
}
void lcd_init(void)
{
bcm2835_delay(10);
WriteCommandlcd(0x38);
bcm2835_delay(10);
WriteCommandlcd(0x38);
bcm2835_delay(10);
WriteCommandlcd(0x38);
bcm2835_delay(10);
WriteCommandlcd(0x06);//
bcm2835_delay(10);
WriteCommandlcd(0x0c);
bcm2835_delay(10);
WriteCommandlcd(0x01);
}
void WriteCommandlcd(char Wdata)//write command to LCD
{
bcm2835_gpio_write(RS, LOW);
bcm2835_gpio_write(RW, LOW);
bcm2835_gpio_write(E, HIGH);
lcd_dataWrite(Wdata);
bcm2835_delay(10);
bcm2835_gpio_write(E,LOW);
}
void WriteDatalcd(char Wdata)//write date to LCD
{
bcm2835_gpio_write(RS, HIGH);
bcm2835_gpio_write(RW, LOW);
bcm2835_gpio_write(E, HIGH);
lcd_dataWrite(Wdata);
bcm2835_delay(10);
bcm2835_gpio_write(E, LOW);
}
void lcd_dataWrite(char data)//write date to D0~D7
{
int i,move=0x80;
for(i = 7; i >=0; i--)
{
if(data&move)
{
bcm2835_gpio_write(data_pin[i], HIGH);
//printf("1");
}
else
{
bcm2835_gpio_write(data_pin[i], LOW);
//printf("0");
}
move=move>>1;
}
// printf("\r\n");
}
void display_xy(int x,int y)//set start location
{
if(y==1)
x+=0x40;
x+=0x80;
WriteCommandlcd(x);
}
void display_string(int x,int y,char *s)//display string
{
display_xy(x,y);
while(*s)
{
WriteDatalcd(*s);
s++;
}
}
void display_char(int x,int y,char s)//display single char
{
display_xy(x,y);
WriteDatalcd(s);
}
void gpio_init(void)
{
int i=8;
while(i--)
{
bcm2835_gpio_fsel(data_pin[i], BCM2835_GPIO_FSEL_OUTP);
}
bcm2835_gpio_fsel(RS, BCM2835_GPIO_FSEL_OUTP);
bcm2835_gpio_fsel(E, BCM2835_GPIO_FSEL_OUTP);
bcm2835_gpio_fsel(RW, BCM2835_GPIO_FSEL_OUTP);
}
void move_display(void)//word move display
{
static int x=0,y=0,i;
if(x>=16&&y==0)
{
y=1;
x=0;
}
else if(x>=16&&y==1)
{
y=0;
x=0;
}
if(x>=LEAVE_CHAR&&y==0)
{
i=0;
while(i<(x-LEAVE_CHAR))
{
display_char(i,1,lcdbuf[(sizeof(lcdbuf)-1)-(x-LEAVE_CHAR)+i]);
i++;
}
}
if(x>=LEAVE_CHAR&&y==1)
{
i=0;
while(i<(x-LEAVE_CHAR))
{
display_char(i,0,lcdbuf[(sizeof(lcdbuf)-1)-(x-LEAVE_CHAR)+i]);
i++;
}
}
display_string(x,y,lcdbuf);
x++;
}
Comments