?? lcd.c
字號(hào):
/* File: LCD.C */
/****************************************************************************
*
* STK16XSW.LCD
* ============
*
* Routines for controlling LCD with 2x16 characters on I2C bus
*
* TQ-Systems GmbH
* ---------------
* Customer: TQ-Components
* Project : STK16XSW
* Tools : uVision 2.05
*
* Rev: Date: Name: Modification:
* ----+---------+----------------+------------------------------------------
* 100 16.01.01 A. Lichte taken over from STK16X.506
*****************************************************************************/
/****************************************************************************
*
* availability summary
*
* available for Starterkit: STK16X STK16XU
* conformed for Starterkit: STK16X
* available for Modul : TQM164 TQM165 TQM165U TQM166 TQM167
* TQM167LC TQM167U TQM167UL
* conformed for Modul : TQM164 TQM165 TQM165U TQM166 TQM167
* TQM167LC TQM167U TQM167UL
*****************************************************************************/
/*==========================================================================*
* pragmas:
*===========================================================================*/
/*==========================================================================*
* include files (#INCLUDE):
*===========================================================================*/
/*--------------------------------------------------------------------------*
* standard include files:
*---------------------------------------------------------------------------*/
#include <string.h> /* string functions */
#include <reg167.h> /* special function register */
/*--------------------------------------------------------------------------*
* project specific include files:
*---------------------------------------------------------------------------*/
#include "lcd.h"
#include "timer.h"
#include "i2cio.h"
/*==========================================================================*
* module internal definitions (#DEFINE):
*===========================================================================*/
/*==========================================================================*
* module internal type declarations (TYPEDEF):
*===========================================================================*/
/*==========================================================================*
* module internal constants (CONST):
*===========================================================================*/
/*==========================================================================*
* extern available constants (CONST):
*===========================================================================*/
/*==========================================================================*
* modul internal variables:
*===========================================================================*/
/*--------------------------------------------------------------------------*
* LCD
*---------------------------------------------------------------------------*/
sbit LCD_EN = P3^15;
sbit LCD_EN_DIR = DP3^15;
BYTE lcd_pos; /* actual cursor position */
BYTE lcd_ctrl = 0xFF; /* shadow register for lcd data/ctrl signals */
/*==========================================================================*
* globale external available variables (EXTERN):
*===========================================================================*/
/*==========================================================================*
* modul internal functions:
*===========================================================================*/
/*--------------------------------------------------------------------------*
* void LCD_RSEL(BYTE mode)
*---------------------------------------------------------------------------*
* FT: set RSEL for LCD in shadow register
* EP: mode = 0: command register; 1: data register
* RW: -
* GP: shadow register lcd_ctrl
*---------------------------------------------------------------------------*/
void LCD_RSEL(BYTE mode)
{
lcd_ctrl = mode ? (lcd_ctrl | 0x10) : (lcd_ctrl & 0xEF);
/* I/O pin will be actualized by the next LCD access */
}
/*--------------------------------------------------------------------------*
* void lcd_4bit_write(BYTE data)
*---------------------------------------------------------------------------*
* FT: write data to display with 4 bit data path
* EP: data = data to be written
* RW: -
* GP: shadow register lcd_ctrl
*---------------------------------------------------------------------------*/
void lcd_4bit_write(BYTE data)
{ int i;
lcd_ctrl = (lcd_ctrl & 0xD0) | (0x0F & data);
i2c_write(LCD_I2C_ADR,1,lcd_ctrl); /* write data to LCD through i2c-bus */
/* generate strobe on LCD_EN: */
for (i=1; i<1000; i++);
LCD_EN=0;
for (i=1; i<1000; i++);
LCD_EN=1;
for (i=1; i<1000; i++);
LCD_EN=0;
}
/*--------------------------------------------------------------------------*
* BYTE lcd_read(void)
*---------------------------------------------------------------------------*
* FT: write command to display with 4 bit data width
* EP: -
* RW: data from display
* GP: shadow register lcd_ctrl
*---------------------------------------------------------------------------*/
BYTE lcd_read(void)
{ USHORT data1, data2;
lcd_ctrl = (lcd_ctrl & 0xC0) | 0x2F;
i2c_write(LCD_I2C_ADR, 1, lcd_ctrl); /* set: 8 bit interface */
LCD_EN = 1;
i2c_read(LCD_I2C_ADR, 1, &data1); /* read high nibble from LCD */
LCD_EN = 0;
timer_delay_20us(1); /* delay 20 us */
LCD_EN = 1;
i2c_read(LCD_I2C_ADR, 1, &data2); /* read low nibble from LCD */
LCD_EN = 0;
return(((data1 << 4) & 0xF0) | (data2 & 0x0F));
}
/*--------------------------------------------------------------------------*
* BYTE lcd_write(BYTE data)
*---------------------------------------------------------------------------*
* FT: write to display splitted in two 4 bit wide accesses
* EP: data = data / command to be written
* RW: data = command which has been written
* GP: -
*---------------------------------------------------------------------------*/
BYTE lcd_write(BYTE data)
{
lcd_4bit_write(data >> 4); /* write high nibble */
lcd_4bit_write(data); /* write low nibble */
return (data);
}
/*==========================================================================*
* extern available functions:
*===========================================================================*/
/*--------------------------------------------------------------------------*
* void lcd_init(void)
*---------------------------------------------------------------------------*
* FT: initialization LCD
* EP: -
* RW: -
* GP: lcd_pos = cursor position
*---------------------------------------------------------------------------*/
void lcd_init(void)
{
/* port configuration: */
LCD_EN = 0;
LCD_EN_DIR = 1; /* set LCD enable as output */
LCD_EN = 1;
LCD_RSEL(0); /* select command register */
/* commands to initialize send: */
/* 1st LCD initializations step: */
timer_delay_20us(750); /* delay 15 ms */
lcd_4bit_write(0x03); /* configure LCD for 8 Bit interface */
/* 2nd LCD initializations step: */
timer_delay_20us(250); /* delay 5 ms */
lcd_4bit_write(0x03); /* configure LCD for 8 Bit interface */
/* 3rd LCD initializations step: */
timer_delay_20us(250); /* delay 5 ms */
lcd_4bit_write(0x02); /* configure LCD for 4 Bit interface */
/* from this step on always two 8 bit cycles are required */
/* 4th LCD initializations step: */
timer_delay_20us(50); /* delay 1 ms */
lcd_write(0x2C); /* configure LCD for 2 lines */
/* and 5x10 dots */
/* 5th LCD initializations step: */
timer_delay_20us(50); /* delay 1 ms */
lcd_write(0x08); /* display off */
/* 6th LCD initializations step */
timer_delay_20us(50); /* delay 1 ms */
lcd_write(0x01); /* display clear */
/* 7th LCD initializations step: */
timer_delay_20us(50); /* delay 1 ms */
lcd_write(0x06); /* entry mode set; auto cursor left */
/* 8th LCD initializations step: */
timer_delay_20us(50); /* delay 1 ms */
lcd_write(0x0C); /* display on */
lcd_pos = 0; /* set cursor position to 0 */
}
/*--------------------------------------------------------------------------*
* void lcd_clr(void)
*---------------------------------------------------------------------------*
* FT: clear LCD
* EP: -
* RW: -
* GP: lcd_pos = cursor position
*---------------------------------------------------------------------------*/
void lcd_clr(void)
{
LCD_RSEL(0); /* select command register */
lcd_write(0x01); /* clear display */
timer_delay_20us(100); /* delay 2 ms */
lcd_pos = 0; /* set cursor position to 0 */
}
/*--------------------------------------------------------------------------*
* void lcd_setpos(BYTE new_pos)
*---------------------------------------------------------------------------*
* FT: set cursor to any position on the display
* EP: new_pos: position on display
* +----------------------------------------------------+
* | 0: upper left corner 15: upper right corner|
* |64: lower left corner 79: lower right corner|
* +----------------------------------------------------+
* RW: -
* GP: lcd_pos = cursor position
*---------------------------------------------------------------------------*/
void lcd_setpos(BYTE new_pos)
{
lcd_pos = new_pos; /* save new cursor position */
LCD_RSEL(0); /* select command register */
lcd_write(lcd_pos | 0x80); /* set cursor to new position */
}
/*--------------------------------------------------------------------------*
* void lcd_home(void)
*---------------------------------------------------------------------------*
* FT: set cursor on upper left corner on display
* EP: -
* RW: -
* GP: lcd_pos = cursor position
*---------------------------------------------------------------------------*/
void lcd_home(void)
{
lcd_pos = 0; /* set cursor position to 0 */
LCD_RSEL(0); /* select command register */
lcd_write(lcd_pos | 0x80); /* set cursor on display */
}
/*--------------------------------------------------------------------------*
* void lcd_newline(void)
*---------------------------------------------------------------------------*
* FT: change to next line on display
* previous line = 1: change to line 2
* previous line = 2: change to line 1
* EP: -
* RW: -
* GP: lcd_pos = cursor position
*---------------------------------------------------------------------------*/
void lcd_newline(void)
{
lcd_pos = (lcd_pos ^ 0x40) & 0x40; /* calculate new cursor position */
/* => new cursor position: 0 or 64 */
LCD_RSEL(0); /* select command register */
lcd_write(lcd_pos | 0x80); /* set cursor to new position */
}
/*--------------------------------------------------------------------------*
* void lcd_left(void)
*---------------------------------------------------------------------------*
* FT: move cursor one step left
* EP: -
* RW: -
* GP: lcd_pos = cursor position
*---------------------------------------------------------------------------*/
void lcd_left(void)
{
lcd_pos = (lcd_pos - 1) & 0x4F; /* calculate new cursor position */
LCD_RSEL(0); /* select command register */
lcd_write(lcd_pos | 0x80); /* set cursor to new position */
}
/*--------------------------------------------------------------------------*
* void lcd_right(void)
*---------------------------------------------------------------------------*
* FT: move cursor one step right
* EP: -
* RW: -
* GP: lcd_pos = cursor position
*---------------------------------------------------------------------------*/
void lcd_right(void)
{
lcd_pos = (lcd_pos + 1); /* calculate new cursor position */
if (lcd_pos & 0x10)
{
lcd_newline(); /* new line if necessary */
}
LCD_RSEL(0); /* select command register */
lcd_write(lcd_pos | 0x80); /* set cursor to new position */
}
/*--------------------------------------------------------------------------*
* BYTE lcd_charout(BYTE c)
*---------------------------------------------------------------------------*
* FT: write character c to display at actual cursor position
* and move cursor one step right
* EP: c = character to be written
* RW: character which has been written
* GP: -
*---------------------------------------------------------------------------*/
BYTE lcd_charout(BYTE c)
{
switch (c)
{
case LF : lcd_newline(); break;
case '
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -