?? pg160128a.c
字號:
#include <absacc.h>
#include <reg51.h>
//#include <rtx51tny.h>
#include <stdarg.h>
#include <stdio.h>
#include"picture.h"
#define ulong unsigned long
#define uint unsigned int
#define uchar unsigned char
#define STX 0x02
#define ETX 0x03
#define EOT 0x04
#define ENQ 0x05
#define BS 0x08
#define CR 0x0D
#define LF 0x0A
#define DLE 0x10
#define ETB 0x17
#define SPACE 0x20
#define COMMA 0x2C
#define TRUE 1
#define FALSE 0
#define HIGH 1
#define LOW 0
extern uchar scankeypad ();
/* T6963C 端口定義 */
#define LCMDW XBYTE[0x08000] /* 數(shù)據(jù)口 */
#define LCMCW XBYTE[0x08100] /* 命令口 */
/* T6963C 命令定義 */
#define LC_CUR_POS 0x21 /* 光標位置設置 */
#define LC_CGR_POS 0x22 /* CGRAM偏置地址設置 */
#define LC_ADD_POS 0x24 /* 地址指針位置 */
#define LC_TXT_STP 0x40 /* 文本區(qū)首址 */
#define LC_TXT_WID 0x41 /* 文本區(qū)寬度 */
#define LC_GRH_STP 0x42 /* 圖形區(qū)首址 */
#define LC_GRH_WID 0x43 /* 圖形區(qū)寬度 */
#define LC_MOD_OR 0x80 /* 顯示方式:邏輯"或" */
#define LC_MOD_XOR 0x81 /* 顯示方式:邏輯"異或" */
#define LC_MOD_AND 0x82 /* 顯示方式:邏輯"與" */
#define LC_MOD_TCH 0x83 /* 顯示方式:文本特征 */
#define LC_DIS_SW 0x90 /* 顯示開關: */
/* D0=1/0:光標閃爍啟用/禁用; */
/* D1=1/0:光標顯示啟用/禁用; */
/* D2=1/0:文本顯示啟用/禁用; */
/* D3=1/0:圖形顯示啟用/禁用; */
#define LC_CUR_SHP 0xA0 /* 光標形狀選擇:0xA0-0xA7 表示光標占的行數(shù) */
#define LC_AUT_WR 0xB0 /* 自動寫設置 */
#define LC_AUT_RD 0xB1 /* 自動讀設置 */
#define LC_AUT_OVR 0xB2 /* 自動讀/寫結束 */
#define LC_INC_WR 0xC0 /* 數(shù)據(jù)一次寫,地址加1 */
#define LC_INC_RD 0xC1 /* 數(shù)據(jù)一次讀,地址加1 */
#define LC_DEC_WR 0xC2 /* 數(shù)據(jù)一次寫,地址減1 */
#define LC_DEC_RD 0xC3 /* 數(shù)據(jù)一次讀,地址減1 */
#define LC_NOC_WR 0xC4 /* 數(shù)據(jù)一次寫,地址不變 */
#define LC_NOC_RD 0xC5 /* 數(shù)據(jù)一次讀,地址不變 */
#define LC_SCN_RD 0xE0 /* 屏讀 */
#define LC_SCN_CP 0xE8 /* 屏拷貝 */
#define LC_BIT_OP 0xF0 /* 位操作 */
/* ASCII 字模寬度及高度定義 */
#define ASC_CHR_WIDTH 8
#define ASC_CHR_HEIGHT 16
uchar gCurRow,gCurCol; /* 當前行、列存儲,行高16點,列寬8點 */
/**************************** 獲取當前行函數(shù) *****************************
* 功能:將當前行數(shù)據(jù)返回給主調函數(shù)。
**************************************************************************/
uchar fnGetRow(void) {
return gCurRow;
}
/**************************** 獲取當前列函數(shù) *****************************
* 功能:將當前列數(shù)據(jù)返回給主調函數(shù)。
**************************************************************************/
uchar fnGetCol(void) {
return gCurCol;
}
/********************** 狀態(tài)位ST1,ST0 判斷函數(shù) *************************
* 功能:讀寫指令和讀寫數(shù)據(jù)。
************************************************************************/
uchar fnST01(void) {
uchar i;
for(i=10;i>0;i--) {
if((LCMCW & 0x03) == 0x03)
break;
}
return i; /* 若返回零,說明錯誤 */
}
/************************** 狀態(tài)位ST2判斷函數(shù) ***************************
* 功能:數(shù)據(jù)自動讀取。
************************************************************************/
uchar fnST2(void) {
uchar i;
for(i=10;i>0;i--) {
if((LCMCW & 0x04) == 0x04)
break;
}
return i; /* 若返回零,說明錯誤 */
}
/*************************** * 狀態(tài)位ST3判斷函數(shù) ************************
* 功能:數(shù)據(jù)自動寫
************************************************************************/
uchar fnST3(void) {
uchar i;
for(i=10;i>0;i--) {
if((LCMCW & 0x08) == 0x08)
break;
}
return i; /* 若返回零,說明錯誤 */
}
/***************************** 狀態(tài)位ST6判斷函數(shù) ************************
* 功能:屏讀/屏拷貝
************************************************************************/
uchar fnST6(void) {
uchar i;
for(i=10;i>0;i--) {
if((LCMCW & 0x40) == 0x40)
break;
}
return i; /* 若返回零,說明屏讀/拷貝正確 */
}
/***************************** 寫雙參數(shù)命令函數(shù) **************************/
uchar fnPR1(uchar uCmd,uchar uPar1,uchar uPar2) {
if(fnST01() == 0)
return 1;
LCMDW = uPar1;
if(fnST01() == 0)
return 2;
LCMDW = uPar2;
if(fnST01() == 0)
return 3;
LCMCW = uCmd;
return 0; /* 返回0 成功 */
}
/***************************** 寫單參數(shù)命令函數(shù) **************************/
uchar fnPR11(uchar uCmd,uchar uPar1) {
if(fnST01() == 0)
return 1;
LCMDW = uPar1;
if(fnST01() == 0)
return 2;
LCMCW = uCmd;
return 0; /* 返回0 成功 */
}
/***************************** 寫無參數(shù)命令函數(shù) **************************/
uchar fnPR12(uchar uCmd) {
if(fnST01() == 0)
return 1;
LCMCW = uCmd;
return 0; /* 返回0 成功 */
}
/***************************** 寫數(shù)據(jù)函數(shù) **************************/
uchar fnPR13(uchar uData) {
if(fnST3() == 0)
return 1;
LCMDW = uData;
return 0; /* 返回0 成功 */
}
/******************************* 讀數(shù)據(jù)函數(shù) ****************************/
uchar fnPR2(void) {
if(fnST01() == 0)
return 1;
return LCMDW;
}
/************************** 設置當前地址函數(shù) ***************************/
void fnSetPos(uchar urow, uchar ucol) {
uint iPos;
iPos = urow * 20 + ucol;
fnPR1(LC_ADD_POS,(uchar)(iPos),(uchar)(iPos>>8));
gCurRow = urow;
gCurCol = ucol;
}
/************************** 設置當前地址函數(shù) ***************************/
void fnSetPos1(uchar urow, uchar ucol) {
uint iPos;
iPos = urow * 20 + ucol+0x0a00;
fnPR1(LC_ADD_POS,(uchar)(iPos),(uchar)(iPos>>8));
gCurRow = urow;
gCurCol = ucol;
}
/************************** 設置文本當前地址函數(shù) 第二頁 ***************************/
void fnSetPostxt(uchar urow, uchar ucol) {
uint iPos;
iPos = urow * 20 + ucol+0x1d7f;
fnPR1(LC_ADD_POS,(uchar)(iPos),(uchar)(iPos>>8));
//gCurRow = urow;
//gCurCol = ucol;
}
/************************ 設置當前顯示行、列函數(shù) ************************/
void cursor(uchar uRow, uchar uCol) {
fnSetPos(uRow * 16, uCol);
}
/************************ 設置當前顯示行、列函數(shù)第二頁 ************************/
void cursor1(uchar uRow, uchar uCol) {
fnSetPos1(uRow * 16, uCol);
}
/******************************* 清屏函數(shù) ********************************/
void cls(void) {
uint i;
fnPR1(LC_ADD_POS,0x00,0x00); /* 置地址指針 */
fnPR12(LC_AUT_WR); /* 自動寫 */
for(i=0;i<320*30;i++) {
fnST3();
fnPR13(0x00); /* 寫數(shù)據(jù) */
}
fnPR12(LC_AUT_OVR); /* 自動寫結束 */
fnPR1(LC_ADD_POS,0x00,0x00); /* 重置地址指針 */
gCurRow = 0; /* 置地址指針存儲變量 */
gCurCol = 0;
}
/************************** 液晶模塊初始化函數(shù) ***************************/
char fnLCMInit(void) {
if(fnPR1(LC_TXT_STP,0x7f,0x1d) != 0) /* 文本顯示區(qū)首地址 */
return -1;
fnPR1(LC_TXT_WID,20,0x00); /* 文本顯示區(qū)寬度 */
fnPR1(LC_GRH_STP,0x00,0x00); /* 圖形顯示區(qū)首地址 */
fnPR1(LC_GRH_WID,20,0x00); /* 圖形顯示區(qū)寬度 */
fnPR1(LC_CGR_POS,3,0x00); //設置偏置地址0x1c00為字符0x80的地址
fnPR12(LC_CUR_SHP | 0x01); /* 光標形狀 */
fnPR12(LC_MOD_XOR); /* 顯示方式設置 */
fnPR12(LC_DIS_SW | 0x0c); /* 顯示開關設置 */
return 0;
}
/**************** ASCII碼(8×16)及漢字(16×16)顯示函數(shù) 第一頁 ******************/
uchar dprintf(char *fmt, ...) {
va_list arg_ptr;
char c1,c2,cData;
char tmpBuf[64]; /* LCD顯示數(shù)據(jù)緩沖區(qū) */
uchar i=0,j,uLen,uRow,uCol;
uint k;
va_start(arg_ptr, fmt);
uLen = (uchar)vsprintf(tmpBuf, fmt, arg_ptr);
va_end(arg_ptr);
while(i<uLen) {
c1 = tmpBuf[i];
c2 = tmpBuf[i+1];
uRow = fnGetRow();
uCol = fnGetCol();
if(c1 >= 0) { //* ASCII碼
if(c1 < 0x20) {
switch(c1) {
case CR:
case LF: i++; // 回車或換行
if(uRow < 112)
fnSetPos(uRow+16,0);
else
fnSetPos(0,0);
continue;
case BS: // 退格
if(uCol > 0) uCol--;
fnSetPos(uRow,uCol);
cData = 0x00;
break;
default: // 其他
c1 = 0x1f;
}
}
for(j=0;j<16;j++) {
fnPR12(LC_AUT_WR); // 寫數(shù)據(jù)
if(c1 >= 0x1f) {
fnPR13(ASC_MSK[(c1-0x1f-1)*ASC_CHR_HEIGHT+j]);
}
else
fnPR13(cData);
fnPR12(LC_AUT_OVR);
fnSetPos(uRow+j+1,uCol);
}
if(c1 != BS) uCol++; /* 非退格 */
}
else { /* 中文 */
for(j=0;j<sizeof(GB_16)/sizeof(GB_16[0]);j++) {
if(c1 == GB_16[j].Index[0] && c2 == GB_16[j].Index[1])
break;
}
for(k=0;k<sizeof(GB_16[0].Msk)/2;k++) {
fnSetPos(uRow+k,uCol);
fnPR12(LC_AUT_WR); /* 寫數(shù)據(jù) */
if(j < sizeof(GB_16)/sizeof(GB_16[0])) {
fnPR13(GB_16[j].Msk[k*2]);
fnPR13(GB_16[j].Msk[k*2+1]);
}
else { /* 未找到該字 */
if(k < sizeof(GB_16[0].Msk)/4) {
fnPR13(0x00);
fnPR13(0x00);
}
else {
fnPR13(0xff);
fnPR13(0xff);
}
}
fnPR12(LC_AUT_OVR);
}
uCol += 2;
i++;
}
if(uCol >= 30) { /* 光標后移 */
uRow += 16;
if(uRow < 0x80) uCol -= 30;
else {
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -