📄 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] /* 数据口 */
#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 /* 文本区首址 */
#define LC_TXT_WID 0x41 /* 文本区宽度 */
#define LC_GRH_STP 0x42 /* 图形区首址 */
#define LC_GRH_WID 0x43 /* 图形区宽度 */
#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 表示光标占的行数 */
#define LC_AUT_WR 0xB0 /* 自动写设置 */
#define LC_AUT_RD 0xB1 /* 自动读设置 */
#define LC_AUT_OVR 0xB2 /* 自动读/写结束 */
#define LC_INC_WR 0xC0 /* 数据一次写,地址加1 */
#define LC_INC_RD 0xC1 /* 数据一次读,地址加1 */
#define LC_DEC_WR 0xC2 /* 数据一次写,地址减1 */
#define LC_DEC_RD 0xC3 /* 数据一次读,地址减1 */
#define LC_NOC_WR 0xC4 /* 数据一次写,地址不变 */
#define LC_NOC_RD 0xC5 /* 数据一次读,地址不变 */
#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点 */
/**************************** 获取当前行函数 *****************************
* 功能:将当前行数据返回给主调函数。
**************************************************************************/
uchar fnGetRow(void) {
return gCurRow;
}
/**************************** 获取当前列函数 *****************************
* 功能:将当前列数据返回给主调函数。
**************************************************************************/
uchar fnGetCol(void) {
return gCurCol;
}
/********************** 状态位ST1,ST0 判断函数 *************************
* 功能:读写指令和读写数据。
************************************************************************/
uchar fnST01(void) {
uchar i;
for(i=10;i>0;i--) {
if((LCMCW & 0x03) == 0x03)
break;
}
return i; /* 若返回零,说明错误 */
}
/************************** 状态位ST2判断函数 ***************************
* 功能:数据自动读取。
************************************************************************/
uchar fnST2(void) {
uchar i;
for(i=10;i>0;i--) {
if((LCMCW & 0x04) == 0x04)
break;
}
return i; /* 若返回零,说明错误 */
}
/*************************** * 状态位ST3判断函数 ************************
* 功能:数据自动写
************************************************************************/
uchar fnST3(void) {
uchar i;
for(i=10;i>0;i--) {
if((LCMCW & 0x08) == 0x08)
break;
}
return i; /* 若返回零,说明错误 */
}
/***************************** 状态位ST6判断函数 ************************
* 功能:屏读/屏拷贝
************************************************************************/
uchar fnST6(void) {
uchar i;
for(i=10;i>0;i--) {
if((LCMCW & 0x40) == 0x40)
break;
}
return i; /* 若返回零,说明屏读/拷贝正确 */
}
/***************************** 写双参数命令函数 **************************/
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 成功 */
}
/***************************** 写单参数命令函数 **************************/
uchar fnPR11(uchar uCmd,uchar uPar1) {
if(fnST01() == 0)
return 1;
LCMDW = uPar1;
if(fnST01() == 0)
return 2;
LCMCW = uCmd;
return 0; /* 返回0 成功 */
}
/***************************** 写无参数命令函数 **************************/
uchar fnPR12(uchar uCmd) {
if(fnST01() == 0)
return 1;
LCMCW = uCmd;
return 0; /* 返回0 成功 */
}
/***************************** 写数据函数 **************************/
uchar fnPR13(uchar uData) {
if(fnST3() == 0)
return 1;
LCMDW = uData;
return 0; /* 返回0 成功 */
}
/******************************* 读数据函数 ****************************/
uchar fnPR2(void) {
if(fnST01() == 0)
return 1;
return LCMDW;
}
/************************** 设置当前地址函数 ***************************/
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;
}
/************************** 设置当前地址函数 ***************************/
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;
}
/************************** 设置文本当前地址函数 第二页 ***************************/
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;
}
/************************ 设置当前显示行、列函数 ************************/
void cursor(uchar uRow, uchar uCol) {
fnSetPos(uRow * 16, uCol);
}
/************************ 设置当前显示行、列函数第二页 ************************/
void cursor1(uchar uRow, uchar uCol) {
fnSetPos1(uRow * 16, uCol);
}
/******************************* 清屏函数 ********************************/
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); /* 写数据 */
}
fnPR12(LC_AUT_OVR); /* 自动写结束 */
fnPR1(LC_ADD_POS,0x00,0x00); /* 重置地址指针 */
gCurRow = 0; /* 置地址指针存储变量 */
gCurCol = 0;
}
/************************** 液晶模块初始化函数 ***************************/
char fnLCMInit(void) {
if(fnPR1(LC_TXT_STP,0x7f,0x1d) != 0) /* 文本显示区首地址 */
return -1;
fnPR1(LC_TXT_WID,20,0x00); /* 文本显示区宽度 */
fnPR1(LC_GRH_STP,0x00,0x00); /* 图形显示区首地址 */
fnPR1(LC_GRH_WID,20,0x00); /* 图形显示区宽度 */
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)显示函数 第一页 ******************/
uchar dprintf(char *fmt, ...) {
va_list arg_ptr;
char c1,c2,cData;
char tmpBuf[64]; /* LCD显示数据缓冲区 */
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); // 写数据
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); /* 写数据 */
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 + -