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);
}