| 
									
										
										
										
											2013-09-12 13:58:33 +07:00
										 |  |  |  | /**********************************************************************
 | 
					
						
							|  |  |  |  | * $Id$		LCDTerm.c			2011-12-06 | 
					
						
							|  |  |  |  | *//**
 | 
					
						
							|  |  |  |  | * @file		LCDTerm.c | 
					
						
							|  |  |  |  | * @brief	This is a library that can be used to display text on the LCD of Hitex 1800 board | 
					
						
							|  |  |  |  | * @version	1.0 | 
					
						
							|  |  |  |  | * @date		06. Dec. 2011 | 
					
						
							|  |  |  |  | * @author	NXP MCU SW Application Team | 
					
						
							|  |  |  |  | * | 
					
						
							|  |  |  |  | * Copyright(C) 2011, NXP Semiconductor | 
					
						
							|  |  |  |  | * All rights reserved. | 
					
						
							|  |  |  |  | * | 
					
						
							|  |  |  |  | *********************************************************************** | 
					
						
							|  |  |  |  | * Software that is described herein is for illustrative purposes only | 
					
						
							|  |  |  |  | * which provides customers with programming information regarding the | 
					
						
							|  |  |  |  | * products. This software is supplied "AS IS" without any warranties. | 
					
						
							|  |  |  |  | * NXP Semiconductors assumes no responsibility or liability for the | 
					
						
							|  |  |  |  | * use of the software, conveys no license or title under any patent, | 
					
						
							|  |  |  |  | * copyright, or mask work right to the product. NXP Semiconductors | 
					
						
							|  |  |  |  | * reserves the right to make changes in the software without | 
					
						
							|  |  |  |  | * notification. NXP Semiconductors also make no representation or | 
					
						
							|  |  |  |  | * warranty that such application will be suitable for the specified | 
					
						
							|  |  |  |  | * use without further testing or modification. | 
					
						
							|  |  |  |  | * Permission to use, copy, modify, and distribute this software and its | 
					
						
							|  |  |  |  | * documentation is hereby granted, under NXP Semiconductors<EFBFBD> | 
					
						
							|  |  |  |  | * relevant copyright in the software, without fee, provided that it | 
					
						
							|  |  |  |  | * is used in conjunction with NXP Semiconductors microcontrollers.  This | 
					
						
							|  |  |  |  | * copyright, permission, and disclaimer notice must appear in all copies of | 
					
						
							|  |  |  |  | * this code. | 
					
						
							|  |  |  |  | **********************************************************************/ | 
					
						
							|  |  |  |  | #if defined(HITEX_LCD_TERM)
 | 
					
						
							|  |  |  |  | #include "lpc43xx_ssp.h"
 | 
					
						
							|  |  |  |  | #include "lpc43xx_scu.h"
 | 
					
						
							|  |  |  |  | #include "lpc43xx_cgu.h"
 | 
					
						
							|  |  |  |  | //#include "lpc43xx_libcfg.h"
 | 
					
						
							|  |  |  |  | #include "debug_frmwrk.h"
 | 
					
						
							|  |  |  |  | #include "lpc43xx_gpio.h"
 | 
					
						
							|  |  |  |  | #include "LCDTerm.h"
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | /************************** PRIVATE DEFINTIONS ************************/ | 
					
						
							|  |  |  |  | /** Max buffer length */ | 
					
						
							|  |  |  |  | #define BUFFER_SIZE				0x40
 | 
					
						
							|  |  |  |  | #define FONT_OFFSET     		32
 | 
					
						
							|  |  |  |  | #define FONT_WIDTH      		5
 | 
					
						
							|  |  |  |  | #define CHARS_PER_ROW			25
 | 
					
						
							|  |  |  |  | #define NO_OF_ROWS				4
 | 
					
						
							|  |  |  |  | #define MAX_CHARS_DISPLAYED		CHARS_PER_ROW * NO_OF_ROWS
 | 
					
						
							|  |  |  |  | #define ROW_PIXELS				128
 | 
					
						
							|  |  |  |  | #define COL_PIXELS				8
 | 
					
						
							|  |  |  |  | #define Highlight 				1
 | 
					
						
							|  |  |  |  | #define NoHighlight 			0
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | /************************** PRIVATE VARIABLES *************************/ | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | // SSP Configuration structure variable
 | 
					
						
							|  |  |  |  | SSP_CFG_Type SSP_ConfigStruct; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | // Tx buffer
 | 
					
						
							|  |  |  |  | uint8_t Tx_Buf[BUFFER_SIZE]; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | // Rx buffer
 | 
					
						
							|  |  |  |  | uint8_t Rx_Buf[BUFFER_SIZE]; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | //Character indexes
 | 
					
						
							|  |  |  |  | uint8_t Char_Index[256]; | 
					
						
							|  |  |  |  | uint8_t Highlight_Value[256]; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | char Chars_Displayed[88]; | 
					
						
							|  |  |  |  | uint8_t Number_of_Chars = 0, Start_Index = 0, Current_Index = 0; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | /***************************IMPORT VARIABLES**************************/ | 
					
						
							|  |  |  |  | extern const UNS_16 x5x7_bits []; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | /************************** PRIVATE FUNCTIONS *************************/ | 
					
						
							|  |  |  |  | void delay(unsigned int n) | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  |    volatile unsigned int i,j; | 
					
						
							|  |  |  |  |    for (i=0;i<n;i++) | 
					
						
							|  |  |  |  |         for (j=0;j<400;j++) | 
					
						
							|  |  |  |  |            {;} | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | void data_out(unsigned char i, SSP_DATA_SETUP_Type *xferConfig); | 
					
						
							|  |  |  |  | void comm_out(unsigned char j, SSP_DATA_SETUP_Type *xferConfig); | 
					
						
							|  |  |  |  | void init_LCD(SSP_DATA_SETUP_Type *xferConfig); | 
					
						
							|  |  |  |  | void Init_Indexes(void); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | /*-------------------------PRIVATE FUNCTIONS------------------------------*/ | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | /*-------------------------SET UP FUNCTION------------------------------*/ | 
					
						
							|  |  |  |  | /*********************************************************************//**
 | 
					
						
							|  |  |  |  |  * @brief		Main set up function | 
					
						
							|  |  |  |  |  * @param[in]	None | 
					
						
							|  |  |  |  |  * @return 		SSP_DATA_SETUP_Type | 
					
						
							|  |  |  |  |  **********************************************************************/ | 
					
						
							|  |  |  |  | SSP_DATA_SETUP_Type *InitLCDTerm(void) | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | //	char * lcd_string = logo;
 | 
					
						
							|  |  |  |  | 	unsigned char page = 0xB0; | 
					
						
							|  |  |  |  | 	int i = 0, j = 0; | 
					
						
							|  |  |  |  | 	static SSP_DATA_SETUP_Type xferConfig; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	Init_Indexes(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	/* Configure SSP0 pins*/ | 
					
						
							|  |  |  |  | 	// Configure all the pins of the LCD
 | 
					
						
							|  |  |  |  | 	scu_pinmux(0x7,4,MD_PUP,FUNC0);	// P7.4 connected to GPIO = SPI_CSI
 | 
					
						
							|  |  |  |  |  	scu_pinmux(0xA,2,MD_PUP,FUNC0);	// PA.2 connected to GPIO = LCD_RST
 | 
					
						
							|  |  |  |  |  	scu_pinmux(0xA,3,MD_PUP,FUNC0);	// PA.3 connected to GPIO = LCD_A0
 | 
					
						
							|  |  |  |  | 	scu_pinmux(0xF,3,(MD_PUP | MD_EHS),FUNC2); | 
					
						
							|  |  |  |  | 	scu_pinmux(0xF,3,(MD_PUP | MD_EHS),FUNC2); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	//Set the directions
 | 
					
						
							|  |  |  |  | 	GPIO_SetDir(0x3,(1<<12), 1); | 
					
						
							|  |  |  |  | 	GPIO_SetDir(0x4,(1<<9), 1); | 
					
						
							|  |  |  |  | 	GPIO_SetDir(0x4,(1<<10), 1); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     | 
					
						
							|  |  |  |  | 	//Reset lcd
 | 
					
						
							|  |  |  |  | 	GPIO_ClearValue(3,(1<<12));  //set CS
 | 
					
						
							|  |  |  |  | 	GPIO_SetValue(4,(1<<9)); | 
					
						
							|  |  |  |  | 	delay(100); | 
					
						
							|  |  |  |  | 	GPIO_ClearValue(4,(1<<9)); | 
					
						
							|  |  |  |  | 	delay(100); | 
					
						
							|  |  |  |  | 	GPIO_SetValue(4,(1<<9)); | 
					
						
							|  |  |  |  | 	delay(100); | 
					
						
							|  |  |  |  | 	GPIO_SetValue(3,(1<<12));  //set CS
 | 
					
						
							|  |  |  |  | 	GPIO_SetValue(4,(1<<10));  //set A0
 | 
					
						
							|  |  |  |  | 	delay(100); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	// initialize SSP configuration structure to default
 | 
					
						
							|  |  |  |  | 	SSP_ConfigStructInit(&SSP_ConfigStruct); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	//Note that the LCD does not work as expected above 35-40Mb/s
 | 
					
						
							|  |  |  |  | 	//Setting the speed to 10 Mb/s
 | 
					
						
							|  |  |  |  | 	SSP_ConfigStruct.ClockRate = 10000000; | 
					
						
							|  |  |  |  | 	 | 
					
						
							|  |  |  |  | 	// Initialize SSP peripheral with parameter given in structure above
 | 
					
						
							|  |  |  |  | 	SSP_Init(LPC_SSP0, &SSP_ConfigStruct); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	// Enable SSP peripheral
 | 
					
						
							|  |  |  |  | 	SSP_Cmd(LPC_SSP0, ENABLE); | 
					
						
							|  |  |  |  | 	delay(100); | 
					
						
							|  |  |  |  | 	delay(100); | 
					
						
							|  |  |  |  | 	xferConfig.length = 1; | 
					
						
							|  |  |  |  | 	init_LCD(&xferConfig); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 		    //wait for the lcd to reboot
 | 
					
						
							|  |  |  |  | 	delay(100); | 
					
						
							|  |  |  |  | 	delay(100); | 
					
						
							|  |  |  |  | 	delay(100); | 
					
						
							|  |  |  |  | 	delay(100); | 
					
						
							|  |  |  |  | 	delay(100); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	xferConfig.tx_data = Tx_Buf; | 
					
						
							|  |  |  |  | 	xferConfig.rx_data = Rx_Buf; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	comm_out(0xAE, &xferConfig);               //Display OFF
 | 
					
						
							|  |  |  |  | 	comm_out(0x40, &xferConfig);               //Display start address + 0x40
 | 
					
						
							|  |  |  |  | 	page = 0xB0; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	for(i=0;i<8;i++){            //32pixel display / 8 pixels per page = 4 pages
 | 
					
						
							|  |  |  |  |       comm_out(page, &xferConfig);            //send page address
 | 
					
						
							|  |  |  |  |       comm_out(0x10, &xferConfig);            //column address upper 4 bits + 0x10
 | 
					
						
							|  |  |  |  |       comm_out(0x00, &xferConfig);            //column address lower 4 bits + 0x00
 | 
					
						
							|  |  |  |  |       for(j=0;j<131;j++){         //128 columns wide
 | 
					
						
							|  |  |  |  | 		 data_out(0x00, &xferConfig); | 
					
						
							|  |  |  |  |          } | 
					
						
							|  |  |  |  |       page++;                  //after 128 columns, go to next page
 | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |     comm_out(0xAF, &xferConfig);  | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	comm_out(0xAE, &xferConfig);               //Display OFF
 | 
					
						
							|  |  |  |  | 	comm_out(0x40, &xferConfig);               //Display start address + 0x40
 | 
					
						
							|  |  |  |  | 	comm_out(0xB0, &xferConfig);  | 
					
						
							|  |  |  |  | 	comm_out(0x10, &xferConfig);            //column address upper 4 bits + 0x10
 | 
					
						
							|  |  |  |  |     comm_out(0x00, &xferConfig);            //column address lower 4 bits + 0x00
 | 
					
						
							|  |  |  |  | 	comm_out(0xAF, &xferConfig); | 
					
						
							|  |  |  |  | 	//delay(100);
 | 
					
						
							|  |  |  |  | 	return &xferConfig; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #ifdef  DEBUG
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | void data_out(unsigned char i, SSP_DATA_SETUP_Type *xferConfig) //Data Output Serial Interface
 | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  |    //unsigned int n;
 | 
					
						
							|  |  |  |  |    //CS = 0;               //Chip Select = Active
 | 
					
						
							|  |  |  |  |    GPIO_ClearValue(3,(1<<12)); | 
					
						
							|  |  |  |  |    //A0 = 1 = Data
 | 
					
						
							| 
									
										
										
										
											2013-09-12 14:26:20 +07:00
										 |  |  |  |    //GPIO_SetValue(4,(1<<10));
 | 
					
						
							| 
									
										
										
										
											2013-09-12 13:58:33 +07:00
										 |  |  |  |    //delay(1);   
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |    Tx_Buf[0] = i; | 
					
						
							|  |  |  |  |    xferConfig->tx_data = Tx_Buf; | 
					
						
							|  |  |  |  |    SSP_ReadWrite(LPC_SSP0, xferConfig, SSP_TRANSFER_POLLING); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |    //CS = 1;               //after 1 byte, Chip Select = inactive
 | 
					
						
							|  |  |  |  |    delay(1); | 
					
						
							|  |  |  |  |    GPIO_SetValue(3,(1<<12)); | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | void comm_out(unsigned char j, SSP_DATA_SETUP_Type *xferConfig) //Command Output Serial Interface
 | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  |    //unsigned int n;
 | 
					
						
							|  |  |  |  |    //CS = 0;			   //Chip Select = Active
 | 
					
						
							| 
									
										
										
										
											2013-09-12 14:26:20 +07:00
										 |  |  |  |    //GPIO_ClearValue(3,(1<<12));
 | 
					
						
							| 
									
										
										
										
											2013-09-12 13:58:33 +07:00
										 |  |  |  |    //A0 = 0;
 | 
					
						
							|  |  |  |  |    GPIO_ClearValue(4,(1<<10)); | 
					
						
							|  |  |  |  |    //delay(1);
 | 
					
						
							|  |  |  |  |     | 
					
						
							|  |  |  |  |    Tx_Buf[0] = j; | 
					
						
							|  |  |  |  |    xferConfig->tx_data = Tx_Buf; | 
					
						
							|  |  |  |  |    SSP_ReadWrite(LPC_SSP0, xferConfig, SSP_TRANSFER_POLLING); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |    //CS = 1;               //after 1 byte, Chip Select = inactive
 | 
					
						
							|  |  |  |  |    delay(1);								    | 
					
						
							|  |  |  |  |    GPIO_SetValue(3,(1<<12)); | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | void init_LCD(SSP_DATA_SETUP_Type *xferConfig)  | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	comm_out(0xA0, xferConfig);					 //RAM->SEG output = normal
 | 
					
						
							|  |  |  |  | 	comm_out(0xAE, xferConfig);                  //Display OFF
 | 
					
						
							|  |  |  |  | 	comm_out(0xC8, xferConfig);                  //COM scan direction = normal
 | 
					
						
							|  |  |  |  | 	comm_out(0xA2, xferConfig);                  //1/9 bias
 | 
					
						
							|  |  |  |  | 	 | 
					
						
							|  |  |  |  | 	comm_out(0x2F, xferConfig);                  //power control set
 | 
					
						
							|  |  |  |  | 	comm_out(0x20, xferConfig);                  //resistor ratio set
 | 
					
						
							|  |  |  |  | 	comm_out(0x81, xferConfig);                  //Electronic volume command (set contrast)
 | 
					
						
							|  |  |  |  | 	comm_out(0x1F, xferConfig);                  //Electronic volume value (contrast value)
 | 
					
						
							|  |  |  |  |     comm_out(0xAF, xferConfig); | 
					
						
							|  |  |  |  | 	delay(1); | 
					
						
							|  |  |  |  | 	comm_out(0xAE, xferConfig); | 
					
						
							|  |  |  |  | 	comm_out(0x21, xferConfig); | 
					
						
							|  |  |  |  | 	comm_out(0xAF, xferConfig); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	delay(100); | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | void Init_Indexes() { | 
					
						
							|  |  |  |  | 	 uint8_t i = 0, index = '!'; | 
					
						
							|  |  |  |  | 	 for(i = 1; i <= 93; i++, index++) { | 
					
						
							|  |  |  |  | 	 	  Char_Index[index] = i; | 
					
						
							|  |  |  |  | 	 } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	 Char_Index[' '] = 0; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | void WriteChar(char ch, SSP_DATA_SETUP_Type *xferConfig, uint8_t nHighlight) | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	uint8_t Col, i, index, temp; | 
					
						
							|  |  |  |  | 	uint8_t lcd_Values[5], needRefresh = 0, Chars_Displayed_c = 0; | 
					
						
							|  |  |  |  | 	UNS_16 raw_value[7], raw, DisplayStart,DisplayEnd, Page_No; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	comm_out(0xAE, xferConfig); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	//Update the array of characters that are displayed right now.
 | 
					
						
							|  |  |  |  | 	if(ch == '\b' || ch == '\r') { | 
					
						
							|  |  |  |  | 		comm_out(0xAF, xferConfig); | 
					
						
							|  |  |  |  | 		return; | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | 	if(ch != '\n') { | 
					
						
							|  |  |  |  | 	if(Number_of_Chars < MAX_CHARS_DISPLAYED) { | 
					
						
							|  |  |  |  | 		Chars_Displayed[Current_Index] = ch; | 
					
						
							|  |  |  |  | 		Current_Index++; | 
					
						
							|  |  |  |  | 		Number_of_Chars++; | 
					
						
							|  |  |  |  | 	} else { | 
					
						
							|  |  |  |  | 		Start_Index++; | 
					
						
							|  |  |  |  | 		if(Start_Index >= MAX_CHARS_DISPLAYED) { | 
					
						
							|  |  |  |  | 			Current_Index = Start_Index - 1; | 
					
						
							|  |  |  |  | 			Start_Index = 0;	 | 
					
						
							|  |  |  |  | 		} else { | 
					
						
							|  |  |  |  | 			Current_Index = Start_Index - 1; | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 		Chars_Displayed[Current_Index] = ch; | 
					
						
							|  |  |  |  | 		Current_Index++; | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	if(nHighlight) { | 
					
						
							|  |  |  |  | 		Highlight_Value[Current_Index-1] = Highlight;	 | 
					
						
							|  |  |  |  | 	} else { | 
					
						
							|  |  |  |  | 		Highlight_Value[Current_Index-1] = NoHighlight; | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	//Code to handle the next line character.
 | 
					
						
							|  |  |  |  | 	else { | 
					
						
							|  |  |  |  | 		index = (((Current_Index) + CHARS_PER_ROW) % CHARS_PER_ROW); //1 index
 | 
					
						
							|  |  |  |  | 		index = CHARS_PER_ROW - index; | 
					
						
							|  |  |  |  | 		ch = ' '; | 
					
						
							|  |  |  |  | 		for(temp = 0; temp < index; temp++) { | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 			if(Number_of_Chars < MAX_CHARS_DISPLAYED) { | 
					
						
							|  |  |  |  | 				Chars_Displayed[Current_Index] = ch; | 
					
						
							|  |  |  |  | 				Current_Index++; | 
					
						
							|  |  |  |  | 				Number_of_Chars++; | 
					
						
							|  |  |  |  | 			} else { | 
					
						
							|  |  |  |  | 				Start_Index++; | 
					
						
							|  |  |  |  | 				if(Start_Index >= MAX_CHARS_DISPLAYED) { | 
					
						
							|  |  |  |  | 					Current_Index = Start_Index - 1; | 
					
						
							|  |  |  |  | 					Start_Index = 0;	 | 
					
						
							|  |  |  |  | 				} else { | 
					
						
							|  |  |  |  | 					Current_Index = Start_Index - 1; | 
					
						
							|  |  |  |  | 				} | 
					
						
							|  |  |  |  | 				Chars_Displayed[Current_Index] = ch; | 
					
						
							|  |  |  |  | 				Current_Index++; | 
					
						
							|  |  |  |  | 			} | 
					
						
							|  |  |  |  | 			//Chars_Displayed[i] = ' ';
 | 
					
						
							|  |  |  |  | 			i++; | 
					
						
							|  |  |  |  | 			for(Col = 0; Col < FONT_WIDTH; Col++) | 
					
						
							|  |  |  |  |         	data_out(0, xferConfig); | 
					
						
							|  |  |  |  | 			//Start_Index++;
 | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 		//if(Number_of_Chars >= MAX_CHARS_DISPLAYED) {
 | 
					
						
							|  |  |  |  | 		if(!(Number_of_Chars < (MAX_CHARS_DISPLAYED + 1))) { | 
					
						
							|  |  |  |  | 			//Send the scrollbar
 | 
					
						
							|  |  |  |  | 			data_out(0xFF, xferConfig); | 
					
						
							|  |  |  |  | 			data_out(0x81, xferConfig); | 
					
						
							|  |  |  |  | 			data_out(0xFF, xferConfig); | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 		//Current_Index = i;
 | 
					
						
							|  |  |  |  | 		ch = '\n'; | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	//Find if the whole screen needs to be updated.
 | 
					
						
							|  |  |  |  | 	if(!(Number_of_Chars < (MAX_CHARS_DISPLAYED + 1))) { | 
					
						
							|  |  |  |  | 		if(((Start_Index + CHARS_PER_ROW) % CHARS_PER_ROW) == 1) { | 
					
						
							|  |  |  |  | 			needRefresh = 1; | 
					
						
							|  |  |  |  | 		} else { | 
					
						
							|  |  |  |  | 			needRefresh = 0; | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 		DisplayStart = Start_Index + CHARS_PER_ROW; | 
					
						
							|  |  |  |  | 		DisplayStart = DisplayStart - (DisplayStart % CHARS_PER_ROW); | 
					
						
							|  |  |  |  | 		if(DisplayStart >= MAX_CHARS_DISPLAYED) { | 
					
						
							|  |  |  |  | 			DisplayStart -= MAX_CHARS_DISPLAYED; | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 	} else { | 
					
						
							|  |  |  |  | 		 DisplayStart = Start_Index; | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | 	DisplayEnd = (Current_Index - 1); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	if(needRefresh == 0) { | 
					
						
							|  |  |  |  | 		DisplayStart = DisplayEnd; | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	Page_No = ((Number_of_Chars-1) / CHARS_PER_ROW); | 
					
						
							|  |  |  |  | 	Page_No |= 0xB0; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	if((Page_No == (0xB0 + NO_OF_ROWS)) && needRefresh == 1) { | 
					
						
							|  |  |  |  | 		Page_No = 0xB0; | 
					
						
							|  |  |  |  | 		comm_out(Page_No, xferConfig);            //send page address
 | 
					
						
							|  |  |  |  |     	comm_out(0x10, xferConfig);            //column address upper 4 bits + 0x10
 | 
					
						
							|  |  |  |  |     	comm_out(0x00, xferConfig);            //column address lower 4 bits + 0x00
 | 
					
						
							|  |  |  |  | 	} else if ((((Number_of_Chars-1) % CHARS_PER_ROW) == 0) && (Page_No != 0xB4)) { | 
					
						
							|  |  |  |  | 		comm_out(Page_No, xferConfig);            //send page address
 | 
					
						
							|  |  |  |  |     	comm_out(0x10, xferConfig);            //column address upper 4 bits + 0x10
 | 
					
						
							|  |  |  |  |     	comm_out(0x00, xferConfig);            //column address lower 4 bits + 0x00
 | 
					
						
							|  |  |  |  | 		Page_No++; | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	if(Number_of_Chars == MAX_CHARS_DISPLAYED) { | 
					
						
							|  |  |  |  | 		Number_of_Chars++; | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	if(ch == '\n') { | 
					
						
							|  |  |  |  | 		comm_out(0xAF, xferConfig); | 
					
						
							|  |  |  |  | 		return; | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	for(i = DisplayStart; i != (DisplayEnd+1); i++) { | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	if(Chars_Displayed_c == CHARS_PER_ROW) { | 
					
						
							|  |  |  |  | 		Page_No++; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 		//Send the scrollbar
 | 
					
						
							|  |  |  |  | 		if(needRefresh == 1){ | 
					
						
							|  |  |  |  | 			data_out(0xFF, xferConfig); | 
					
						
							|  |  |  |  | 			data_out(0xFF, xferConfig); | 
					
						
							|  |  |  |  | 			data_out(0xFF, xferConfig); | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 		comm_out(Page_No, xferConfig);            //send page address
 | 
					
						
							|  |  |  |  |     	comm_out(0x10, xferConfig);            //column address upper 4 bits + 0x10
 | 
					
						
							|  |  |  |  |     	comm_out(0x00, xferConfig);            //column address lower 4 bits + 0x00
 | 
					
						
							|  |  |  |  | 		Chars_Displayed_c = 0; | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	if(i == MAX_CHARS_DISPLAYED) { | 
					
						
							|  |  |  |  | 		i = 0; | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	//Calculate the indexes that are to be sent.
 | 
					
						
							|  |  |  |  | 	ch = Chars_Displayed[i]; | 
					
						
							|  |  |  |  | 	for(Col = 0; Col < 7; Col++) { | 
					
						
							|  |  |  |  | 		raw_value[Col] = x5x7_bits[(ch * 7) + Col]; | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	raw = 0; | 
					
						
							|  |  |  |  | 	raw = ((raw_value[0] & (0x8000)) >> 15) | ((raw_value[1] & (0x8000)) >> 14)	| ((raw_value[2] & (0x8000)) >> 13)| ((raw_value[3] & (0x8000)) >> 12) | ((raw_value[4] & (0x8000)) >> 11) | ((raw_value[5] & (0x8000)) >> 10) |  ((raw_value[6] & (0x8000)) >> 9); | 
					
						
							|  |  |  |  | 	lcd_Values[0] = raw; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	raw = 0; | 
					
						
							|  |  |  |  | 	raw = ((raw_value[0] & (0x4000)) >> 14) | ((raw_value[1] & (0x4000)) >> 13)	| ((raw_value[2] & (0x4000)) >> 12)| ((raw_value[3] & (0x4000)) >> 11) | ((raw_value[4] & (0x4000)) >> 10) | ((raw_value[5] & (0x4000)) >> 9) |  ((raw_value[6] & (0x4000)) >> 8); | 
					
						
							|  |  |  |  | 	lcd_Values[1] = raw; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	raw = 0; | 
					
						
							|  |  |  |  | 	raw = ((raw_value[0] & (0x2000)) >> 13) | ((raw_value[1] & (0x2000)) >> 12)	| ((raw_value[2] & (0x2000)) >> 11)| ((raw_value[3] & (0x2000)) >> 10) | ((raw_value[4] & (0x2000)) >> 9) | ((raw_value[5] & (0x2000)) >> 8) |  ((raw_value[6] & (0x2000)) >>7); | 
					
						
							|  |  |  |  | 	lcd_Values[2] = raw; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	raw = 0; | 
					
						
							|  |  |  |  | 	raw = ((raw_value[0] & (0x1000)) >> 12) | ((raw_value[1] & (0x1000)) >> 11)	| ((raw_value[2] & (0x1000)) >> 10)| ((raw_value[3] & (0x1000)) >> 9) | ((raw_value[4] & (0x1000)) >> 8) | ((raw_value[5] & (0x1000)) >> 7) |  ((raw_value[6] & (0x1000)) >> 6); | 
					
						
							|  |  |  |  | 	lcd_Values[3] = raw; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	lcd_Values[4] = 0; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     for(Col = 0; Col < FONT_WIDTH; Col++) { | 
					
						
							|  |  |  |  |         if(nHighlight || (Highlight_Value[i] == Highlight)) | 
					
						
							|  |  |  |  | 			data_out((~(lcd_Values[Col])) & 0x7F, xferConfig); | 
					
						
							|  |  |  |  | 		else | 
					
						
							|  |  |  |  | 			data_out(lcd_Values[Col], xferConfig); | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	Chars_Displayed_c++; | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  |     //data_out(0, xferConfig);
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	if(needRefresh == 1) { | 
					
						
							|  |  |  |  | 		//for(i = 0; i < CHARS_PER_ROW - 1; i++) {
 | 
					
						
							|  |  |  |  | 		for(i = 0; i < CHARS_PER_ROW - 1; i++) { | 
					
						
							|  |  |  |  | 			for(Col = 0; Col < FONT_WIDTH; Col++) | 
					
						
							|  |  |  |  |         	data_out(0, xferConfig); | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 		//Send the scrollbar
 | 
					
						
							|  |  |  |  | 		data_out(0xFF, xferConfig); | 
					
						
							|  |  |  |  | 		data_out(0x81, xferConfig); | 
					
						
							|  |  |  |  | 		data_out(0xFF, xferConfig); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 		comm_out(0x10, xferConfig);            //column address upper 4 bits + 0x10
 | 
					
						
							|  |  |  |  |     	comm_out(0x05, xferConfig);            //column address lower 4 bits + 0x00
 | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	comm_out(0xAF, xferConfig); | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #endif
 | 
					
						
							|  |  |  |  | #endif
 | 
					
						
							|  |  |  |  | /**
 | 
					
						
							|  |  |  |  |  * @} | 
					
						
							|  |  |  |  |  */ |