📄 lcd_api.h
字号:
#include <absacc.h>
#include <stdarg.h>
#include <stdio.h>
#include <intrins.h>
#include <string.h>
#include"picture.h"
#include"character.h"
#include"lcd.h"
// ASCII字符控制代码解释定义
#define ulong unsigned long
#define uint unsigned int
#define uchar unsigned char
// ASCII字符控制代码解释定义
#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 TEXT_ADDR 0x0400
#define TRUE 1
#define FALSE 0
#define HIGH 1
#define LOW 0
// T6963C 端口定义由汇编语言程序定义外部端口
#define LCMDW XBYTE[0xc000] //0xf000 数据口
#define LCMCW XBYTE[0xc001] //0xf001 命令口
// 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_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 // 位操作:
// D0-D2:定义D0-D7位;D3:1置位;0:清除
uchar gCurRow,gCurCol; // 当前行、列存储,行高16点,列宽8点
/* 取当前行数据 */
uchar fnGetRow(void)
{
return gCurRow;
}
/* 取当前列数据 */
uchar fnGetCol(void)
{
return gCurCol;
}
/***********************************************/
/* 状态位判断STA1,STA0(读写指令和读写数据) */
/*在读写数据或者写入命令之前必须保证为1 */
/***********************************************/
uchar fnSTA01(void)
{
uchar i;
for(i=10;i>0;i--)
{
if((LCMCW & 0x03)==0x03) //读取状态
break;
}
return i;
//若返回0,说明错误
}
/**********************************************/
/* 检查STA2,如果STA2=1,为自动读状态 */
/**********************************************/
uchar fnSTA2(void)
{
uchar i;
for(i=10;i>0;i--)
{
if((LCMCW & 0x04)==0x04)
break;
}
return i;
//若返回0,说明错误
}
/**********************************************/
/* 检查STA3,如果STA3=1,为自动写状态 */
/**********************************************/
uchar fnSTA3(void)
{
uchar i;
for(i=10;i>0;i--)
{
if((LCMCW & 0x08)==0x08)
break;
}
return i;
//若返回0,说明错误
}
/**********************************************/
/* 检查STA6,如果STA6=1,为屏读/屏写状态 */
/**********************************************/
uchar fnSTA6(void)
{
uchar i;
for(i=10;i>0;i--)
{
if((LCMCW & 0x40)==0x40)
break;
}
return i;
//若返回不为0,说明错误
}
/***********************************************/
/* 写双参数指令 */
/***********************************************/
uchar fnPR1(uchar uCmd,uchar uPar1,uchar uPar2)
{
if(fnSTA01()==0)
return 1;
LCMDW = uPar1;
if(fnSTA01()==0)
return 2;
LCMDW = uPar2;
if(fnSTA01()==0)
return 3;
LCMCW = uCmd;
return 0; //若返回0,说明成功
}
/***********************************************/
/* 写单参数指令 */
/***********************************************/
uchar fnPR11(uchar uCmd,uchar uPar1)
{
if(fnSTA01()==0)
return 1;
LCMDW = uPar1;
if(fnSTA01()==0)
return 2;
LCMCW = uCmd;
return 0; //若返回0,说明成功
}
/***********************************************/
/* 写无参数指令 */
/***********************************************/
uchar fnPR12(uchar uCmd)
{
if(fnSTA01()==0)
return 1;
LCMCW = uCmd;
return 0; //若返回0,说明成功
}
/***********************************************/
/* 写数据 */
/***********************************************/
uchar fnPR13(uchar uData)
{
if(fnSTA3()==0)
return 1;
LCMDW = uData;
return 0; //若返回0,说明成功
}
/***********************************************/
/* 读数据 */
/***********************************************/
uchar fnPR2(void)
{
if(fnSTA01()==0)
return 1;
return LCMDW; //返回数据
}
/***********************************************/
/* 设置当前地址 */
/***********************************************/
void fnSetPos(uchar urow,uchar ucol)
{
uint iPos;
iPos=urow*16+ucol;
fnPR1(LC_ADD_POS,iPos&0xff,iPos/256);
gCurRow=urow;
gCurCol=ucol;
}
/***********************************************/
/* 设置当前显示行,列 */
/***********************************************/
void cursor(uchar uRow,uchar uCol)
{
fnSetPos(uRow*16,uCol);
}
/***********************************************/
/* 清屏 */
/***********************************************/
void cls(void)
{
uint i;
fnPR1(LC_ADD_POS,0x00,0x00); //置地址指针为从0开始
fnPR12(LC_AUT_WR); //自动写
for(i=0;i<128*64/8+128;i++) //清一屏
{
fnSTA3();
fnPR13(0x00); //写数据
}
fnPR12(LC_AUT_OVR); //自动写结束
fnPR1(LC_ADD_POS,0x00,0x00); //重置地址指针
gCurRow=0; //置地址指针存储变量
gCurCol=0;
}
/***********************************************/
/* 初始化 */
/***********************************************/
char fnLCMInit(void)
{
fnPR1(LC_TXT_STP,TEXT_ADDR&0xff,TEXT_ADDR/256); //文本显示区首地址
fnPR1(LC_TXT_WID,0x10,0x00); //文本显示区宽度
fnPR1(LC_GRH_STP,0x00,0x00); //图形显示区首地址
fnPR1(LC_GRH_WID,0x10,0x00); //图形显示区宽度
fnPR12(LC_CUR_SHP|0x00); //光标形状
// fnPR1(LC_CUR_POS,0x00,0x00); //光标位置
fnPR12(LC_DIS_SW|0x0c); //显示开关设置
fnPR12(LC_MOD_OR);
cls(); //显示方式设置
return 0;
}
/***********************************************/
/* 延时 */
/***********************************************/
void shortdelay(uint tt)
{
uchar i;
while(tt)
{
i=100;
while(i) i--;
tt--;
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -