📄 lcm.c
字号:
#define LCM_GLOBAL
#include "config.h"
INT8U bdata SfrByte;
sbit SB0 = SfrByte ^ 0;
sbit SB1 = SfrByte ^ 1;
sbit SB2 = SfrByte ^ 2;
sbit SB3 = SfrByte ^ 3;
sbit SB4 = SfrByte ^ 4;
sbit SB5 = SfrByte ^ 5;
sbit SB6 = SfrByte ^ 6;
sbit SB7 = SfrByte ^ 7;
INT8U FigureId[10] = {0x77,0x30,0x6e,0x7c,0x39,0x5d,0x5f,0x70,0x7f,0x7d};
INT8U data chZK[32];
void ReadZK(INT8U type, INT8U da1, INT8U da2, BOOLEAN y_n_bit)
{
INT8U code *data p1;
INT32U addr;
INT8U i, *pZK;
switch(type)
{
case 0:
addr = 0x38500;
addr += (INT32U)da1 * 30L;
SPI_Read(addr, 30, chZK, y_n_bit);
break;
case 1:
addr = 0x38000;
addr += 8L * da1;
SPI_Read(addr, 8, chZK, y_n_bit);
break;
case 2:
p1 = 0x6000 + 16L * da1;
if(y_n_bit)
{
for(i=0; i<16; i++)
chZK[i] = *p1++;
}
else
{
for(i=0; i<16; i++)
chZK[i] = (~(*p1++));
}
break;
case 3:
da1 &= 0x7f;
da2 &= 0x7f;
addr = ((INT32U)da1 - 0x21) * 94L + ((INT32U)da2 - 0x21);
addr *= 28;
pZK = chZK;
*pZK++ = 0x00;
*pZK++ = 0x00;
SPI_Read(addr, 28, pZK, y_n_bit);
chZK[30] = 0x00;
chZK[31] = 0x00;
break;
default:
return;
}
}
/*--------和液晶控制器T6963C有关说明和定义-------
状态标志字寄存器:PSDR bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
STA7 STA6 STA5 STA4 STA3 STA2 STA1 STA0
STA0:指令读、写状态 =1:准备好 =0:忙
STA1:数据读、写状态 =1:准备好 =0:忙
STA2:数据自动读状态 =1:准备好 =0:忙
STA3:数据自动写状态 =1:准备好 =0:忙
STA4:未用
STA5:控制器运行检测可能性 =1:可能 =0:不能
STA6:屏读/拷贝出错状态 =1:出错 =0:正确
STA7:闪烁状态检测 =1:正常显示 =0:关显示
T6963C可管理64KB字节的显示缓冲区。显示缓冲区的管理是通过地址计数器、图形计数器、字符计数器和CG RAM地址偏移寄存器进行寻址管理
一般情况下将显示缓冲区划分为文本显示区、图形显示区和CG RAM区,三个区的首地址可通过指令设置
图形区域的显示原理:图形区域的首地址字节单元中的内容对应显示屏第一行点阵前八个点的显示,1- 点亮,0-灭;依次类推,直到显示完显示屏
文本区域的显示原理:文本区域的首地址字节单元中的内容对应显示屏左上角的第一个8x8(也可6x8,由硬件决定)点阵字符,依次类推,直到显示完
显示屏;文本区域字节单元中的内容为字符代码,代码对应字符发生器中字符,CG RAM/CG ROM。
地址计数器是访问显示缓冲区的地址指针,也就是说,在进行显示缓冲区读、写前,要先设置地址计数器。地址计数器可通过指令修改,也可设置
为自动加1或减1功能实现自动修改
T6963C液晶控制器具有命令和数据两个端口(通道),从命令端口写命令字,读状态标志字;从数据端口读、写数据
T6963C指令集:(指令分为无参数指令、单参数指令和双参数指令,参数由数据通道先写入,指令由命令通道后写入
*/
/*-----------T6963C各地址指针的设置命令字(双参数指令)---------------*/
#define LCM_SET_CURS_POINT 0x21 //光标指针地址设置
#define LCM_SET_OFFS_POINT 0x22 //偏移寄存器设置
#define LCM_SET_ADDR_POINT 0x24 //显示缓冲区地址指针设置
/*
参数D1 参数D2 指令代码 功 能
水平位置(7位) 垂直位置(5位) 21H 光标指针地址设置
地 址(5位) 00H 22H 偏移寄存器设置
低 字 节 高 字 节 23H 地址指针设置
*/
/*-----------T6963C控制字设置命令字(双参数指令)---------------*/
#define LCM_SET_TEXT_HOME_ADDR 0x40 //文本显示区首地址设置
#define LCM_SET_TEXT_Y 0x41 //文本区域设置
#define LCM_SET_GRAPH_HOME_ADDR 0x42 //图形显示区首地址设置
#define LCM_SET_GRAPH_Y 0x43 //图形区域设置
/*
参数D1 参数D2 指令代码 功 能
低 字 节 高 字 节 40H 文本显示区首地址设置
字 节 数 00H 41H 文本区域设置
低 字 节 高 字 节 42H 图形显示区首地址设置
字 节 数 00H 43H 图形区域设置
*/
/*-----------T6963C方式设置命令字(无参数指令)---------------*/
/*----启用CG RAM,字符代码为00~FFH共256个字符,CG RAM最大区域为2KB -----*/
#define LCM_SET_CGRAM_MODE_OR 0x88 //文本和图形合成‘或’显示
#define LCM_SET_CGRAM_MODE_XOR 0x89 //文本和图形合成‘异或’显示
#define LCM_SET_CGRAM_MODE_AND 0x8b //文本和图形合成‘与’显示
#define LCM_SET_CGRAM_MODE_TEXT 0x8c //文本属性显示
/*----启用CG ROM,该字库共有128种字符,字符代码00~7FH,当字符代码为80~FFH时,T6963C自动选择CG RAM----*/
#define LCM_SET_CGROM_MODE_OR 0x80 //文本和图形合成‘或’显示
#define LCM_SET_CGROM_MODE_XOR 0x81 //文本和图形合成‘异或’显示
#define LCM_SET_CGROM_MODE_AND 0x83 //文本和图形合成‘与’显示
#define LCM_SET_CGROM_MODE_TEXT 0x84 //文本属性显示
/*--------CG RAM的划分 ,最大为2K---------*/
/* A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0
| | | | | |
| | | | | |
| | | | | |
偏移寄存器值、设置成某值 字符代码A10~A3八位组成 字符字模放在由A2~A0确定的八个地址空间
*/
/*-----------T6963C/显示方式设置命令字(无参数指令)---------------*/
#define LCM_SET_DISP_MODE 0x90
/*
1 0 0 1 N3 N2 N1 N0 N3=1:图形方式开; N3=0:图形方式关
N2=1:文本方式开; N2=0:文本方式关
N1=1:光标显示开; N1=0:光标显示关
N0=1:光标闪烁开; N0=0:光标闪烁关
*/
/*-----------T6963C光标形状设置命令字(无参数指令)---------------*/
#define LCM_SET_CURS_FIGU 0xa0 //光标形状设置
/*
1 0 0 1 0 N2 N1 N0
0 0 0 一行光标(底行)
.
.
1 1 1 八行光标
*/
/*-----------T6963C数据自动读写设置命令字(无参数指令)---------------*/
#define LCM_DATA_AUTO_WR 0xb0 //数据自动写方式设置
#define LCM_DATA_AUTO_RD 0xb1 //数据自动读方式设置
#define LCM_STOP_DATA_AUTO_RDWR 0xb2 //数据自动读写方式中止
/*-----------T6963C数据一次读写设置命令字(单参数指令)---------------*/
#define LCM_DATA_ONCE_INC_WR 0xc0 //数据一次写且完后地址指针加1方式设置
#define LCM_DATA_ONCE_INC_RD 0xc1 //数据一次读且完后地址指针加1方式设置
#define LCM_DATA_ONCE_DEC_WR 0xc2 //数据一次写且完后地址指针减1方式设置
#define LCM_DATA_ONCE_DEC_RD 0xc3 //数据一次读且完后地址指针减1方式设置
#define LCM_DATA_ONCE_ONLY_WR 0xc4 //数据仅一次写方式设置,地址指针不变
#define LCM_DATA_ONCE_ONLY_RD 0xc5 //数据仅一次读方式设置,地址指针不变
/*-----------T6963C屏读设置命令字(无参数指令)---------------*/
#define LCM_SCRN_RD 0xe0 //屏读
/*-----------T6963C屏拷贝设置命令字(无参数指令)---------------*/
#define LCM_SCRN_CP 0xe8 //屏拷贝
/*-----------T6963C位操作设置命令字(无参数指令)---------------*/
#define LCM_BIT_OPT_SET 0xf8 //把地址指针所指单元中某位置1
#define LCM_BIT_OPT_CLR 0xf0 //把地址指针所指单元中某位清0
/*
1 1 1 1 N3 N2 N1 N0
N3=0:位清0; N3=1:位置1
N2 N1 N0 指示位地址,000指示D0位,111指示D7位
*/
/*******************************************************************************
程序名: LcmChkSta
说 明: 由命令通道读并检测状态标志字寄存器中的STA0~7位
********************************************************************************/
void LcmChkSta(INT8U stat)
{
INT8U ch;
stat &= 0x07;
do{
ch = XBYTE[LCM_PORT + COMD_CHANNEL];
ch >>= stat;
}while(!(ch & 0x01));
}
/*******************************************************************************
程序名: LcmRdOneData
说 明: 由数据通道一次读数据
********************************************************************************/
INT8U LcmRdOneData(void)
{
INT8U ch;
LcmChkSta(1);
ch = XBYTE[LCM_PORT + DATA_CHANNEL];
return(ch);
}
/*******************************************************************************
程序名: LcmWrOnePara
说 明: 由数据通道一次写单字节参数或数据
********************************************************************************/
void LcmWrOnePara(INT8U da)
{
LcmChkSta(1);
XBYTE[LCM_PORT + DATA_CHANNEL] = da;
}
/*******************************************************************************
程序名: LcmWrTwoPara
说 明: 由数据通道写双字节参数,先写低字节,再写高字节
********************************************************************************/
void LcmWrTwoPara(INT16U pa)
{
INT8U ch;
ch = (INT8U)pa;
LcmChkSta(1);
XBYTE[LCM_PORT + DATA_CHANNEL] = ch;
pa >>= 8;
ch = (INT8U)pa;
LcmChkSta(1);
XBYTE[LCM_PORT + DATA_CHANNEL] = ch;
}
/*******************************************************************************
程序名: LcmWrCmd
说 明: 由命令通道写命令字
********************************************************************************/
void LcmWrCmd(INT8U cm)
{
LcmChkSta(0);
XBYTE[LCM_PORT + COMD_CHANNEL] = cm;
}
/*******************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -