grlib.c

Go to the documentation of this file.
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