URL
https://opencores.org/ocsvn/openrisc/openrisc/trunk
Subversion Repositories openrisc
[/] [openrisc/] [trunk/] [rtos/] [freertos-6.1.1/] [Demo/] [CORTEX_LPC1768_GCC_RedSuite/] [src/] [LCD/] [lcd.c] - Rev 581
Compare with Previous | Blame | View Log
//***************************************************************************** // +--+ // | ++----+ // +-++ | // | | // +-+--+ | // | +--+--+ // +----+ Copyright (c) 2009 Code Red Technologies Ltd. // // lcd.c contains various routines to plot to the LCD display on the RDB1768 // development board. // // Software License Agreement // // The software is owned by Code Red Technologies and/or its suppliers, and is // protected under applicable copyright laws. All rights are reserved. Any // use in violation of the foregoing restrictions may subject the user to criminal // sanctions under applicable laws, as well as to civil liability for the breach // of the terms and conditions of this license. // // THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED // OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. // USE OF THIS SOFTWARE FOR COMMERCIAL DEVELOPMENT AND/OR EDUCATION IS SUBJECT // TO A CURRENT END USER LICENSE AGREEMENT (COMMERCIAL OR EDUCATIONAL) WITH // CODE RED TECHNOLOGIES LTD. #include "lcd_commands.h" #include "lcd.h" #include "lcd_driver.h" #include "font.h" #include <stdlib.h> // to provice abs() function // Routine to draw a filled rectangle to the LCD. // Two corners of rectangle are at (xmin,ymin) and (xmax,ymax). // The Rectangle is filled with the RGB565 color specified void LCD_FilledRect(int xmin,int xmax,int ymin,int ymax,int color) { int i; // Specify to LCD controller coordinates we are writing to... LCDdriver_WriteCom(DD_CASET); // Set the column address LCDdriver_WriteData(xmin); // min address LCDdriver_WriteData(xmax); // max address LCDdriver_WriteCom(DD_RASET); // Set the row address LCDdriver_WriteData(ymin + 1); // min address LCDdriver_WriteData(ymax + 1); // max address LCDdriver_WriteCom(DD_RAMWR); // RAM Write command // Plot the color data to the LCD buffer for(i = ((xmax - xmin + 1) * (ymax - ymin + 1)); i > 0; i--) { LCDdriver_WriteData(color >> 8); // top 8 bits of RGB565 color LCDdriver_WriteData(color); // bottom 8 bits of RGB565 color } } // Routine to draw an unfilled rectangle to the LCD. // Two corners of rectangle are at (xmin,ymin) and (xmax,ymax). // The Rectangle is drawn in the RGB565 color specified void LCD_Rect(int xmin,int xmax,int ymin,int ymax,int color) { // Draw 4 lines of rectange as 4 filled rectanges, each of 1 pixel wide LCD_FilledRect(xmin,xmin,ymin,ymax,color); LCD_FilledRect(xmax,xmax,ymin,ymax,color); LCD_FilledRect(xmin,xmax,ymin,ymin,color); LCD_FilledRect(xmin,xmax,ymax,ymax,color); } // Plot a point on the screen in the 6:5:6 color format void LCD_PlotPoint(int x,int y,int color) { LCDdriver_WriteCom(DD_CASET); // Set the column address LCDdriver_WriteData(x); // min address LCDdriver_WriteData(x); // max address LCDdriver_WriteCom(DD_RASET); // Set the row address LCDdriver_WriteData(y + 1); // min address LCDdriver_WriteData(y + 1); // max address LCDdriver_WriteCom(DD_RAMWR); // RAM Write command LCDdriver_WriteData(color >> 8); // top 8 bits of RGB565 color LCDdriver_WriteData(color); // top 8 bits of RGB565 color } // Routine to draw a filled circle to the LCD. // The centre of the circle is at (x0,y0) and the circle has the // specifed radius. The circle is filled with the RGB565 color // The circle is drawn using the "Midpoint circle algorithm", // also known as "Bresenham's circle algorithm". In order to fill // the circle, the algorithm has been modifed to draw a line between // each two points, rather than plotting the two points individually. void LCD_FilledCircle (int x0, int y0, int radius, int color) { int f = 1 - radius; int ddF_x = 1; int ddF_y = -2 * radius; int x = 0; int y = radius; LCD_FilledRect(x0, x0 ,y0 - radius,y0 + radius, color); LCD_FilledRect(x0 - radius, x0 + radius ,y0,y0, color); while(x < y) { if(f >= 0) { y--; ddF_y += 2; f += ddF_y; } x++; ddF_x += 2; f += ddF_x; LCD_FilledRect(x0-x, x0+x ,y0 +y, y0 + y, color); LCD_FilledRect(x0-x, x0+x ,y0 - y, y0 - y, color); LCD_FilledRect(x0-y, x0+y ,y0 + x, y0 + x, color); LCD_FilledRect(x0-y, x0+y ,y0 - x, y0 - x, color); } } // Routine to draw an unfilled circle to the LCD. // The centre of the circle is at (x0,y0) and the circle has the // specifed radius. The circle is drawn in the RGB565 color // The circle is drawn using the "Midpoint circle algorithm", // also known as "Bresenham's circle algorithm". void LCD_Circle (int x0, int y0, int radius, int color) { int f = 1 - radius; int ddF_x = 1; int ddF_y = -2 * radius; int x = 0; int y = radius; LCD_PlotPoint(x0, y0 + radius, color); LCD_PlotPoint(x0, y0 - radius, color); LCD_PlotPoint(x0 + radius, y0, color); LCD_PlotPoint(x0 - radius, y0, color); while(x < y) { if(f >= 0) { y--; ddF_y += 2; f += ddF_y; } x++; ddF_x += 2; f += ddF_x; LCD_PlotPoint(x0 + x, y0 + y, color); LCD_PlotPoint(x0 - x, y0 + y, color); LCD_PlotPoint(x0 + x, y0 - y, color); LCD_PlotPoint(x0 - x, y0 - y, color); LCD_PlotPoint(x0 + y, y0 + x, color); LCD_PlotPoint(x0 - y, y0 + x, color); LCD_PlotPoint(x0 + y, y0 - x, color); LCD_PlotPoint(x0 - y, y0 - x, color); } } // Routine to draw a line in the RGB565 color to the LCD. // The line is drawn from (xmin,ymin) to (xmax,ymax). // The algorithm used to draw the line is "Bresenham's line // algorithm". #define SWAP(a, b) a ^= b; b ^= a; a ^= b; void LCD_Line (int xmin,int xmax,int ymin,int ymax,int color) { int Dx = xmax - xmin; int Dy = ymax - ymin; int steep = (abs(Dy) >= abs(Dx)); if (steep) { SWAP(xmin, ymin); SWAP(xmax, ymax); // recompute Dx, Dy after swap Dx = xmax - xmin; Dy = ymax - ymin; } int xstep = 1; if (Dx < 0) { xstep = -1; Dx = -Dx; } int ystep = 1; if (Dy < 0) { ystep = -1; Dy = -Dy; } int TwoDy = 2*Dy; int TwoDyTwoDx = TwoDy - 2*Dx; // 2*Dy - 2*Dx int E = TwoDy - Dx; //2*Dy - Dx int y = ymin; int xDraw, yDraw; int x; for (x = xmin; x != xmax; x += xstep) { if (steep) { xDraw = y; yDraw = x; } else { xDraw = x; yDraw = y; } // plot LCD_PlotPoint(xDraw, yDraw, color); // next if (E > 0) { E += TwoDyTwoDx; //E += 2*Dy - 2*Dx; y = y + ystep; } else { E += TwoDy; //E += 2*Dy; } } } // Routine to clear the LCD. // Implemented by drawing a black rectangle across the whole screen void LCD_ClearScreen(void) { LCD_FilledRect (0,LCD_MAX_X,0 , LCD_MAX_Y, COLOR_BLACK); } // Routine to write a single character to screen in the font pointed // to by pBitMap. This routine is intended to be used via the // LCD_PrintChar() and LCD_PrintString() routines, rather than called // directly from user code. void LCD_WriteBitMap8x15(int x, int y, int height, int width, unsigned char *pBitMap, int color) { int xmax = x + width - 1; // start at zero int ymax = y + height - 1; // start at zero int iRow, iCol; unsigned char ucRowData; LCDdriver_WriteCom(DD_CASET); // Column address set LCDdriver_WriteData(x); // Start column LCDdriver_WriteData(xmax); // End column LCDdriver_WriteCom(DD_RASET); // Row address set LCDdriver_WriteData(y); // Start row LCDdriver_WriteData(ymax); // End row LCDdriver_WriteCom(DD_RAMWR); // Memory write for(iRow=0;iRow<height;iRow++) { ucRowData = *pBitMap++; for(iCol=0;iCol<width;iCol++) { // Look at each input bitmap bit // and write as a black-pixel or // a color-pixel. if(ucRowData & 0x80) // 'color pixel' { LCDdriver_WriteData(color >> 8); LCDdriver_WriteData(color); } else // black pixel { LCDdriver_WriteData(0x00); LCDdriver_WriteData(0x00); } ucRowData = ucRowData<<1; } } } // Prints the character 'c' to the LCD in the appropriate color. void LCD_PrintChar(int x, int y, unsigned char c, int color ) { const unsigned char index = font_index_table[c]; const unsigned int offset = index * 15; unsigned char *pData = (unsigned char *)&font_data_table[offset]; LCD_WriteBitMap8x15(x, y, 15, 8, pData, color); } // Prints the string to the LCD in the appropriate color. void LCD_PrintString(int x, int y, char *pcString, int iStrLen, int color) { unsigned char index; unsigned int offset; unsigned char *pData; unsigned char c; int i; for(i=0;i<iStrLen;i++) { c = pcString[i]; if(c==0) break; index = font_index_table[c]; offset = index * 15; pData = (unsigned char *)&font_data_table[offset]; LCD_WriteBitMap8x15(x, y, 15, 8, pData, color); x += 8; } }