`阿波罗STM32F767 的LCD 是一块RGB 的屏。 对于这块屏,从原理图上看,使用的是RGB565彩色模式, 即一个像素占两个字节。
液晶屏的驱动使用了LTD和SDRAM。 LCD的缓冲是在SDRAM中,定义的位置是
- #define LCD_FRAME_BUF_ADDR 0XC0000000
复制代码
并使用如下的语句进行定义,不知道在AC6中这样的定义是如何实现的,在类似的Eclipse类的DSP的CCS中,是定义在cmd文件中,而在Keil则是用__attribute__(如下图)。
对于LCD的配置则是在函数LCD_Init中,除了外设的初始化,对于LCD的配置主要要看数据手册了,一些参数要对应的。这里不再赘述,可能参考下程序,这里要说的是几个重要的函数,画点,画线,填充,这几个函数在之后使用GUI时是比较重要的函数。
- //画点
- void LCD_DrawPoint(u16 x,u16 y)
- {
- if(lcdltdc.pwidth!=0)//Èç¹ûÊÇRGBÆÁ
- {
- LTDC_Draw_Point(x,y,POINT_COLOR);
- }else
- {
- LCD_SetCursor(x,y); //ÉèÖùâ±êλÖÃ
- LCD_WriteRAM_Prepare(); //¿ªÊ¼Ð´ÈëGRAM
- LCD->LCD_RAM=POINT_COLOR;
- }
- }
- //画线
- void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2)
- {
- u16 t;
- int xerr=0,yerr=0,delta_x,delta_y,distance;
- int incx,incy,uRow,uCol;
- delta_x=x2-x1; //¼ÆËã×ø±êÔöÁ¿
- delta_y=y2-y1;
- uRow=x1;
- uCol=y1;
- if(delta_x>0)incx=1; //ÉèÖõ¥²½•½Ïò
- else if(delta_x==0)incx=0;//´¹Ö±Ïß
- else {incx=-1;delta_x=-delta_x;}
- if(delta_y>0)incy=1;
- else if(delta_y==0)incy=0;//ˮƽÏß
- else{incy=-1;delta_y=-delta_y;}
- if( delta_x>delta_y)distance=delta_x; //Ñ¡È¡»ù±¾ÔöÁ¿×ø±êÖá
- else distance=delta_y;
- for(t=0;t<=distance+1;t++ )//»ÏßÊä³ö
- {
- LCD_DrawPoint(uRow,uCol);//»µã
- xerr+=delta_x ;
- yerr+=delta_y ;
- if(xerr>distance)
- {
- xerr-=distance;
- uRow+=incx;
- }
- if(yerr>distance)
- {
- yerr-=distance;
- uCol+=incy;
- }
- }
- }
- //填充
- void LCD_Fill(u16 sx,u16 sy,u16 ex,u16 ey,u32 color)
- {
- u16 i,j;
- u16 xlen=0;
- if(lcdltdc.pwidth!=0) //Èç¹ûÊÇRGBÆÁ
- {
- LTDC_Fill(sx,sy,ex,ey,color);
- }else
- {
- xlen=ex-sx+1;
- for(i=sy;i<=ey;i++)
- {
- LCD_SetCursor(sx,i); //ÉèÖùâ±êλÖÃ
- LCD_WriteRAM_Prepare(); //¿ªÊ¼Ð´ÈëGRAM
- for(j=0;jLCD_RAM=color; //ÏÔʾÑÕÉ«
- }
- }
- }
复制代码
整个工程的功能就是更换背景的颜色,并显示一些字符。 背景的颜色使用的LCD_Clear函数,将屏都清成一个颜色,而不是填充,清屏要快很多。 字符是使用LCD_ShowString函数,指定了位置与大小和字符内容。 目前都是在使用底层进行LCD的显示,后期是要加GUI的,到时要使用的都是GUI的API函数,这些底层用的就比较少了。
以下是此工程的运行结果图。
`
|