?? m128128.c
字號:
/****************************************************************************************
* 文件名:LCDDRIVE.C
* 功能:圖形液晶240*128驅動(型號為SMG240128A)。32K顯示存,0000H-7FFFH地址。顯示是橫向字節,高位
* 在前。
* 說明:圖形液晶采用T6963C為LCD控制芯片,內帶負壓產生器,單5伏供電,并行接口(使用LPC2210驅動)。
* 硬件連接: D0--D7 <===> D0--D7
* /WR <===> nWE
* /RD <===> nOE
* /CE <===> nCS3_1
* C/D <===> A1
*
* /RST <===> VCC
****************************************************************************************/
/*********************************************************************
* INCLUDES
*/
#include "includes.h"
/*********************************************************************
* CONSTANTS
*/
#define LOW 0
#define HIGH 1
//#define ESC_KEY 0x1b
#define LCD_DISP_ON 0x3f // Controls the display onor off. Internal status and
#define LCD_DISP_OFF 0x3e // display RAM data is not affected.L:OFF, H:ON
#define LCD_SET_X( X ) ( 0x40 + X )
#define LCD_SET_Y( Y ) ( 0xb8 + Y )
#define LCD_DISP_START_L( L ) ( 0xc0 + L )
#define LCD_STATUS_BUSY 0x80
#define LCD_STATUS_READ() ( 0x80 & LCD_DATA_BUS )
/*********************************************************************
* MACROS
*/
#define LCD_DATA_BUS 0
#define LCD_CONTROL_BUS 0
#define LCD_DATA_BUS_CON 0
#define LCD_CONTROL_BUS_CON 0
#define PAGE_ALL_S ( ( LCD_CONTROL_BUS & 0xff ) | 0x0f )
#define PAGE_ALL_DS ( LCD_CONTROL_BUS & 0xf0 )
#define PAGE_1 ( ( LCD_CONTROL_BUS & 0xf0 ) | 0x01 )
#define PAGE_2 ( ( LCD_CONTROL_BUS & 0xf0 ) | 0x02 )
#define PAGE_3 ( ( LCD_CONTROL_BUS & 0xf0 ) | 0x04 )
#define PAGE_4 ( ( LCD_CONTROL_BUS & 0xf0 ) | 0x08 )
#define LCD_DATA_BUS_INIT() ( LCD_DATA_BUS_CON = ( ( LCD_DATA_BUS_CON & 0xffff0000 ) | 0x5555 ) )
#define LCD_CONTROL_BUS_INIT() ( LCD_CONTROL_BUS_CON = 0x5555 )
#define CMD ( LCD_CONTROL_BUS & ~0x10 )
#define DAT ( LCD_CONTROL_BUS | 0x10 )
#define WRITE ( LCD_CONTROL_BUS & ~0x20 )
#define READ ( LCD_CONTROL_BUS | 0x20 )
#define ENABLE ( LCD_CONTROL_BUS & ~0x40 )
#define DISNABLE ( LCD_CONTROL_BUS | 0x40 )
#define RESET ( LCD_CONTROL_BUS & ~0x80 )
#define WORK ( LCD_CONTROL_BUS | 0x80 )
#define LCD_PAGE_CS( PAGE_x ) ( LCD_CONTROL_BUS = PAGE_x )//( LCD_CONTROL_BUS & 0xf0 ) | ( 0x01 << PAGE_x ) )
#define RS( x ) ( LCD_CONTROL_BUS = x )
#define RW( x ) ( LCD_CONTROL_BUS = x )
#define CE( x ) ( LCD_CONTROL_BUS = x )
#define LCD_RESET( rst ) ( LCD_CONTROL_BUS = rst )
/*********************************************************************
* TYPEDEFS
*/
#define WRITE_IN_BUFFER 1
/*********************************************************************
* GLOBAL VARIABLES
*/
/*********************************************************************
* LOCAL VARIABLES
*/
/*********************************************************************
* GLOBAL FUNCTIONS
*/
/*********************************************************************
* LOCAL FUNCTIONS
*/
INT8U lcdWriteData( INT8U page, INT8U dat);
void LCD_WriteCommand(unsigned char page,unsigned char command);
void LCD_WriteData(unsigned char mode,unsigned char page,unsigned char data_in);
void set128128Addr(unsigned char mode,unsigned char x,unsigned char y);
void writeLcd128128Data(unsigned char mode,unsigned char x,unsigned char y,unsigned char data_in);
void LCD_Init(void);
/*********************************************************************
*********************************************************************/
/***********************************************************************
* 名稱:LCD_Init()
* 功能:LCM初始化,將LCM初始化為純圖形模式,顯示起始地址為0x0000,。
* 入口參數:無
* 出口參數:無
* 說明:函數會設置LCM數據總線為輸出方式
***********************************************************************/
LcdDispArea_s DispArea;
LcdDispCursor_s LcdCursor;
void LCD_Init(void)
{
}
/***********************************************************************
* 名稱:LCD_WriteData()
* 功能:寫1字節數據子程序。會先判斷狀態字。
* 入口參數:dat 要寫入LCM的數據
* 出口參數:操作出錯返回0,否則返回1
***********************************************************************/
INT8U lcdWriteData( INT8U page, INT8U dat)
{
return(1);
}
/***********************************************************************
* 原型:void wr_12864_data(unsigned char mode,unsigned char i,unsigned char data_in)
* 功能:給12864寫一個數據
* 入口參數:mode:寫入方式:1直接寫入,0取反后寫入
* i:選擇:1左半屏,2右半屏
* data_in:要寫入的數據
* 出口參數:無
***********************************************************************/
void LCD_WriteData(unsigned char mode,unsigned char page,unsigned char data_in)
{
if(mode)
lcdWriteData( page, data_in );
else
lcdWriteData( page, ~data_in);
}
/***********************************************************************
* 原型:void wr_12864_order(unsigned char i,unsigned char order)
* 功能:給12864寫一個指令
* 入口參數:i:選擇 1左半屏,2右半屏,3同時左右屏
* order:指令
* 出口參數:無
***********************************************************************/
void LCD_WriteCommand(unsigned char page,unsigned char command)
{
}
/***********************************************************************
* 原型:void set_12864_addr(unsigned char mode,unsigned char x,unsigned char y)
* 功能:設置lcd12864顯示座標
* 入口參數:mode:地址寫入方式:1只設置x地址,2只設置y地址,3同時設置x和y地址
* x:液晶x軸座標(0到127)
* y:液晶y軸座標(0到15)
* 出口參數:無
***********************************************************************/
void set128128Addr(unsigned char addr_mode,unsigned char x,unsigned char y)
{
INT8U page;
switch(addr_mode)
{
case SET_X: // 只寫X坐標
if ( x > 63 )
{
if( y > 7 )
page = PAGE_4;
else
page = PAGE_2;
LCD_WriteCommand( page, LCD_SET_X( x-64 ) );
break;
}
else
{
if( y > 7 )
page = PAGE_3;
else
page = PAGE_1;
LCD_WriteCommand( page, LCD_SET_X( x ) );
}
break;
case SET_Y: // 只寫Y坐標
if( y > 7 )
{
LCD_WriteCommand( PAGE_3, LCD_SET_Y( y-8 ) );
LCD_WriteCommand( PAGE_4, LCD_SET_Y( y-8 ) );
break;
}
else
{
LCD_WriteCommand( PAGE_1, LCD_SET_Y( y ) );
LCD_WriteCommand( PAGE_2, LCD_SET_Y( y ) );
}
break;
case SET_X_Y: // 同時寫X和Y坐標
if( y > 7 )
{
LCD_WriteCommand( PAGE_3, LCD_SET_Y( y-8 ) );
LCD_WriteCommand( PAGE_4, LCD_SET_Y( y-8 ) );
}
else
{
LCD_WriteCommand( PAGE_1, LCD_SET_Y( y ) );
LCD_WriteCommand( PAGE_2, LCD_SET_Y( y ) );
}
if ( x > 63 )
{
if( y > 7 )
page = PAGE_4;
else
page = PAGE_2;
LCD_WriteCommand( page, LCD_SET_X( x-64 ) );
break;
}
else
{
if( y > 7 )
page = PAGE_3;
else
page = PAGE_1;
LCD_WriteCommand( page, LCD_SET_X( x ) );
}
break;
default: break;
}
}
/***********************************************************************
* 原型:void open_12864(unsigned char mode)
* 功能:12864開顯示
* 入口參數:page:選擇:1左半屏,2右半屏,3左右屏
* 出口參數:無
***********************************************************************/
void LCD_On (void) { LCD_WriteCommand( PAGE_ALL_S,LCD_DISP_ON); }
/***********************************************************************
* 原型:void shut_12864(unsigned char mode)
* 功能:12864關顯示
* 入口參數:page:選擇:1左半屏,2右半屏,3左右屏
* 出口參數:無
***********************************************************************/
void LCD_Off (void) { LCD_WriteCommand(PAGE_ALL_S,LCD_DISP_OFF); }
/***********************************************************************
* 原型:void write_lcd12864_data( unsigned char mode,unsigned char x,
* unsigned char y,unsigned char data_in)
* 功能:給12864指定座標寫數據
* 入口參數:mode 寫入方式:1直接寫入,0取反后寫入
* x 屏幕x軸座標(0到127)
* y 屏幕y軸座標(0到7)
* data_in 要寫入的數據
* 出口參數:無
***********************************************************************/
void writeLcd128128Data(unsigned char mode,unsigned char x,unsigned char y,unsigned char data_in)
{
INT8U page;
if( y > 7 )
{
if( x > 63 )
{
page = PAGE_4;
x -= 64;
}
else
{
page = PAGE_3;
}
y -= 8;
}
else
{
if( x > 63 )
{
page = PAGE_2;
x -= 64;
}
else
{
page = PAGE_1;
}
}
LCD_WriteCommand( page, LCD_SET_Y( y ) );
LCD_WriteCommand( page, LCD_SET_X( x ) );
LCD_WriteData( mode, page, data_in );
}
/*------------------ esay GUI ---------------------*/
INT8U lcd_buffer[ 16 ][ 128 ];
INT8U Xy_Map=0;
/******************************************************************************************************************
* 函數名稱:LCM12864_ReadByte()
* 功 能:從顯示緩沖區讀取指定點上的數據。
* 入口參數:x x坐標值(0-127)
* y y坐標值(0-63)
* 出口參數:返回該點上的字節數據。
*******************************************************************************************************************/
INT8U LCM128128_ReadByte(INT32U x, INT32U y)//修改:把INT8U改成int
{
/* 參數過濾 */ //修改:去掉參數過濾
//x = x&0x7f;
//y = y&0x3f;
y = y>>3;
return (lcd_buffer[y][x]); // 返回顯示緩沖區指定點上的數據
}
/***********************************************************************
* 函數名稱:GUI_FillSCR()
* 功 能:全屏填充。填充顯示緩沖區及LCM12864。
* 入口參數:data 填充的數據
* 出口參數:無
***********************************************************************/
void GUI_FillSCR(INT8U data)
{
INT32U x;
INT32U y;
/* 填充顯示緩沖區 */
for( y = 0; y<(GUI_LCM_YMAX>>2); y++)
{
for(x=0; x<GUI_LCM_XMAX; x++)
gui_disp_buf[y][x] = data;
}
}
INT8U const DEC_HEX_TAB[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
/***********************************************************************
* 函數名稱:GUI_Point()
* 功 能:在指定位置上畫點。
* 入口參數:x 指定點所在列的位置
* y 指定點所在行的位置
* color 對于黑白色或藍白色LCM12864,為0時滅,為1時顯示
* 出口參數:返回值為1時表示操作成功,為0時表示操作失敗。
***********************************************************************/
INT8U GUI_Point( INT32U x, INT32U y, INT16U color )
{
INT32U bak;
/* 參數過濾 */
if( x >= GUI_LCM_XMAX ) return(0);
if( y >= GUI_LCM_YMAX ) return(0);
switch( Xy_Map )
{
//case 0:break;
case 1:
bak=x;
x=y;
y=GUI_LCM_XMAX-bak-1;
break;
case 2:
x=GUI_LCM_XMAX-x-1;
y=GUI_LCM_YMAX-y-1;
break;
case 3:break;
}
/* 設置相應的點為1或0 */
bak = LCM128128_ReadByte( x, y );
if( 0 == color )
{
bak &= (~DEC_HEX_TAB[y&0x07]);
}
else
{
bak |= DEC_HEX_TAB[y&0x07];
}
y=y>>3;
lcd_buffer[y][x] = bak;
return (1);
}
/***********************************************************************
* 函數名稱:GUI_ReadPoint()
* 功 能:讀取指定點的顏色。
* 入口參數:x 指定點所在列的位置
* y 指定點所在行的位置
* ret 保存顏色值的指針
* 出口參數:返回0表示指定地址超出緩沖區范圍。
* 說 明:對于單色,設置ret的d0位為1或0
***********************************************************************/
INT8U GUI_ReadPoint( int x, int y, int *ret )
{
INT32U bak;
/* 參數過濾 */
if( x >= GUI_LCM_XMAX ) return(0);
if( y >= GUI_LCM_YMAX ) return(0);
switch(Xy_Map)
{
case 0:break;
case 1:
bak=x;
x=y;
y=GUI_LCM_XMAX-bak-1;
break;
case 2:
x=GUI_LCM_XMAX-x-1;
y=GUI_LCM_YMAX-y-1;
break;
case 3:break;
}
bak = LCM128128_ReadByte(x,y);
if( (bak & ( DEC_HEX_TAB[ y & 0x07 ] ) ) == 0 )
*ret = 0x00;
else
*ret = 0x01;
return(1);
}
/***********************************************************************
* 函數名稱:Refresh_FrameBuffer()
* 功 能:刷新屏幕。
* 入口參數:無
* 出口參數:無
***********************************************************************/
INT8U RefreshFrameBuffer(INT8U disp_mode )
{
INT8U x = 0;
INT8U y = 0;
INT8U page;
for( y = 0; y <= 15; y++ )
{
set128128Addr( SET_X_Y, 0, y );
for( x = 0; x <= 127; x++ )
{
if( x == 0 )
set128128Addr( SET_X_Y, 0, y );
if(x<64)
{
if( y > 7 )
page = PAGE_3;
else
page = PAGE_1;
LCD_WriteData( disp_mode, page, lcd_buffer[y][x] );
}
if(x==64)
set128128Addr(SET_X_Y,x,y);
if(x>63)
{
if( y > 7 )
page = PAGE_4;
else
page = PAGE_2;
LCD_WriteData( disp_mode, page, lcd_buffer[y][x] );
}
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -