📄 hal_lcd.c
字号:
/**************************************************************************************************
Filename: hal_lcd.c
Revised: $Date: 2008-02-05 18:26:14 -0800 (Tue, 05 Feb 2008) $
Revision: $Revision: 16341 $
Description: This file contains the interface to the HAL LCD Service.
Copyright 2007 Texas Instruments Incorporated. All rights reserved.
IMPORTANT: Your use of this Software is limited to those specific rights
granted under the terms of a software license agreement between the user
who downloaded the software, his/her employer (which must be your employer)
and Texas Instruments Incorporated (the "License"). You may not use this
Software unless you agree to abide by the terms of the License. The License
limits your use, and you acknowledge, that the Software may not be modified,
copied or distributed unless embedded on a Texas Instruments microcontroller
or used solely and exclusively in conjunction with a Texas Instruments radio
frequency transceiver, which is integrated into your product. Other than for
the foregoing purpose, you may not use, reproduce, copy, prepare derivative
works of, modify, distribute, perform, display or sell this Software and/or
its documentation for any purpose.
YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE
PROVIDED 揂S IS?WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,
INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE,
NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL
TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,
NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER
LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES
INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE
OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT
OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES
(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.
Should you have any questions regarding your right to use this Software,
contact Texas Instruments Incorporated at www.TI.com.
**************************************************************************************************/
/**************************************************************************************************
* INCLUDES
**************************************************************************************************/
#include "hal_types.h"
#include "hal_lcd.h"
#include "OSAL.h"
#include "OnBoard.h"
#include "hal_assert.h"
#include <stdlib.h>
#include <string.h>
#include "font.h"
#if defined (ZTOOL_P1) || defined (ZTOOL_P2)
#include "DebugTrace.h"
#endif
/* LCD lines */
#define LCD_MAX_LINE_COUNT 3
#define LCD_MAX_LINE_LENGTH 16
#define LCD_MAX_BUF 25
/**************************************************************************************************
* CONSTANTS
**************************************************************************************************/
#define RECALIB_TIMEOUT 12000 // Every 2 minutes
#define MSG_PING 0x00
#define MSG_SEND 0x10
#define MSG_RECIVE 0x20
#define MSG_NEEDSEND 0x30
/****************************************************
* B) Command Table per device *
****************************************************/
#define DisplayOff 0xAE
#define DisplayOn 0xAF
#define DisplayStart 0x40
#define PageAddr 0xB0
#define ColAddrHi 0x10
#define ColAddrLo 0x00
#define SegRemapOff 0xA0
#define SegRemapOn 0xA1
#define NormalDisp 0xA6
#define ReverseDisp 0xA7
#define ExitEntireD 0xA4
#define EntEntireD 0xA5
#define EnterRMW 0xE0
#define ExitRMW 0xEE
#define SWRest 0xE2
#define ComRemapOff 0xC0
#define ComRemapOn 0xC8
#define PwrCtrlReg 0x28
#define OPampBuffer 0x01
#define IntReg 0x02
#define IntVolBstr 0x04
#define IntRegRatio 0x20
#define ContCtrlReg 0x81
#define CmdMuxRatio 0x48
#define CmdBiasRatio 0x50
#define DispOffset 0x44
#define IconModeOn 0xA3
#define IconModeOff 0xA2
#define NlineInver 0x4C
#define DCDCconver 0x64
#define PowersavStandby 0xA8
#define PowersavSleep 0xA9
#define PowersavOff 0xE1
#define InterOsc 0xAB
#define Device SSD1821 /* device under demo */
#define ColNo 132 /* number of Column/Seg on LCD glass*/
#define RowNo 64 /* number of Row/Com/Mux */
#define PS 1 /* fixed to Parallel mode */
#define PageNo 10 /* Total no of RAM pages */
#define IconPage 10 /* Icon Page number */
#define All0 6 /* 3 for all 0, 4 for all 1 */
#define All1 4
#define iIntRegValue 1 /*Internal Regulator Resistor Ratio Value */
#define iContCtrlRegValue 16 /* Contrast Control Register Value */
#define iIntRegValuea 1 /*Internal Regulator Resistor Ratio Value */
#define iContCtrlRegValuea 16 /* Contrast Control Register Value */
#define iIntRegValueb 1 /*Internal Regulator Resistor Ratio Value */
#define iContCtrlRegValueb 16 /* Contrast Control Register Value */
#define MSGNo 16
#define MSGLength 22
#define SSLNameNo 4
#define DevicePg 0 //RAM page for showing device name
#define FeaturePg 1 //RAM page for showing feature
#define GRAPHICNo 13
#define xlogo 38
#define ylogo 5
#define xsolomon 91
#define ysolomon 2
#define xsystech 81
#define ysystech 2
#define xlimited 70
#define ylimited 2
#define xcc 16
#define ycc 2
#define xpageq 128
#define ypageq 4
#define horizonal 0
#define d_time 60
////////////////////////////////////////////////////////////////////////////////////////////
/**************************************************************************************************
* MACROS
**************************************************************************************************/
/*
LCD pin control
P3.1 - SIMO
P3.2 - SOMI
P3.3 - CLK
P6.2 - LCD_CS
P6.3 - LCD_MODE
P6.4 - LCD_FLASH_RESET
*/
/* SPI interface control */
#define LCD_SPI_BEGIN() {P6OUT &= ~BV(2);} //P6.2
#define LCD_SPI_TX(x) { IFG2 &= ~UCB0RXIFG; UCB0TXBUF= x; }
#define LCD_SPI_RX() UCB0RXBUF
#define LCD_SPI_WAIT_RXRDY() { while (!(IFG2 & UCB0RXIFG)); }
#define LCD_SPI_END() { asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); P6OUT |= BV(2); }
/* Control macros */
#define LCD_DO_WRITE() {P6OUT |= BV(3);} //P6.3
#define LCD_DO_CONTROL() {P6OUT &= ~BV(3);} //P6.3
#define LCD_ACTIVATE_RESET() {P6OUT &= ~BV(4);} //P6.4
#define LCD_RELEASE_RESET() {P6OUT |= BV(4);} //P6.4
/* Port direction initialization */
#define LCD_CTRL_INIT_PORTS() st( P6DIR |= BV(3); P6DIR |= BV(4); ) //P6.3 P6.4
#define LCD_SPI_INIT_PORTS() st( P6DIR |= BV(2); P3SEL |= BV(1)|BV(2)|BV(3); ) //P6.2 P3.1.2.3
/**************************************************************************************************
* GLOBAL VARIABLES
**************************************************************************************************/
static uint8 *Lcd_Line1;
static uint8 ContrastValue = 0x12;
extern const uint8 FontSystem6x8[];
extern const uint8 Font8X8[];
extern const uint8 FontNew16X16[];
extern const uint8 FontNew8X16_Index[];
/**************************************************************************************************
* FUNCTIONS - API
**************************************************************************************************/
#if (HAL_LCD == TRUE)
void HalLcd_HW_Init(void);
void HalLcd_HW_Wait(uint16 i);
void HalLcd_HW_Clear(void);
void HalLcd_HW_ClearAllSpecChars(void);
void Lcdwritecom(uint8 cmd);
void Lcdwritedata(uint8 data);
void SetRamAddr (uint8 Page, uint8 Col);
void SetContrast(uint8 Gain, uint8 Step);
void InitDisplay(void);
void contrastctrl(uint8 start, uint8 stop);
void fdelay(unsigned int n);
void HalLcd_HW_SetContrast(uint8 value);
void HalLcd_HW_WriteChar(uint8 line, uint8 col, char text);
void HalLcd_HW_WriteLine(uint8 line, const char *pText);
void ClearScreen(void);
void Print(uint8 y, uint8 x, uint8 ch[], uint16 yn);
void Printn(uint8 xx ,uint8 yy , uint32 no,uint8 yn,uint8 le);
void Printn8(uint8 xx ,uint8 yy , uint32 no,uint8 yn,uint8 le);
void Print6(uint8 xx, uint8 yy, uint8 ch1[], uint8 yn);
void Print8(uint8 y,uint8 x,uint8 ch[],uint8 yn);
void Print16(uint8 y,uint8 x,uint8 ch[],uint8 yn);
void Rectangle(uint8 x1,uint8 y1,uint8 x2,uint8 y2);
#endif //LCD
/**************************************************************************************************
* @fn HalLcdInit
*
* @brief Initilize LCD Service
*
* @param init - pointer to void that contains the initialized value
*
* @return None
**************************************************************************************************/
void HalLcdInit(void)
{
Lcd_Line1 = NULL;
#if (HAL_LCD == TRUE)
HalLcd_HW_Init();
#endif
}
/*************************************************************************************************
* LCD EMULATION FUNCTIONS
*
* Some evaluation boards are equipped with Liquid Crystal Displays
* (LCD) which may be used to display diagnostic information. These
* functions provide LCD emulation, sending the diagnostic strings
* to Z-Tool via the RS232 serial port. These functions are enabled
* when the "LCD_SUPPORTED" compiler flag is placed in the makefile.
*
* Most applications update both lines (1 and 2) of the LCD whenever
* text is posted to the device. This emulator assumes that line 1 is
* updated first (saved locally) and the formatting and send operation
* is triggered by receipt of line 2. Nothing will be transmitted if
* only line 1 is updated.
*
*************************************************************************************************/
/**************************************************************************************************
* @fn HalLcdWriteString
*
* @brief Write a string to the LCD
*
* @param str - pointer to the string that will be displayed
* option - display options
*
* @return None
**************************************************************************************************/
void HalLcdWriteString ( char *str, uint8 option)
{
#if (HAL_LCD == TRUE)
uint8 strLen = 0;
uint8 totalLen = 0;
uint8 *buf;
uint8 tmpLen;
if ( Lcd_Line1 == NULL )
{
Lcd_Line1 = osal_mem_alloc( HAL_LCD_MAX_CHARS+1 );
HalLcdWriteString( "Figure8 Wireless", 1 );
}
strLen = (uint8)osal_strlen( (char*)str );
/* Check boundries */
if ( strLen > HAL_LCD_MAX_CHARS )
strLen = HAL_LCD_MAX_CHARS;
if ( option == HAL_LCD_LINE_1 )
{
/* Line 1 gets saved for later */
osal_memcpy( Lcd_Line1, str, strLen );
Lcd_Line1[strLen] = '\0';
}
else
{
/* Line 2 triggers action */
tmpLen = (uint8)osal_strlen( (char*)Lcd_Line1 );
totalLen = tmpLen + 1 + strLen + 1;
buf = osal_mem_alloc( totalLen );
if ( buf != NULL )
{
/* Concatenate strings */
osal_memcpy( buf, Lcd_Line1, tmpLen );
buf[tmpLen++] = ' ';
osal_memcpy( &buf[tmpLen], str, strLen );
buf[tmpLen+strLen] = '\0';
/* Send it out */
#if defined (ZTOOL_P1) || defined (ZTOOL_P2)
#if (SERIAL_DEBUG_SUPPORTED)
debug_str( (uint8*)buf );
#endif //LCD_SUPPORTED
#endif //ZTOOL_P1
/* Free mem */
osal_mem_free( buf );
}
}
/* Display the string */
HalLcd_HW_WriteLine (option, str);
#endif //HAL_LCD
}
/**************************************************************************************************
* @fn HalLcdWriteValue
*
* @brief Write a value to the LCD
*
* @param value - value that will be displayed
* radix - 8, 10, 16
* option - display options
*
* @return None
**************************************************************************************************/
void HalLcdWriteValue ( uint32 value, const uint8 radix, uint8 option)
{
#if (HAL_LCD == TRUE)
/* uint8 buf[LCD_MAX_BUF];
_ltoa( value, &buf[0], radix );
HalLcdWriteString( (char*)buf, option );*/
#endif
}
/**************************************************************************************************
* @fn HalLcdWriteScreen
*
* @brief Write a value to the LCD
*
* @param line1 - string that will be displayed on line 1
* line2 - string that will be displayed on line 2
*
* @return None
**************************************************************************************************/
void HalLcdWriteScreen( char *line1, char *line2 )
{
#if (HAL_LCD == TRUE)
HalLcdWriteString( line1, 1 );
HalLcdWriteString( line2, 2 );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -