16.【linux驱动】spi驱动TFT液晶屏

代码

液晶屏型号:ILI9488
液晶屏操作直接由原厂代码更改了一下得来。

#include <stdio.h>
#include <linux/ioctl.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <fcntl.h>
#include <unistd.h>
#include "main.h"

int fd_spi;	//spi
int fd_cs;	//cd
int fd_rs;	//数据/指令切换
int fd_re;	//复位

_lcd_dev lcddev;


void LCD_WR_REG(unsigned char Reg)
{
	char data[] = {
		Reg
	};
	write(fd_rs,"0",1);
	write(fd_cs,"0",1);
	write(fd_spi,data,1);
	write(fd_cs,"1",1);
}

 void LCD_WR_DATA(unsigned char Data)
{
	char data[] = {
		Data
	};
	write(fd_rs,"1",1);
	write(fd_cs,"0",1);
	write(fd_spi,data,1);
	write(fd_cs,"1",1);
}

void LCD_WRITE_DATA(unsigned char * data,int count)
{
	write(fd_rs,"1",1);
	write(fd_cs,"0",1);
	write(fd_spi,data,count);
	write(fd_cs,"1",1);
}

void LCD_WR_DATA_16Bit(unsigned short Data)
{	
  //18Bit
	LCD_WR_DATA((Data>>8)&0xF8);//RED
	LCD_WR_DATA((Data>>3)&0xFC);//GREEN
	LCD_WR_DATA(Data<<3);//BLUE
}

void LCD_WriteReg(unsigned char LCD_Reg, unsigned char LCD_RegValue)
{
  LCD_WR_REG(LCD_Reg);
	LCD_WR_DATA(LCD_RegValue);
}

void LCD_WriteRAM_Prepare(void)
{
 	LCD_WR_REG(lcddev.wramcmd);	  
}

void LCD_SetWindows(unsigned short xStar, unsigned short yStar,unsigned short xEnd,unsigned short yEnd)
{	
	LCD_WR_REG(lcddev.setxcmd);	
	LCD_WR_DATA(xStar>>8);
	LCD_WR_DATA(0x00FF&xStar);		
	LCD_WR_DATA(xEnd>>8);
	LCD_WR_DATA(0x00FF&xEnd);

	LCD_WR_REG(lcddev.setycmd);	
	LCD_WR_DATA(yStar>>8);
	LCD_WR_DATA(0x00FF&yStar);		
	LCD_WR_DATA(yEnd>>8);
	LCD_WR_DATA(0x00FF&yEnd);	

	LCD_WriteRAM_Prepare();	//开始写入GRAM		
}

void LCD_Clear(unsigned short Color)
{
	unsigned int i,j;
	unsigned char data[lcddev.width * lcddev.height * 3];
	LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);	
	for(i=0;i<lcddev.width * lcddev.height;i++)
	{
			 data[i * 3] = (Color>>8)&0xF8;
			 data[i * 3 + 1] = (Color>>3)&0xFC;
			 data[i * 3 + 2] = (Color<<3);
	}
	LCD_WRITE_DATA(data, lcddev.width * lcddev.height * 3);
}

void LCD_DrawPoint(unsigned short x,unsigned short y)
{
	LCD_SetWindows(x,y,x,y);//设置光标位置 
	LCD_WR_DATA(POINT_COLOR); 	    
} 	 

void LCD_SetCursor(unsigned short Xpos, unsigned short Ypos)
{	  	    			
	LCD_SetWindows(Xpos,Ypos,Xpos,Ypos);	
} 

void LCD_direction(unsigned char direction)
{ 
			lcddev.setxcmd=0x2A;
			lcddev.setycmd=0x2B;
			lcddev.wramcmd=0x2C;
	switch(direction){		  
		case 0:						 	 		
			lcddev.width=LCD_W;
			lcddev.height=LCD_H;		
			LCD_WriteReg(0x36,(1<<3)|(0<<6)|(0<<7));//BGR==1,MY==0,MX==0,MV==0
		break;
		case 1:
			lcddev.width=LCD_H;
			lcddev.height=LCD_W;
			LCD_WriteReg(0x36,(1<<3)|(0<<7)|(1<<6)|(1<<5));//BGR==1,MY==1,MX==0,MV==1
		break;
		case 2:						 	 		
			lcddev.width=LCD_W;
			lcddev.height=LCD_H;	
			LCD_WriteReg(0x36,(1<<3)|(1<<6)|(1<<7));//BGR==1,MY==0,MX==0,MV==0
		break;
		case 3:
			lcddev.width=LCD_H;
			lcddev.height=LCD_W;
			LCD_WriteReg(0x36,(1<<3)|(1<<7)|(1<<5));//BGR==1,MY==1,MX==0,MV==1
		break;	
		default:break;
	}		
	
}	 


void LCD_Reset(void)
{
	write(fd_re,"1",1);
	sleep(0.2);
	write(fd_re,"0",1);
	sleep(0.3);
	write(fd_re,"1",1);
	sleep(0.2);
}

void LCD_Init(void)
{
	LCD_Reset(); //初始化之前复位
//************* ILI9488初始化**********//	
	LCD_WR_REG(0XF7);
	LCD_WR_DATA(0xA9);
	LCD_WR_DATA(0x51);
	LCD_WR_DATA(0x2C);
	LCD_WR_DATA(0x82);
	LCD_WR_REG(0xC0);
	LCD_WR_DATA(0x11);
	LCD_WR_DATA(0x09);
	LCD_WR_REG(0xC1);
	LCD_WR_DATA(0x41);
	LCD_WR_REG(0XC5);
	LCD_WR_DATA(0x00);
	LCD_WR_DATA(0x0A);
	LCD_WR_DATA(0x80);
	LCD_WR_REG(0xB1);
	LCD_WR_DATA(0xB0);
	LCD_WR_DATA(0x11);
	LCD_WR_REG(0xB4);
	LCD_WR_DATA(0x02);
	LCD_WR_REG(0xB6);
	LCD_WR_DATA(0x02);
	LCD_WR_DATA(0x42);
	LCD_WR_REG(0xB7);
	LCD_WR_DATA(0xc6);
	LCD_WR_REG(0xBE);
	LCD_WR_DATA(0x00);
	LCD_WR_DATA(0x04);
	LCD_WR_REG(0xE9);
	LCD_WR_DATA(0x00);
	LCD_WR_REG(0x36);
	LCD_WR_DATA((1<<3)|(0<<7)|(1<<6)|(1<<5));
	LCD_WR_REG(0x3A);
	LCD_WR_DATA(0x66);
	LCD_WR_REG(0xE0);
	LCD_WR_DATA(0x00);
	LCD_WR_DATA(0x07);
	LCD_WR_DATA(0x10);
	LCD_WR_DATA(0x09);
	LCD_WR_DATA(0x17);
	LCD_WR_DATA(0x0B);
	LCD_WR_DATA(0x41);
	LCD_WR_DATA(0x89);
	LCD_WR_DATA(0x4B);
	LCD_WR_DATA(0x0A);
	LCD_WR_DATA(0x0C);
	LCD_WR_DATA(0x0E);
	LCD_WR_DATA(0x18);
	LCD_WR_DATA(0x1B);
	LCD_WR_DATA(0x0F);
	LCD_WR_REG(0XE1);
	LCD_WR_DATA(0x00);
	LCD_WR_DATA(0x17);
	LCD_WR_DATA(0x1A);
	LCD_WR_DATA(0x04);
	LCD_WR_DATA(0x0E);
	LCD_WR_DATA(0x06);
	LCD_WR_DATA(0x2F);
	LCD_WR_DATA(0x45);
	LCD_WR_DATA(0x43);
	LCD_WR_DATA(0x02);
	LCD_WR_DATA(0x0A);
	LCD_WR_DATA(0x09);
	LCD_WR_DATA(0x32);
	LCD_WR_DATA(0x36);
	LCD_WR_DATA(0x0F);
	LCD_WR_REG(0x11);
	sleep(0.2);
	LCD_WR_REG(0x29);

	//设置LCD属性参数
	LCD_direction(USE_HORIZONTAL);//设置LCD显示方向
}

int export_gpio(int no){
	char cmd[100];
	int ret = 0;
	sprintf(cmd,"echo %d > /sys/class/gpio/export",no);
	ret = system(cmd);
	if(ret != 0) return ret;
	sprintf(cmd,"echo out > /sys/class/gpio/gpio%d/direction",no);
	ret = system(cmd);
	return ret;
}

int init_cs(void)
{
	return export_gpio(68);
}

int init_rs(void)
{
	return export_gpio(71);
}

int init_re(void)
{
	return export_gpio(72);
}

int main(){
	int ret,cmd,i;
	if(access(CS_GPIO,F_OK) == -1){
		ret = init_cs();
	}
	if(ret != 0){
		perror("export gpio 68 error");
		return ret;
	}
	if(access(RS_GPIO,F_OK) == -1){
		ret = init_rs();
	}
	if(ret != 0){
		perror("export gpio 71 error");
		return ret;
	}
	if(access(RE_GPIO,F_OK) == -1){
		ret = init_re();
	}
	if(ret != 0){
		perror("export gpio 72 error");
		return ret;
	}

	fd_rs = open(RS_GPIO,O_RDWR);
	ret = fd_rs;
	if(ret < 0){
		perror("open");
		return ret;
	}
	fd_cs = open(CS_GPIO,O_RDWR);
	ret = fd_cs;
	if(ret < 0){
		perror("open");
		return ret;
	}
	fd_re = open(RE_GPIO,O_RDWR);
	ret = fd_re;
	if(ret < 0){
		perror("open");
		return ret;
	}

	fd_spi = open("/dev/char_test_dev_1",O_RDWR);
	ret = fd_spi;
	if(ret < 0){
		perror("open /dev/char_test_dev_1 error");
		return ret;
	}
	LCD_Init();
	for (i = 0; i < 1; ++i)
	{
		LCD_Clear(RED);sleep(1);
		LCD_Clear(GREEN);sleep(1);
		LCD_Clear(BLUE);sleep(1);
	}
	close(fd_rs);
	close(fd_cs);
	close(fd_spi);
	return 0;
}
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值