⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pg160128a.c

📁 本程序是基于T6963C的程序 好用 欢迎下载
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -