#include "glcd.h" #include "fonts.h" #include static uint16_t DeviceCode; static __inline void lcdWriteIndex(uint16_t index) { Clr_Rs; Set_nRd; LCD_DATA_PORT->ODR = index; Clr_nWr; Set_nWr; } static __inline void lcdWriteData(uint16_t data) { Set_Rs; LCD_DATA_PORT->ODR = data; Clr_nWr; Set_nWr; } static __inline uint16_t lcdReadData(void) { uint16_t value; Set_Rs; Set_nWr; Clr_nRd; // change pin mode to digital input LCD_DATA_PORT->CRH = 0x44444444; LCD_DATA_PORT->CRL = 0x44444444; value = LCD_DATA_PORT->IDR; value = LCD_DATA_PORT->IDR; // change pin mode back to digital output LCD_DATA_PORT->CRH = 0x33333333; LCD_DATA_PORT->CRL = 0x33333333; Set_nRd; return value; } static __inline void lcdWriteReg(uint16_t lcdReg,uint16_t lcdRegValue) { Clr_Cs; lcdWriteIndex(lcdReg); lcdWriteData(lcdRegValue); Set_Cs; } static __inline uint16_t lcdReadReg(uint16_t lcdReg) { uint16_t lcdRAM; Clr_Cs; lcdWriteIndex(lcdReg); lcdRAM = lcdReadData(); Set_Cs; return lcdRAM; } static void lcdSetCursor(uint16_t Xpos,uint16_t Ypos) { if(DeviceCode==0x8989) { lcdWriteReg(0x004e,Xpos); lcdWriteReg(0x004f,Ypos); } else if(DeviceCode==0x9919) { lcdWriteReg(0x004e,Xpos); lcdWriteReg(0x004f,Ypos); } else { lcdWriteReg(0x0020,Xpos); lcdWriteReg(0x0021,Ypos); } } static void lcdDelay(uint16_t nCount) { uint16_t TimingDelay; while(nCount--) { for(TimingDelay=0;TimingDelay<10000;TimingDelay++); } } void lcdSetWindows(uint16_t xStart,uint16_t yStart,uint16_t xLong,uint16_t yLong) { lcdSetCursor(xStart,yStart); lcdWriteReg(0x0050,xStart); lcdWriteReg(0x0051,xStart+xLong-1); lcdWriteReg(0x0052,yStart); lcdWriteReg(0x0053,yStart+yLong-1); } void lcdClear(uint16_t Color) { uint32_t index=0; lcdSetCursor(0,0); Clr_Cs; lcdWriteIndex(0x0022); for(index=0;index<76800;index++) { lcdWriteData(Color); } Set_Cs; } uint16_t lcdGetPoint(uint16_t Xpos,uint16_t Ypos) { u16 dummy; lcdSetCursor(Xpos,Ypos); Clr_Cs; lcdWriteIndex(0x0022); dummy = lcdReadData(); dummy = lcdReadData(); Set_Cs; if( DeviceCode==0x7783 || DeviceCode==0x4531 || DeviceCode==0x8989 ) return dummy; else return lcdBGR2RGB( dummy ); } void lcdDrawPixel(uint16_t Xpos,uint16_t Ypos,uint16_t point) { lcdSetCursor(Xpos,Ypos); lcdWriteReg(0x0022,point); } void lcdDrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color) { int16_t dy, dx; int8_t addx=1, addy=1; int16_t P, diff; int16_t i=0; dx = abs((int8_t)(x2 - x1)); dy = abs((int16_t)(y2 - y1)); if(x1 > x2) addx = -1; if(y1 > y2) addy = -1; if(dx >= dy) { dy *= 2; P = dy - dx; diff = P - dx; for(; i<=dx; ++i) { lcdDrawPixel(x1, y1, color); if(P < 0) { P += dy; x1 += addx; } else { P += diff; x1 += addx; y1 += addy; } } } else { dx *= 2; P = dx - dy; diff = P - dy; for(; i<=dy; ++i) { lcdDrawPixel(x1, y1, color); if(P < 0) { P += dx; y1 += addy; } else { P += diff; x1 += addx; y1 += addy; } } } } void lcdChar(unsigned short Xpos,unsigned short Ypos,unsigned char c,unsigned short charColor,unsigned short bkColor) { unsigned short i=0; unsigned short j=0; unsigned char buffer[16]; unsigned char tmp_char=0; GetASCIICode(buffer,c); for (i=0;i<16;i++) { tmp_char=buffer[i]; for (j=0;j<8;j++) { if (((tmp_char >> (7-j)) & 0x01) == 0x01) { lcdDrawPixel(Xpos+j,Ypos+i,charColor); } else { lcdDrawPixel(Xpos+j,Ypos+i,bkColor); } } } } void lcdString(uint16_t Xpos, uint16_t Ypos, uint8_t *str,uint16_t Color, uint16_t bkColor) { uint8_t TempChar; do { TempChar=*str++; lcdChar(Xpos,Ypos,TempChar,Color,bkColor); if (Xpos<232) { Xpos+=8; } else if (Ypos<304) { Xpos=0; Ypos+=16; } else { Xpos=0; Ypos=0; } } while (*str!=0); } uint16_t lcdBGR2RGB(uint16_t color) { uint16_t r, g, b, rgb; b = ( color>>0 ) & 0x1f; g = ( color>>5 ) & 0x3f; r = ( color>>11 ) & 0x1f; rgb = (b<<11) + (g<<5) + (r<<0); return( rgb ); } void lcdFillArea(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t color) { uint16_t i; for(i = y0; i < y1; i++) lcdDrawLine(x0, i, x1, i, color); } void lcdFillArea2(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t color) { uint32_t index, area; area = ((x1-x0) * (y1-y0)); lcdSetWindows(x0, y0, x1, y1); lcdSetCursor(x0, x1); Clr_Cs; lcdWriteIndex(0x0022); for(index = 0; index < area; index++) lcdWriteData(color); Set_Cs; } void lcdDrawRect(uint8_t x0, uint16_t y0, uint8_t x1, uint16_t y1, uint8_t filled, uint16_t color) { uint8_t i,TempX; uint16_t j, TempY; if (x0 > x1) { TempX = x1; x1 = x0; x0 = TempX; } if (y0 > y1) { TempY = y1; y1 = y0; y0 = TempY; } if(filled) { for(i=x0; i