?? lcdrive.c
字號:
/********************************************************************************************************
** 文件名:LCDDRIVE.C
** 功能:圖形液晶240×128驅動(型號為YMSP-G240128A-1)。使用的SDRAM型號為62256A,為32K顯存,地址為0000H~7FFFH。
** 顯示是橫向字節,高位在前。
** 說明:圖形液晶采用T6963C液晶控制芯片,單5V供電。
**
**
*********************************************************************************************************/
#include "config.h"
#include "ASCII816.h" //標準ASCII庫
#include "HZTable.h" //漢字點陣庫
#include "menu.h" //菜單庫
//以8*8字符計算,顯示屏橫向、縱向可以顯示的字符個數
#define LineChar GUI_LCM_XMAX/8 //一行字符數
#define ColumnChar GUI_LCM_XMAX/8 //一列字符數
uint8 gui_disp_buf[][GUI_LCM_XMAX/8]; //聲明顯示緩沖區
void DelayNS1(uint32 dly)
{ uint32 i;
for(; dly>0; dly--)
{
for(i=0; i<500; i++);
}
}
/***LCM地址***/
#define YM240128_COM (*((volatile unsigned short *)0x82400006))
#define YM240128_DAT (*((volatile unsigned short *)0x82400004))
/********************************************************************************************************
** 名稱:LCD_WriteCommand()
** 功能:寫命令子程序(發送命令前,不檢查液晶模塊的狀態)
** 入口參數:command 要寫入LCM的命令字
** 出口參數:無
** 說明:函數會設置LCM數據總線為輸出方式
*********************************************************************************************************/
//#define LCD_WriteCommand(command) YM240128_COM = (uint16)command
void LCD_WriteCommand(uint8 command)
{
//volatile uint8 rr;
//rr = command;
//(*((volatile unsigned short *)0x81F00004))= rr;
YM240128_COM = (uint16)command;
}
/********************************************************************************************************
** 名稱:LCD_WriteData()
** 功能:寫數據子程序(發送數據前,不檢查液晶模塊的狀態)
** 入口參數:dat 要寫入LCM的數據
** 出口參數:無
** 說明:函數會設置LCM數據總線為輸出方式
*********************************************************************************************************/
//#define LCD_WriteData(dat) YM240128_DAT = (uint16)dat
void LCD_WriteData(uint8 dat)
{
//volatile uint8 rr;
//rr = dat;
//(*((volatile unsigned short *)0x81F00004))= rr;
YM240128_DAT = (uint16)dat;
}
/********************************************************************************************************
** 名稱:LCD_ReadState()
** 功能:讀取狀態字子程序
** 入口參數:無
** 出口參數:返回值即為讀出的狀態字
** 說明:函數會設置LCM數據總線為輸出方式
*********************************************************************************************************/
//#define LCD_ReadState() YM240128_COM
uint32 LCD_ReadState(void)
{
return YM240128_COM;
}
/********************************************************************************************************
** 名稱:LCD_ReadData()
** 功能:讀取數據子程序
** 入口參數:無
** 出口參數:返回值即為讀出的數據
** 說明:函數會設置LCM數據總線為輸出方式
*********************************************************************************************************/
//#define LCD_ReadData() YM240128_DAT
uint32 LCD_ReadData(void)
{
return YM240128_DAT;
}
/*以下為LCM的驅動層,主要負責發送T6963的各種命令,提供設置顯示地址等功能,在發送命令前會檢測其狀態字。
帶參數命令模式:先參數,后命令;操作模式:先命令,后數據 (先傳遞的是參數)*/
/*T6963命令定義*/
#define LCD_CUR_POS 0x21 /*光標位置設置(只有設置到有效顯示地址并打開顯示時才看到)*/
#define LCD_CGR_POS 0x22 /*CGRAM偏置地址設置(可以增加自己的符號)*/
#define LCD_ADR_POS 0x24 /*地址指針位置(設置讀寫操作指針)*/
#define LCD_TXT_STP 0x40 /*文本區首地址(從此地址開始向屏幕左上角顯示字符)*/
#define LCD_TXT_WID 0x41 /*文本區寬度(設置顯示寬度,N/6或N/8,其中N為x軸的點數)*/
#define LCD_GRH_STP 0x42 /*圖形區首地址(從此地址開始向屏幕左上角顯示字符)*/
#define LCD_GRH_WID 0x43 /*圖形區寬度(設置顯示寬度,N/6或N/8,其中N為x軸的點數)*/
#define LCD_MOD_OR 0x80 /*顯示方式:邏輯"或"*/
#define LCD_MOD_XOR 0x81 /*顯示方式:邏輯"異或"*/
#define LCD_MOD_AND 0x82 /*顯示方式:邏輯"與"*/
#define LCD_MOD_TCH 0x83 /*顯示方式:文本特征*/
#define LCD_DIS_SW 0x90 /*顯示開關:D0=1/0,光標閃爍啟用/禁用*/
/* D1=1/0,光標顯示啟用/禁用*/
/* D2=1/0,文本顯示啟用/禁用(打開后再使用)*/
/* D3=1/0,圖形顯示啟用/禁用(打開后再使用)*/
#define LCD_CUR_SHP 0xA0 /*光標形狀選擇:0xA0~0xA7表示光標占的行數*/
#define LCD_AUT_WR 0xB0 /*自動寫設置*/
#define LCD_AUT_RD 0xB1 /*自動讀設置*/
#define LCD_AUT_OVR 0xB2 /*自動讀/寫結束*/
#define LCD_INC_WR 0xC0 /*數據一次寫,地址加1*/
#define LCD_INC_RD 0xC1 /*數據一次讀,地址加1*/
#define LCD_DEC_WR 0xC2 /*數據一次寫,地址減1*/
#define LCD_DEC_RD 0xC3 /*數據一次讀,地址減1*/
#define LCD_NOC_WR 0xC4 /*數據一次寫,地址不變*/
#define LCD_NOC_RD 0xC5 /*數據一次讀,地址不變*/
#define LCD_SCN_RD 0xE0 /*屏讀*/
#define LCD_SCN_CP 0xE8 /*屏拷貝*/
#define LCD_BIT_OP 0xF0 /*位操作:D0~D2用于定義D0~D7。D3為1時置位,為0時清除。*/
/********************************************************************************************************
** 名稱:LCD_TestStaBit01()
** 功能:判斷讀寫指令和讀寫數據是否允許
** 入口參數:無
** 出口參數:返回0表示禁止,否則表示允許
*********************************************************************************************************/
uint8 LCD_TestStaBit01(void)
{ uint8 i;
uint32 RState;
DelayNS1(1);
for(i=100;i>0;i--)
{
RState = LCD_ReadState();
if((RState&0x03)==0x03) break;
DelayNS1(1);
}
if((RState&0x08)==0x08)
{
LCD_WriteCommand(LCD_AUT_OVR);
}
return(i);
}
/********************************************************************************************************
** 名稱:LCD_TestStaBit3()
** 功能:數據自動寫狀態是否允許
** 入口參數:無
** 出口參數:返回0表示禁止,否則表示允許
*********************************************************************************************************/
uint8 LCD_TestStaBit3(void)
{ uint8 i;
for(i=100;i>0;i--)
{ if((LCD_ReadState()&0x08)==0x08) break;
}
return(i);
}
/********************************************************************************************************
** 名稱:LCD_WriteTCommand1()
** 功能:寫無參數命令子程序。會先判斷LCM狀態字
** 入口參數:command 要寫入LCM的命令字
** 出口參數:操作出錯返回0,否則返回1
*********************************************************************************************************/
uint8 LCD_WriteTCommand1(uint8 command)
{
if(LCD_TestStaBit01()==0) return(0);
LCD_WriteCommand(command); //發送命令字
return(1);
}
/********************************************************************************************************
** 名稱:LCD_WriteTCommand3()
** 功能:寫雙參數命令子程序。會先判斷LCM狀態字
** 入口參數:command 要寫入LCM的命令字
** dat1 參數1
** dat2 參數2
** 出口參數:操作出錯返回0,否則返回1
** 說明:先發送兩字節參數數據,再發送命令字
*********************************************************************************************************/
uint8 LCD_WriteTCommand3(uint8 command, uint8 dat1, uint8 dat2)
{
if(LCD_TestStaBit01()==0) return(0);
LCD_WriteData(dat1); //發送參數1
if(LCD_TestStaBit01()==0) return(0);;
LCD_WriteData(dat2); //發送參數2
if(LCD_TestStaBit01()==0) return(0);
LCD_WriteCommand(command); //發送命令字
return(1);
}
/********************************************************************************************************
** 名稱:LCD_WriteTCommand2()
** 功能:寫單參數命令子程序。會先判斷LCM狀態字
** 入口參數:command 要寫入LCM的命令字
** dat1 參數1
** 出口參數:操作出錯返回0,否則返回1
** 說明:先發送參數數據,再發送命令字
*********************************************************************************************************/
uint8 LCD_WriteTCommand2(uint8 command, uint8 dat1)
{ if(LCD_TestStaBit01()==0) return(0);
LCD_WriteData(dat1); //發送參數1
if(LCD_TestStaBit01()==0) return(0);
LCD_WriteCommand(command); //發送命令字
return(1);
}
/********************************************************************************************************
** 名稱:LCD_WriteTData1()
** 功能:寫1字節數據子程序。會先判斷LCM狀態字
** 入口參數:dat 要寫入LCM的數據
** 出口參數:操作出錯返回0,否則返回1
*********************************************************************************************************/
uint8 LCD_WriteTData1(uint8 dat)
{ if(LCD_TestStaBit3()==0) return(0);
//DelayNS1(2);
LCD_WriteData(dat); //發送參數1
return(1);
}
/********************************************************************************************************
** 名稱:LCD_Initialize()
** 功能:LCM初始化,將LCM初始化為純圖形模式,顯示地址為0x0000
** 入口參數:無
** 出口參數:無
** 說明:函數會設置LCM數據總線為輸出方式
*********************************************************************************************************/
void LCD_Initialize(void)
{
if(LCD_WriteTCommand3(LCD_TXT_STP,0x00,0x00) != 0) // 文本顯示區首地址
LCD_WriteTCommand3(LCD_TXT_WID,0x1E,0x00); // 文本顯示區寬度
LCD_WriteTCommand3(LCD_GRH_STP,0x00,0x00); // 圖形顯示區首地址
LCD_WriteTCommand3(LCD_GRH_WID,0x1E,0x00); // 圖形顯示區寬度
LCD_WriteTCommand1(LCD_CUR_SHP | 0x01); // 光標形狀
LCD_WriteTCommand1(LCD_MOD_OR); // 顯示方式設置
LCD_WriteTCommand1(LCD_DIS_SW | 0x08); // 顯示開關設置
}
/********************************************************************************************************
** 名稱:LCD_FillAll()
** 功能:LCD填充。以圖形方式進行填充,起始地址為0x0000
** 入口參數:dat 要填充的數據
** 出口參數:無
** 說明:函數會設置LCM數據總線為輸出方式
*********************************************************************************************************/
void LCD_FillAll(uint8 dat)
{ uint32 i;
LCD_WriteTCommand1(LCD_MOD_OR);
LCD_WriteTCommand1(LCD_DIS_SW|0x08);
DelayNS1(1);
LCD_WriteTCommand3(LCD_ADR_POS,0x00,0x00); //置地址指針
LCD_WriteTCommand1(LCD_AUT_WR); //自動寫
for(i=0;i<128*30;i++)
{ //寫數據
LCD_WriteTData1(dat);
}
LCD_WriteTCommand1(LCD_AUT_OVR); //自動寫結束
LCD_WriteTCommand3(LCD_ADR_POS,0x00,0x00); //重置地址指針
}
/********************************************************************************************************
** 名稱:LCD_FillRect()
** 功能:LCD填充一塊黑塊,表示選擇了該行。以圖形方式進行填充
** 入口參數:lin行,column列,level子目錄或文件的級數,用來縮進,根目錄=0
** 出口參數:無
** 說明:函數會設置LCM數據總線為輸出方式
*********************************************************************************************************/
void LCD_FillRect(uint8 lin,uint8 level)
{ uint32 i,j;
uint32 StartAddr;
StartAddr=lin*LineChar + (12+level*2); //定位起始行
LCD_WriteTCommand1(LCD_MOD_OR);
LCD_WriteTCommand1(LCD_DIS_SW|0x08);
DelayNS1(1);
for(j=0;j<16;j++) //填充的高度
{
LCD_WriteTCommand3(LCD_ADR_POS,StartAddr&0xFF,StartAddr>>8); //置地址指針
for(i=0;i<(30-12-2*level);i++) //填充的寬度
{ //寫數據
LCD_WriteTCommand2(LCD_INC_WR,0xFF);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -