显示屏的驱动代码一般商家会提供一个Demo,你需要了解的时屏的驱动芯片,以及片选信号有效电平、字符传输方式(从低至高,还是从高至低)。当然也可通过分析Demo了解该信息。
跳线
以下是我做试验时,树莓派和LCD连线:
/*LCD SPI0接口
* GND 电源地
* VCC 3.3v电源
* D0 wPi14(SCLK) /Label:LCD_D0
* D1 wPi12(MOSI) /Label:LCD_D1
* RES wPi21 /Label:LCD_RES
* DC wPi22 /Label:LCD_DC
* CS wPi10(CE0) /Label:LCD_CS
* BLK wPi24 /Label:LCD_BLK 背光控制
* MISO NC 不接
*/
SPI输出参数设置
我试验用的LCD,片选信号为低电平有效,字符传输方式为从高到低(MSB)。
static int SPI_FD;
static const char *device = "/dev/spidev0.0";
static uint32_t mode = 0;
static uint8_t bits = 8;
static uint32_t speed = 500000; //500KHz
......
void LCD_Writ_Bus(uint8_t *dat,uint16_t size)
{
write(SPI_FD, dat, size);
}
......
int main()
{
mode = SPI_MODE_0 | SPI_LOOP;
wiringPiSetup();
pinMode(21,OUTPUT);
pinMode(22,OUTPUT);
pinMode(24,OUTPUT);
SPI_FD = open(device, O_WRONLY);
if(SPI_FD < 0)
printf("open SPI Err!rn");
ioctl(SPI_FD, SPI_IOC_WR_MODE, &mode);
ioctl(SPI_FD, SPI_IOC_WR_BITS_PER_WORD, &bits);
ioctl(SPI_FD, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
printf("Ready!rn");
LCD_Init();
LCD_Area_Clear(0,0,200,200,BLUE);
Draw_Circle(200,100,20,RED);
LCD_ShowString(200,20,"Hello,World!",WHITE);
LCD_ShowPicture(0,0,200,200);
close(SPI_FD);
}
编译和执行
因wiringPi在初始化时需要root权限,可将应用程序归属root:root,并设置s位,其他用户均可执行。
sudo gcc -o lcd lcd.c -lwiringPi
sudo chmod u+s lcd
./lcd
[1]
参考
- ^树莓派之SPI编程 https://zhuanlan.zhihu.com/p/256140781