?? lcm_drive.c
字號:
/***********************************************************************
* 文件名:LCM_DRIVE.C
* 功能:圖形液晶TG12864B-2驅動程序。
* 說明:在LCM_DRIVE.H文件中定義了LCM操作地址,左半屏的寫命令操作地址為2004H,寫
* 數據操作地址為2005H,右半屏的寫命令操作地址為2000H,寫數據操作地址為2001H;
* 由于GRAPHICS.C中使用了disp_buf作為作圖緩沖區,所以LCM_WriteByte()、LCM_
* DispFill()均要更新disp_buf。
***********************************************************************/
#include "CONFIG.H"
/* LCM復位控制腳定義 */
sbit LCM_RST = P1^0;
/***********************************************************************
* 名稱:LCM_Wr1Command()
* 功能:寫命令子程序,所選屏為左半屏(CS1)。
* 入口參數:command 要寫入LCM的命令字
***********************************************************************/
#define LCM_Wr1Command(command) LCMCS1W_COM = command
/***********************************************************************
* 名稱:LCM_Wr2Command()
* 功能:寫命令子程序,所選屏為右半屏(CS2)。
* 入口參數:command 要寫入LCM的命令字
***********************************************************************/
#define LCM_Wr2Command(command) LCMCS2W_COM = command
/***********************************************************************
* 名稱:LCM_Wr1Data()
* 功能:寫數據子程序,所選屏為左半屏(CS1)。
* 入口參數:wrdata 要寫入LCM的數據
***********************************************************************/
#define LCM_Wr1Data(wrdata) LCMCS1W_DAT = wrdata
/***********************************************************************
* 名稱:LCM_Wr2Data()
* 功能:寫數據子程序,所選屏為右半屏(CS2)。
* 入口參數:wrdata 要寫入LCM的數據
***********************************************************************/
#define LCM_Wr2Data(wrdata) LCMCS2W_DAT = wrdata
/***********************************************************************
* 名稱:LCM_DispIni()
* 功能:LCM顯示初始化。使能顯示,設置顯示起始行為0并清屏。
* 入口參數:無
* 出口參數:無
***********************************************************************/
void LCM_DispIni(void)
{ uint16 i;
LCM_RST = 0; // 復位驅動芯片
for(i=0; i<500; i++);
LCM_RST = 1;
LCM_Wr1Command(LCM_DISPON); // 打開顯示
LCM_Wr1Command(LCM_STARTROW); // 設置顯示起始行為0
LCM_Wr2Command(LCM_DISPON);
LCM_Wr2Command(LCM_STARTROW);
LCM_DispClr(); // 清屏
LCM_Wr1Command(LCM_ADDRSTRY+0); // 設置頁(行)地址
LCM_Wr1Command(LCM_ADDRSTRX+0); // 設置列地址,即列
LCM_Wr2Command(LCM_ADDRSTRY+0);
LCM_Wr2Command(LCM_ADDRSTRX+0);
}
/***********************************************************************
* 名稱:LCM_WriteByte()
* 功能:向指定點寫數據(一字節)。
* 入口參數:x x坐標值(0-127)
* y y坐標值(0-63)
* wrdata 所要寫的數據
* 出口參數:無
* 說明:會更新disp_buf相應存儲單元
***********************************************************************/
void LCM_WriteByte(uint8 x, uint8 y, uint8 wrdata)
{ x = x&0x7f; // 參數過濾
y = y&0x3f;
y = y>>3;
disp_buf[y][x] = wrdata;
if(x<64) // 選擇液晶控制芯片(即CS1--控制前64個點,CS2--控制后64個點)
{ LCM_Wr1Command(LCM_ADDRSTRX+x); // 設置當前列地址,即x坐標
LCM_Wr1Command(LCM_ADDRSTRY+y); // 設置當前頁地址,即y坐標
for(x=0; x<5; x++); // 短延時
LCM_Wr1Data(wrdata);
}
else
{ x = x-64; // 調整x變量值
LCM_Wr2Command(LCM_ADDRSTRX+x);
LCM_Wr2Command(LCM_ADDRSTRY+y);
for(x=0; x<5; x++);
LCM_Wr2Data(wrdata);
}
}
/***********************************************************************
* 名稱:LCM_DispFill()
* 功能:向顯示屏填充數據
* 入口參數:filldata 要寫入LCM的填充數據
* 出口參數:無
* 說明:會更新disp_buf相應存儲單元
***********************************************************************/
void LCM_DispFill(uint8 filldata)
{ uint8 x, y;
LCM_Wr1Command(LCM_STARTROW); // 設置顯示起始行為0
LCM_Wr2Command(LCM_STARTROW);
for(y=0; y<8; y++)
{ LCM_Wr1Command(LCM_ADDRSTRY+y); // 設置頁(行)地址
LCM_Wr1Command(LCM_ADDRSTRX); // 設置列地址
LCM_Wr2Command(LCM_ADDRSTRY+y);
LCM_Wr2Command(LCM_ADDRSTRX);
for(x=0; x<64; x++)
{ LCM_Wr1Data(filldata);
LCM_Wr2Data(filldata);
disp_buf[y][x] = filldata;
disp_buf[y][x+64] = filldata;
}
}
}
/* ASCII碼對應的點陣數據表 */
uint8 code ASCII_TAB20[80] = { 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x9e, 0x00, 0x00,
0x00, 0x0e, 0x00, 0x0e, 0x00,
0x28, 0xfe, 0x28, 0xfe, 0x28,
0x48, 0x54, 0xfe, 0x54, 0x24,
0x46, 0x26, 0x10, 0xc8, 0xc4,
0x6c, 0x92, 0xaa, 0x44, 0xa0,
0x00, 0x0a, 0x06, 0x00, 0x00,
0x00, 0x38, 0x44, 0x82, 0x00,
0x00, 0x82, 0x44, 0x38, 0x00,
0x28, 0x10, 0x7c, 0x10, 0x28,
0x10, 0x10, 0x7c, 0x10, 0x10,
0x00, 0xa0, 0x60, 0x00, 0x00,
0x10, 0x10, 0x10, 0x10, 0x10,
0x00, 0xc0, 0xc0, 0x00, 0x00,
0x40, 0x20, 0x10, 0x08, 0x04
};
uint8 code ASCII_TAB30[80] = { 0x7C, 0xA2, 0x92, 0x8A, 0x7C,
0x00, 0x84, 0xFE, 0x80, 0x00,
0x84, 0xC2, 0xA2, 0x92, 0x8C,
0x42, 0x82, 0x8A, 0x96, 0x62,
0x30, 0x28, 0x24, 0xFE, 0x20,
0x4E, 0x8A, 0x8A, 0x8A, 0x72,
0x78, 0x94, 0x92, 0x92, 0x60,
0x02, 0xE2, 0x12, 0x0A, 0x06,
0x6C, 0x92, 0x92, 0x92, 0x6C,
0x0C, 0x92, 0x92, 0x52, 0x3C,
0x00, 0x6C, 0x6C, 0x00, 0x00,
0x00, 0xAC, 0x6C, 0x00, 0x00,
0x10, 0x28, 0x44, 0x82, 0x00,
0x28, 0x28, 0x28, 0x28, 0x28,
0x00, 0x82, 0x44, 0x28, 0x10,
0x04, 0x02, 0xA2, 0x12, 0x0C
};
uint8 code ASCII_TAB40[80] = { 0x64, 0x92, 0xF2, 0x82, 0x7C,
0xFC, 0x22, 0x22, 0x22, 0xFC,
0xFE, 0x92, 0x92, 0x92, 0x6C,
0x7C, 0x82, 0x82, 0x82, 0x44,
0xFE, 0x82, 0x82, 0x44, 0x38,
0xFE, 0x92, 0x92, 0x92, 0x82,
0xFE, 0x12, 0x12, 0x12, 0x02,
0x7C, 0x82, 0x92, 0x92, 0xF4,
0xFE, 0x10, 0x10, 0x10, 0xFE,
0x00, 0x82, 0xFE, 0x82, 0x00,
0x40, 0x80, 0x82, 0x7E, 0x02,
0xFE, 0x10, 0x28, 0x44, 0x82,
0xFE, 0x80, 0x80, 0x80, 0x80,
0xFE, 0x04, 0x18, 0x04, 0xFE,
0xFE, 0x08, 0x10, 0x20, 0xFE,
0x7C, 0x82, 0x82, 0x82, 0x7C
};
uint8 code ASCII_TAB50[80] = { 0xFE, 0x12, 0x12, 0x12, 0x0C,
0x7C, 0x82, 0xA2, 0x42, 0xBC,
0xFE, 0x12, 0x32, 0x52, 0x8C,
0x8C, 0x92, 0x92, 0x92, 0x62,
0x02, 0x02, 0xFE, 0x02, 0x02,
0x7E, 0x80, 0x80, 0x80, 0x7E,
0x3E, 0x40, 0x80, 0x40, 0x3E,
0x7E, 0x80, 0x70, 0x80, 0x7E,
0xC6, 0x28, 0x10, 0x28, 0xC6,
0x0E, 0x10, 0xE0, 0x10, 0x0E,
0xC2, 0xA2, 0x92, 0x8A, 0x86,
0x00, 0xFE, 0x82, 0x82, 0x00,
0x04, 0x08, 0x10, 0x20, 0x40,
0x00, 0x82, 0x82, 0xFE, 0x00,
0x08, 0x04, 0x02, 0x04, 0x08,
0x80, 0x80, 0x80, 0x80, 0x80
};
uint8 code ASCII_TAB60[80] = { 0x00, 0x02, 0x04, 0x08, 0x00,
0x40, 0xA8, 0xA8, 0xA8, 0xF0,
0xFE, 0x90, 0x88, 0x88, 0x70,
0x70, 0x88, 0x88, 0x88, 0x40,
0x70, 0x88, 0x88, 0x90, 0xFE,
0x70, 0xA8, 0xA8, 0xA8, 0x30,
0x10, 0xFC, 0x12, 0x02, 0x04,
0x18, 0xA4, 0xA4, 0xA4, 0x7C,
0xFE, 0x10, 0x08, 0x08, 0xF0,
0x00, 0x88, 0xFA, 0x80, 0x00,
0x40, 0x80, 0x88, 0x7A, 0x00,
0xFE, 0x20, 0x50, 0x88, 0x00,
0x00, 0x82, 0xFE, 0x80, 0x00,
0xF8, 0x08, 0x30, 0x08, 0xF8,
0xF8, 0x10, 0x08, 0x08, 0xF0,
0x70, 0x88, 0x88, 0x88, 0x70
};
uint8 code ASCII_TAB70[80] = { 0xF8, 0x28, 0x28, 0x28, 0x10,
0x10, 0x28, 0x28, 0x30, 0xF8,
0xF8, 0x10, 0x08, 0x08, 0x10,
0x90, 0xA8, 0xA8, 0xA8, 0x40,
0x08, 0x7E, 0x88, 0x80, 0x40,
0x78, 0x80, 0x80, 0x40, 0xF8,
0x38, 0x40, 0x80, 0x40, 0x38,
0x78, 0x80, 0x60, 0x80, 0x78,
0x88, 0x50, 0x20, 0x50, 0x88,
0x18, 0xA0, 0xA0, 0xA0, 0x78,
0x88, 0xC8, 0xA8, 0x98, 0x88,
0x00, 0x10, 0x6C, 0x82, 0x00,
0x00, 0x00, 0xFE, 0x00, 0x00,
0x00, 0x82, 0x6C, 0x10, 0x00,
0x10, 0x10, 0x54, 0x38, 0x10,
0x10, 0x38, 0x54, 0x10, 0x10
};
/***********************************************************************
* 名稱:LCM_DispChar()
* 功能:指定地址顯示字符。
* 入口參數:disp_cy 顯示行值(0-7)
* disp_cx 顯示列值(0-15)
* dispdata 所要顯示的字符(ASCII碼)
* 注:支持顯示字符0-9、A-Z、a-z及空格,字符顯示格式為5*7,模為8*8,所以
* 屏幕顯示為8*16(共8行,每行16個字符)。
***********************************************************************/
void LCM_DispChar(uint8 disp_cy, uint8 disp_cx, char dispdata)
{ uint8 code *pchardata;
uint8 i;
disp_cy = disp_cy&0x07; // 參數過濾
disp_cx = disp_cx&0x0f;
/* 先要找出顯示數據的類型,并設置相應的點陣數據表,然后設置指針,以取得對應的點陣數據。 */
switch(dispdata&0xf0)
{ case 0x20:
dispdata = (dispdata&0x0f)*5;
pchardata = &ASCII_TAB20[dispdata];
break;
case 0x30:
dispdata = (dispdata&0x0f)*5;
pchardata = &ASCII_TAB30[dispdata];
break;
case 0x40:
dispdata = (dispdata&0x0f)*5;
pchardata = &ASCII_TAB40[dispdata];
break;
case 0x50:
dispdata = (dispdata&0x0f)*5;
pchardata = &ASCII_TAB50[dispdata];
break;
case 0x60:
dispdata = (dispdata&0x0f)*5;
pchardata = &ASCII_TAB60[dispdata];
break;
case 0x70:
dispdata = (dispdata&0x0f)*5;
pchardata = &ASCII_TAB70[dispdata];
break;
default:
pchardata = &ASCII_TAB20[0];
break;
} // end of switch(dispdata&0xf0)...
if( (disp_cx&0x08) == 0 ) // 選擇液晶控制芯片(即CS1--控制前8個字符,CS2--控制后8個字符)
{ i = disp_cx<<3;
LCM_Wr1Command(LCM_ADDRSTRX+i); // 設置當前列地址,即列
LCM_Wr1Command(LCM_ADDRSTRY+disp_cy); // 設置當前頁地址,即行
for(i=0; i<5; i++);
LCM_Wr1Data(0x00); // 顯示一列空格
for(i=0; i<5; i++)
{ LCM_Wr1Data(*pchardata); // 發送數據 */
pchardata++;
}
LCM_Wr1Data(0x00);
for(i=0; i<5; i++);
LCM_Wr1Data(0x00);
}
else
{ i = (disp_cx&0x07)<<3; // 若Y>7,則選取用CS2并且地址值要先減去8,再乘以8
LCM_Wr2Command(LCM_ADDRSTRX+i);
LCM_Wr2Command(LCM_ADDRSTRY+disp_cy); // 設置當前頁地址,即行
for(i=0; i<5; i++);
LCM_Wr2Data(0x00); // 顯示一列空格
for(i=0; i<5; i++)
{ LCM_Wr2Data(*pchardata); // 發送數據 */
pchardata++;
}
LCM_Wr2Data(0x00);
for(i=0; i<5; i++);
LCM_Wr2Data(0x00);
}
}
/***********************************************************************
* 名稱:LCM_DispStr()
* 功能:字符串顯示輸出。
* 入口參數:disp_cy 顯示起始行(0-7)
* disp_cx 顯示起始列(0-15)
* disp_str 字串指針
* 出口參數:無
* 注:支持顯示字符0-9、A-Z、a-z及空格,字符顯示格式為5*7,模為8*8,所以屏幕顯示
* 為8*16(共8行,每行16個字符)。
***********************************************************************/
void LCM_DispStr(uint8 disp_cy, uint8 disp_cx, char *disp_str)
{ while( *disp_str != '\0')
{ disp_cy = disp_cy&0x07; // 參數過濾
disp_cx = disp_cx&0x0f;
LCM_DispChar(disp_cy, disp_cx, *disp_str); // 顯示字符
disp_str++; // 指向下一字符數據
disp_cx++;
if(disp_cx>15) disp_cy++; // 指向下一顯示行
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -