嵌入式学习之lcd模块:ILI9341

1.要明确一件事,命令与该命令要写入的寄存器的地址相同,如:
在这里插入图片描述往地址为2A的寄存器写入2A之后就开启了列地址的设置,后面再写入数据就是设置相应的参数。当然了怎样识别你输入的是数据还是命令呢?就是通过总线RS来控制。
2.实现要点:
(1)七个最底层的函数:
在这里插入图片描述用相应的I口模拟时序实现数据或命令的读写
(2)初始化IO口以及lcd的初始化(厂家提供)

void LCD_Init(void)

(3)基本的应用函数(一级函数):

//设置光标位置
void LCD_SetCursor(u16 Xpos, u16 Ypos)
//设置窗口,并自动设置画点坐标到窗口左上角(sx,sy).
void LCD_Set_Window(u16 sx,u16 sy,u16 width,u16 height)
//快速画点,一般用这个(这个很常用,所有显示不都得画点嘛)
void LCD_Fast_DrawPoint(u16 x,u16 y,u16 color)
//读取个某点的颜色值
u16 LCD_ReadPoint(u16 x,u16 y)
//设置光标位置
void LCD_SetCursor(u16 Xpos, u16 Ypos)

LCD_ReadPoint()调用LCD_SetCursor()去设置要读的点的坐标,当然其他地方也有调用。
而且这个LCD_ReadPoint()里面也有道道,他是把RGB分开之后重新组出来的。因为一次读取只能读到RG,B在另一个参数中
在这里插入图片描述(4)上层调用函数(二级函数)
一个汉字显示的程序:用数组存储相应汉字对应的索引,然后根据索引显示相应的汉字。

void LCD_ShowChinese(u16 x,u16 y,u8 size,u8 mode,u8 *p)
{
    
    
	u8 *array;
	u8 i=0,k=0;
	array =(u8*)malloc(10*sizeof(u8));
	while(*p!='\0')
	{
    
    
		if((cfont16[i].Index[0]==*p)&&(cfont16[i].Index[1]==*(p+1)))
		{
    
    
			array[k]=cfont16[i].number;
			k++;
			p+=2;
		}
		i++;
	}
	num=k;
	for (i=0;i<k;i++)
	printf("%d",array[i]);
  LCD_ShowChinese(x,y,size,mode,array);
}
void LCD_ShowCChar(u16 x,u16 y,u8 size,u8 mode,u8 *array)
{
    
             
	u8 temp,t,t1;
	u8 i=0;
	u16 y0=y;
	u8 *dzk;
	u8 csize=(size/8+((size%8)?1:0))*(size);			//得到字体一个字符对应点阵集所占的字节数	 
	if(size!=12&&size!=16&&size!=24&&size!=32)return;	//不支持的size
	for(i = 0;i<num;i++)
	{
    
    
			dzk=(u8*)asc2_1616[array[i]];
		for(t=0;t<csize;t++)
		{
    
       												   
			temp=dzk[t];			//得到点阵数据                          
			for(t1=0;t1<8;t1++)
			{
    
    
				if(temp&0x80)LCD_Fast_DrawPoint(x,y,POINT_COLOR);
				else if(mode==0)LCD_Fast_DrawPoint(x,y,BACK_COLOR); 
				temp<<=1;
				y++;
				if((y-y0)==size)
				{
    
    
					y=y0;
					x++;
					break;
				}
			}  	 
		} 
		x+=5;
	}
 free(array);
}

猜你喜欢

转载自blog.csdn.net/weixin_44142774/article/details/106180340
今日推荐