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

📄 lcm.c

📁 一个基于XMODEM协议的下载字库的程序
💻 C
📖 第 1 页 / 共 2 页
字号:

#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 + -