Main Page   Data Structures   File List   Data Fields   Globals   Related Pages  

sed1520.cpp

Go to the documentation of this file.
00001 /*  sed1520.cpp
00002     Graphics LCD driver for SED1520 122x32 graphic LCDs
00003 
00004     22.12.2001: tk, implemented display mirror code, as
00005                     suggested by robert dubber.
00006     09.06.2001: tk, initial implementation.
00007 
00008     Copyright (c)2001 by Thomas Kindler, thomas.kindler@gmx.de
00009 
00010     This program is free software; you can redistribute it and/or
00011     modify it under the terms of the GNU General Public License as
00012     published by the Free Software Foundation; either version 2 of
00013     the License, or (at your option) any later version. Read the
00014     full License at http://www.gnu.org/copyleft for more details.
00015 */
00016 
00017 #include <stdio.h>
00018 #include <conio.h>
00019 #include <string.h>
00020 #include "sc12/hwapi.h"
00021 #include "sc12/rtos.h"
00022 #include "gfxdriver.h"
00023 #include "misc.h"
00024 
00025 
00029 #define LCD_CLOCK       2000
00030 
00049 #define LCD_MINPWMON      50
00050 #define LCD_MINPWMOFF     10
00051 
00052 
00058 #define LCD_UPSIDEDOWN
00059 
00060 #ifdef  LCD_UPSIDEDOWN
00061 static const unsigned char mirror[256] = {
00062   0x00,0x80,0x40,0xC0,0x20,0xA0,0x60,0xE0,0x10,0x90,0x50,0xD0,0x30,0xB0,0x70,0xF0,
00063   0x08,0x88,0x48,0xC8,0x28,0xA8,0x68,0xE8,0x18,0x98,0x58,0xD8,0x38,0xB8,0x78,0xF8,
00064   0x04,0x84,0x44,0xC4,0x24,0xA4,0x64,0xE4,0x14,0x94,0x54,0xD4,0x34,0xB4,0x74,0xF4,
00065   0x0C,0x8C,0x4C,0xCC,0x2C,0xAC,0x6C,0xEC,0x1C,0x9C,0x5C,0xDC,0x3C,0xBC,0x7C,0xFC,
00066   0x02,0x82,0x42,0xC2,0x22,0xA2,0x62,0xE2,0x12,0x92,0x52,0xD2,0x32,0xB2,0x72,0xF2,
00067   0x0A,0x8A,0x4A,0xCA,0x2A,0xAA,0x6A,0xEA,0x1A,0x9A,0x5A,0xDA,0x3A,0xBA,0x7A,0xFA,
00068   0x06,0x86,0x46,0xC6,0x26,0xA6,0x66,0xE6,0x16,0x96,0x56,0xD6,0x36,0xB6,0x76,0xF6,
00069   0x0E,0x8E,0x4E,0xCE,0x2E,0xAE,0x6E,0xEE,0x1E,0x9E,0x5E,0xDE,0x3E,0xBE,0x7E,0xFE,
00070   0x01,0x81,0x41,0xC1,0x21,0xA1,0x61,0xE1,0x11,0x91,0x51,0xD1,0x31,0xB1,0x71,0xF1,
00071   0x09,0x89,0x49,0xC9,0x29,0xA9,0x69,0xE9,0x19,0x99,0x59,0xD9,0x39,0xB9,0x79,0xF9,
00072   0x05,0x85,0x45,0xC5,0x25,0xA5,0x65,0xE5,0x15,0x95,0x55,0xD5,0x35,0xB5,0x75,0xF5,
00073   0x0D,0x8D,0x4D,0xCD,0x2D,0xAD,0x6D,0xED,0x1D,0x9D,0x5D,0xDD,0x3D,0xBD,0x7D,0xFD,
00074   0x03,0x83,0x43,0xC3,0x23,0xA3,0x63,0xE3,0x13,0x93,0x53,0xD3,0x33,0xB3,0x73,0xF3,
00075   0x0B,0x8B,0x4B,0xCB,0x2B,0xAB,0x6B,0xEB,0x1B,0x9B,0x5B,0xDB,0x3B,0xBB,0x7B,0xFB,
00076   0x07,0x87,0x47,0xC7,0x27,0xA7,0x67,0xE7,0x17,0x97,0x57,0xD7,0x37,0xB7,0x77,0xF7,
00077   0x0F,0x8F,0x4F,0xCF,0x2F,0xAF,0x6F,0xEF,0x1F,0x9F,0x5F,0xDF,0x3F,0xBF,0x7F,0xFF
00078 };
00079 #endif
00080 
00084 static unsigned char lcd_screen[4][128];
00085 
00086 
00090 char *LCD_GetScreenBuffer()
00091 {
00092   return (char*)(&lcd_screen[0][0]);
00093 }
00094 
00095 
00099 int  LCD_GetWidth()
00100 {
00101   return 122;
00102 }
00103 
00104 
00108 int  LCD_GetHeight()
00109 {
00110   return 32;
00111 }
00112 
00113 
00117 void LCD_Clear()
00118 {
00119   memset(lcd_screen, 0x00, sizeof(lcd_screen));
00120 }
00121 
00122 
00130 void LCD_Update()
00131 {
00132 #ifndef LCD_UPSIDEDOWN
00133   for (int y=0; y<4; y++) {
00134     outp(0x600, 0x00);
00135     outp(0x600, 0xB8 + y);
00136     outp(0x500, 0x00);
00137     outp(0x500, 0xB8 + y);
00138     for (int x=0; x<61; x++) {
00139       outp(0x602, lcd_screen[y][x   ]);
00140       outp(0x502, lcd_screen[y][x+61]);
00141     }
00142   }
00143 #else
00144   for (int y=0; y<4; y++) {
00145     outp(0x600, 0x00);
00146     outp(0x600, 0xB8 + (3-y));
00147     outp(0x500, 0x00);
00148     outp(0x500, 0xB8 + (3-y));
00149     for (int x=60; x>=0; x--) {
00150       outp(0x502, mirror[lcd_screen[y][x   ]]);
00151       outp(0x602, mirror[lcd_screen[y][x+61]]);
00152     }
00153   }
00154 #endif
00155 
00156 }
00157 
00158 
00168 void LCD_SetBrightness(int level)
00169 {
00170   long     period;
00171   unsigned pwmOn, pwmOff;
00172 
00173   if (level <   0) level =   0;
00174   if (level > 255) level = 255;
00175   period = hal_get_frequency(FREQ_TIMER)/LCD_CLOCK;
00176   pwmOn  = (unsigned)(period*level/255);
00177   pwmOff = (unsigned)period - pwmOn;
00178   if (pwmOn  < LCD_MINPWMON )  pwmOn  = LCD_MINPWMON;
00179   if (pwmOff < LCD_MINPWMOFF)  pwmOff = LCD_MINPWMOFF;
00180 
00181   hal_init_timer(0, TIMER_CONT | TIMER_INT, pwmOn);
00182   hal_set_timer_duty(0, true, pwmOff);
00183   hal_start_timer(0);
00184 }
00185 
00186 
00191 void LCD_Init()
00192 {
00193   printf("initializing SED1520 LCD..\n");
00194   pfe_enable_bus(0xff, true);
00195   pfe_enable_pcs(5);
00196   pfe_enable_pcs(6);
00197 
00198   // enable refresh timer
00199   //
00200   pfe_enable_timer(TIMER_OUT0);
00201   LCD_SetBrightness(255);
00202 
00203   outp(0x500, 0xe2);  // reset
00204   outp(0x600, 0xe2);
00205   outp(0x500, 0xa0);  // select forward adc
00206   outp(0x600, 0xa0);
00207   outp(0x500, 0xa4);  // static drive off
00208   outp(0x600, 0xa4);
00209   outp(0x500, 0xaf);  // display on
00210   outp(0x600, 0xaf);
00211 
00212   LCD_Clear();
00213   LCD_Update();
00214 }
00215 
00216 
00220 void LCD_Done()
00221 {
00222   // enter power-save mode
00223   //
00224   outp(0x500, 0xa5);  // static drive on
00225   outp(0x600, 0xa5);
00226   outp(0x500, 0xae);  // display off
00227   outp(0x600, 0xae);
00228 
00229   // disable refresh timer
00230   //
00231   hal_stop_timer(0);
00232 
00233   // free pio pins
00234   //
00235   pfe_enable_pio(13, PIO_IPD);
00236   pfe_enable_pio( 2, PIO_IPU);
00237   pfe_enable_pio( 3, PIO_IPU);
00238 }

Generated on Sun Aug 4 21:47:28 2002 for k/os mp3v2 by doxygen1.2.16