00001 00024 #include <arch/nxp/lpc23xx.h> 00025 #include "grlib.h" 00026 #include "charset.c" 00027 struct txtinfo *ptxt; 00028 00029 00030 /* 00031 Em alguns displays as cores e a coordenada X sao invertidas 00032 Comente esta linha se as cores parecerem erradas */ 00033 #define INVERTE 00034 /* espera t milisegundos (usa timer T1) */ 00035 void espera_ms(unsigned t) 00036 { 00037 t += T1TC; 00038 while(t != T1TC); 00039 } 00040 00041 void spiconfig(void) 00042 { 00043 SSP1CR1 = 0; // Conigura desabilitado 00044 // Divide por 1 no SSP1-PCLK 00045 PCLKSEL0 = (PCLKSEL0 & (~(3<<20))) | (0<<20); 00046 // Seleciona pinos p0.9=MOSI1; P0.7=SCLK1; P0.6=SSEL1 00047 PINSEL0 = (PINSEL0 & (~0x000ff000)) | 0x8a000; 00048 PCONP |= (1 << 10); // Liga ssp1 00049 SSP1CR0 = 8 + (0x0 << 6); // Configura SPI de 9 bits 00050 SSP1CPSR = 4; // Divide PCLK por 4 00051 SSP1CR1 = 2; // Habilita SSP1 como SPI 00052 } 00053 00054 /* Rotina para escrever um byte na interface SPI */ 00055 void WrSPI(int c) 00056 { 00057 while((SSP1SR & 2) == 0); // Wait while FIFO full 00058 SSP1DR = c; 00059 } 00060 00061 void lcd_nokia_init() 00062 { 00063 int k; 00064 spiconfig(); 00065 T1TCR = 0; // T1 em 1000 contagens por segundo 00066 T1PR = 12000000/10000 - 1; 00067 T1TCR = 2; 00068 T1TCR = 1; 00069 FIO0DIR |= 0x100; 00070 FIO0CLR = 0x100; // Reset no PCF8833 00071 espera_ms(10); // Pulso de 10ms 00072 FIO0SET = 0x100; 00073 espera_ms(10); 00074 WriteSpiCommand(0x11); // SLEEPOUT 00075 WriteSpiCommand(0x3a); // COLMOD (Modo de colorido) 00076 WriteSpiData(0x03); // 12 bits 00077 // Dependendo do modelo de display estas configuracoes devem mudar 00078 WriteSpiCommand(0x36); // MADCTL 00079 #ifdef INVERTE 00080 WriteSpiData(0x48); // 0x40: Xmirror; 0x08: bgr [1-bgr 0-rgb] 00081 #else 00082 WriteSpiData(0x0); // no mirror - rgb 00083 WriteSpiCommand(0x20); // INVON 00084 #endif 00085 WriteSpiCommand(0x25); // SETCON Ajusta contraste 00086 WriteSpiData(0x38); // Metade do maximo 00087 WriteSpiCommand(0x29); // DISPON 00088 WriteSpiCommand(0x2b); // PASET Linha inicial e final 00089 WriteSpiData(0); 00090 WriteSpiData(131); 00091 WriteSpiCommand(0x2a); // CASET Coluna inicial e final 00092 WriteSpiData(0); 00093 WriteSpiData(131); 00094 WriteSpiCommand(0x2c); // Write Memory 00095 /* Pinta tudo de branco */ 00096 for(k=0; k < 26136;){ 00097 WriteSpiData(0xff); k++; 00098 WriteSpiData(0xff); k++; 00099 WriteSpiData(0xff); k++; 00100 } 00101 } 00102 00103 00104 00105 00107 00108 void inline txtattrib(struct txtinfo *pptxt) 00109 { 00110 ptxt = pptxt; 00111 } 00112 00113 00114 00115 /* \brief Escreve um caractere no display grafico */ 00116 void lcdgr_putchar(int c) 00117 { 00118 int x,y, bc, cbg, cfg; 00119 WriteSpiCommand(0x2b); // PASET Linha inicial e final 00120 WriteSpiData(ptxt->linha); 00121 WriteSpiData(ptxt->linha+7); 00122 WriteSpiCommand(0x2a); // CASET Coluna inicial e final 00123 WriteSpiData(ptxt->coluna); 00124 WriteSpiData(ptxt->coluna+7); 00125 WriteSpiCommand(0x2c); // Write Memory 00126 cfg = ptxt->corfrente; 00127 cbg = ptxt->corfundo; 00128 ptxt->coluna += 8; 00129 if((ptxt->coluna > 128) || (c == '\n') ) { 00130 ptxt->coluna = 0; 00131 ptxt->linha += 12; 00132 if(ptxt->linha > 128) ptxt->linha = 0; 00133 return; 00134 } 00135 if(c < 0x20) return; 00136 for(y = 0; y < 8; y++) { 00137 bc = rom8x8_bits[8*(c-0x20) + y]; 00138 for(x=4; x--; bc <<=2) { 00139 switch(bc & 0xc0){ 00140 case 0x00: 00141 WriteSpiData(cbg >> 4); 00142 WriteSpiData(((cbg << 4) | (cbg >> 4)) & 0xff); 00143 WriteSpiData(cbg & 0xff); 00144 break; 00145 case 0x40: 00146 WriteSpiData(cbg >> 4); 00147 WriteSpiData(((cbg << 4) | (cfg >> 4)) & 0xff); 00148 WriteSpiData(cfg & 0xff); 00149 break; 00150 case 0x80: 00151 WriteSpiData(cfg >> 4); 00152 WriteSpiData(((cfg << 4) | (cbg >> 4)) & 0xff); 00153 WriteSpiData(cbg & 0xff); 00154 break; 00155 case 0xc0: 00156 WriteSpiData(cfg >> 4); 00157 WriteSpiData(((cfg << 4) | (cfg >> 4)) & 0xff); 00158 WriteSpiData(cfg & 0xff); 00159 break; 00160 } 00161 } 00162 } 00163 } 00164 00165 void lcdgr_puts(char *str) 00166 { 00167 while(*str) lcdgr_putchar(*str++); 00168 } 00169 00170 00171 void setPixel(int x, int y) 00172 { 00173 /* Se o bit 6 (mascara 0x4000) da cor for 1 desenha com linha grossa */ 00174 if(ptxt->corfrente & 0x4000) { 00175 WriteSpiCommand(0x2b); // PASET Linha inicial e final 00176 WriteSpiData(y); 00177 WriteSpiData(y+1); 00178 WriteSpiCommand(0x2a); // CASET coluna inicial e final 00179 WriteSpiData(x); 00180 WriteSpiData(x+1); 00181 WriteSpiCommand(0x2c); // Write Memory 00182 WriteSpiData(ptxt->corfrente >> 4); 00183 WriteSpiData((ptxt->corfrente << 4) | ((ptxt->corfrente >> 8) & 15)); 00184 WriteSpiData(ptxt->corfrente); 00185 WriteSpiData(ptxt->corfrente >> 4); 00186 WriteSpiData((ptxt->corfrente << 4) | ((ptxt->corfrente >> 8) & 15)); 00187 WriteSpiData(ptxt->corfrente); 00188 return; 00189 } 00190 WriteSpiCommand(0x2b); // PASET Linha inicial e final 00191 WriteSpiData(y); 00192 WriteSpiData(y); 00193 WriteSpiCommand(0x2a); // CASET coluna inicial e final 00194 WriteSpiData(x); 00195 WriteSpiData(x); 00196 WriteSpiCommand(0x2c); // Write Memory 00197 WriteSpiData(ptxt->corfrente >> 4); 00198 WriteSpiData((ptxt->corfrente << 4) & 0xf0); 00199 WriteSpiCommand(0); // NOP 00200 } 00201 00202