firmware/T6963.c
author root@rika
Thu, 23 Apr 2009 19:10:12 +0200
changeset 30 7fd00015f62f
parent 2 2f55e5dd591d
permissions -rw-r--r--
several changes..
     1 /*
     2  * Project Frontplatte
     3  *
     4  * t6963.c  -  Controll a t6963c display
     5  *
     6  * This file is released under the GNU General Public License. Refer
     7  * to the COPYING file distributed with this package.
     8  *
     9  * (c) 2007 Carsten Presser cpresser AT fsing.uni-sb.de
    10  *  heavily inspired by Holger Klabunde
    11  */
    12 
    13 
    14 /** I N C L U D E S **********************************************************/
    15 #include <p18cxxx.h>
    16 #include "t6963.h"
    17 #include "io_cfg.h"
    18 
    19 /** P R I V A T E  P R O T O T Y P E S ***************************************/
    20 unsigned char	lcd_checkBusy(void);
    21 
    22 /** V A R I A B L E S ********************************************************/
    23 unsigned char	lcd_auto_mode = MODE_NOAUTO;
    24 
    25 
    26 /** H I G H L E V E L ********************************************************/
    27 void lcd_ClearScreen(void)
    28 {
    29  	unsigned int i;
    30 
    31 	// Address Pointer Set
    32 	lcd_WriteData(0x00);		// byte1
    33 	lcd_WriteData(0x00);		// byte2
    34 	lcd_WriteCommand(0x24);	//set!
    35 	
    36 
    37 	// bis 0x08F0 löschen...
    38 	lcd_SetAutomode(MODE_AUTO);
    39 	for(i=0; i <= 0x11E; i++)
    40   	{
    41    		lcd_WriteData(0x00); lcd_WriteData(0x00);
    42    		lcd_WriteData(0x00); lcd_WriteData(0x00);
    43    		lcd_WriteData(0x00); lcd_WriteData(0x00);
    44    		lcd_WriteData(0x00); lcd_WriteData(0x00);
    45   	}
    46 	lcd_SetAutomode(MODE_NOAUTO); 
    47 
    48 	lcd_WriteData(0x00);		// byte1
    49 	lcd_WriteData(0x00);		// byte2
    50 	lcd_WriteCommand(0x24);	//set!
    51 
    52 }
    53 
    54 void lcd_InitDisplay(void)
    55 {
    56 	mLcdDataDirOut();
    57 	mLcdWriteData(0x00);
    58 	mLcdInitCtrl();
    59 
    60 
    61 	// MODE_SET
    62 	lcd_WriteCommand(0x80);	// OR-Mode; CG-ROM Mode
    63 
    64 	// DISPLAY_MODE
    65 	lcd_WriteCommand(0x9C);	// GFX-Mode=1, Text-Mode=1, Cursor=0, Blink=0 -> C
    66  
    67 
    68 	// CONTROL_WORD set Text-Area-Home
    69 	lcd_WriteData(0x00);		// byte1
    70 	lcd_WriteData(0x08);		// byte2
    71 	lcd_WriteCommand(0x40);	//set!
    72 
    73 	// CONTROL_WORD SET Text-Area
    74 	lcd_WriteData(0x1E);		// TA-Value (Address of Second Line)
    75 	lcd_WriteData(0x00);		// always Zero
    76 	lcd_WriteCommand(0x41);	// set!
    77 
    78 	// CONTROL_WORD set GFX-Area-Home
    79 	lcd_WriteData(0x00);		// byte1
    80 	lcd_WriteData(0x00);		// byte2
    81 	lcd_WriteCommand(0x42);	//set!
    82 
    83 	// CONTROL_WORD SET GFX-Area
    84 	lcd_WriteData(0x1E);		// Start-Address of Second Line
    85 	lcd_WriteData(0x00);		// always Zero
    86 	lcd_WriteCommand(0x43);	// set!
    87 
    88 
    89 
    90 	lcd_ClearScreen();
    91 }
    92 
    93 /** I N T E R F A C E ********************************************************/
    94 unsigned char lcd_CheckBusy(void)
    95 {
    96 	unsigned char by;
    97 
    98 	D_CD	= MODE_COMMAND;
    99 	mLcdDataDirIn();
   100 
   101 	if (lcd_auto_mode == MODE_AUTO)
   102 	{
   103 		// in auto_mode only status3 is valid
   104  		do	{
   105     		D_RD	= 0;
   106     		by		= mLcdReadData();
   107     		by		&= 0x08;
   108     		D_RD	= 1;
   109 			} 
   110 		while (by!=0x08);
   111 	} 
   112 	else
   113 	{
   114 		// check status1 & status 2
   115  		do	{
   116     		D_RD	= 0;
   117     		by		= mLcdReadData();
   118     		by		&= 0x03;
   119     		D_RD	= 1;
   120 			} 
   121 		while (by!=0x03);
   122 	}
   123 
   124 	mLcdDataDirOut();
   125 	return by;
   126 }
   127 
   128 void lcd_SetAutomode(unsigned char mode)
   129 {
   130 	unsigned char by;
   131 
   132 	if (mode == MODE_AUTO) 
   133 	{
   134 		lcd_WriteCommand(0xB0);	// Data Auto Write Set 
   135 		lcd_CheckBusy();
   136 	} 
   137 	else
   138 	{
   139 		lcd_WriteCommand(0xB2);	// Auto Mode Reset
   140 	}
   141 
   142 	lcd_auto_mode = mode;
   143 	return;
   144 }
   145 
   146 
   147 void lcd_WriteData(unsigned char dat)
   148 {
   149  lcd_CheckBusy();
   150  
   151  D_CD	= MODE_DATA;
   152  mLcdWriteData(dat); //Daten schreiben
   153  D_WR	= 0;
   154  D_WR	= 1;
   155 }
   156 
   157 void lcd_WriteCommand(unsigned char comand)
   158 {
   159  lcd_CheckBusy();
   160 
   161  D_CD	= MODE_COMMAND;
   162  mLcdWriteData(comand); //Kommando schreiben
   163  D_WR	= 0;
   164  D_WR	= 1;
   165 }
   166 
   167 void lcd_WriteByte(unsigned char dat)
   168 {
   169  lcd_WriteData(dat); //Daten schreiben
   170  lcd_WriteCommand(0xC0); //Kommando schreiben
   171 }
   172