📄 t6963c.c
字号:
//主程序
/***********************************/
/* LCM(TRULY M240128-1A1)显示程序*/
/* LCM 控制芯片 T6963C 带32KRAM */
/* MCU 型号: LPC2132 */
/* 时钟频率: 11.0592 MHz */
/* 接口方式: 模拟方式 */
/* 开发环境: ADS1.2 */
/* 开发日期: 2007.7.7 */
/* 程序编写: 用芯工作 */
/*邮件地址 kufund@163.com */
/***********************************/
/***********************************
** 硬件接口
** D0-------P0.4
** |
** D7-------P0.11
** WR-------P0.12
** RD-------P0.13
** CE-------P0.14
** C/D------P0.15
** RST------P0.16
************************************/
#define t6963c_c 1
#include "t6963c.h"
/***********************************
**
** 接口定义
**
***********************************/
/* 定义总线起始的GPIO,即D0对应的GPIO值(P0.4) */
#define BUS_NO 4
/* 输出总线数据宏定义 */
#define OutData(dat) IO0CLR = 0xFF<<BUS_NO; IO0SET = (dat&0xff)<<BUS_NO
/*数据口宏定义 */
#define DATA_PORT 0xFF<<BUS_NO
/* 定义 WR 控制 */
#define LCM_WR 12
#define SWR(); IO0SET = 1<<LCM_WR
#define CWR() IO0CLR = 1<<LCM_WR
/* 定义 RD 控制 */
#define LCM_RD 13
#define SRD() IO0SET = 1<<LCM_RD
#define CRD() IO0CLR = 1<<LCM_RD
/* 定义 CE 控制 */
#define LCM_CE 14
#define SCE() IO0SET = 1<<LCM_CE
#define CCE() IO0CLR = 1<<LCM_CE
/* 定义 CD 控制 */
#define LCM_CD 15
#define SCD() IO0SET = 1<<LCM_CD
#define CCD() IO0CLR = 1<<LCM_CD
/* 定义 CE 控制 */
#define LCM_RST 16
#define SRST() IO0SET = 1<<LCM_RST
#define CRST() IO0CLR = 1<<LCM_RST
/****************************************/
/*sfr p0=0x80;
sfr p1=0x90;
sfr p2=0xa0;
sfr p3=0xb0;
sbit reset=p3^0;
sbit cd=P1^3;
sbit cs=p1^2;
sbit rd=P1^1;
sbit wr=P1^0;*/
uint txthome,grhome;
/*********************************************************************************
* 名称:DELAY5()
* 功能:软件延时函数。用于LCM显示输出时序控制。
* 入口参数:无
* 出口参数:无
**********************************************************************************/
void DELAY5(void)
{ int i;
for(i=0; i<100; i++);
}
/**********************************
//= 函数原型: uchar check_cmd_st()
//= 功 能: 查询是否可读写命令和数据的状态
//= 参 数:
//= 返 回 值: 非0不忙,否则忙
//= 函数性质:私有函数
**********************************/
uchar check_cmd_st(void) // 状态位STA1,STA0 判断(读写指令和读写数据)
{
uchar i,temp;
for(i=100;i>0;i--)
{
CCE();
DELAY5();
SCD();
DELAY5();
SRD();
DELAY5();
CRD();
DELAY5();
temp = (uchar)((IO0PIN&0x00000FF0)>>4); //读总线数据
SRD();
if((temp & 0x03) == 0x03)
break;
}
return i; // 若返回零,说明错误
}
/**********************************
//= 函数原型: uchar check_ar_st
//= 功 能: 查询是否可数据自动读状态
//= 参 数:
//= 返 回 值: 非0不忙,否则忙
//= 函数性质:私有函数
**********************************/
uchar check_ar_st(void) // 状态位ST2 判断(数据自动读状态)
{
uchar i,temp;
for(i=100;i>0;i--)
{
CCE();
DELAY5();
SCD();
DELAY5();
SRD();
DELAY5();
CRD();
temp = (uchar)((IO0PIN&0x00000FF0)>>4); //读总线数据
SRD();
if((temp & 0x04) == 0x04)
break;
}
return i; // 若返回零,说明错误
}
/**********************************
//= 函数原型: uchar check_aw_st
//= 功 能: 查询是否可数据自动写状态
//= 参 数:
//= 返 回 值: 非0不忙,否则忙
//= 函数性质:私有函数
**********************************/
uchar check_aw_st(void) // 状态位ST3 判断(数据自动写状态)
{
uchar i,temp;
for(i=100;i>0;i--)
{
CCE();
DELAY5();
SCD();
DELAY5();
SRD();
DELAY5();
CRD();
DELAY5();
temp = (uchar)((IO0PIN&0x00000FF0)>>4); //读总线数据
SRD();
if((temp & 0x08) == 0x08)
break;
}
return i; // 若返回零,说明错误
}
/**********************************
//= 函数原型: uchar check_scrPeek_st()
//= 功 能: 查询是否可屏读/屏拷贝状态状态
//= 参 数:
//= 返 回 值: 非0不忙,否则忙
//= 函数性质:私有函数
**********************************/
uchar check_scrPeek_st(void) // 状态位ST6 判断(屏读/屏拷贝状态)
{
uchar i,temp;
for(i=100;i>0;i--)
{
CCE();
DELAY5();
SCD();
DELAY5();
SRD();
DELAY5();
CRD();
DELAY5();
temp = (uchar)((IO0PIN&0x00000FF0)>>4); //读总线数据
SRD();
if((temp & 0x40) == 0x40)
break;
}
return i; // 若返回零,说明错误
}
/**********************************
//= 函数原型: uchar wr_cmd_2(uchar uCmd,uint uPar)
//= 功 能: 给T6963C写带双参数的指令
//= 参 数:
//= 返 回 值: 返回0 成功,否则忙
//= 函数性质:私有函数
**********************************/
uchar wr_cmd_2(uchar uCmd,uint uPar) // 写双参数的指令
{
uchar temp;
if(check_cmd_st() == 0) return 1;
CCD();
DELAY5();
SWR();
DELAY5();
CWR();
DELAY5();
temp = (uchar)(uPar& 0xFF);
OutData(temp); //先写低字节
DELAY5();
SWR();
DELAY5();
SCD();
if(check_cmd_st() == 0) return 2;
CCD();
DELAY5();
SWR();
DELAY5();
CWR();
DELAY5();
temp = (uchar)(uPar>>8); //再写高字节
OutData(temp);
DELAY5();
SWR();
DELAY5();
SCD();
if(check_cmd_st() == 0) return 3;
SCD();
DELAY5();
SWR();
DELAY5();
CWR();
DELAY5();
OutData(uCmd);
DELAY5();
SWR();
return 0; // 返回0 成功
}
/**********************************
//= 函数原型: uchar wr_cmd_1(uchar uCmd,uchar uPar1)
//= 功 能: 给T6963C写带单参数的指令
//= 参 数:
//= 返 回 值: 返回0 成功,否则忙
//= 函数性质:私有函数
**********************************/
uchar wr_cmd_1(uchar uCmd,uchar uPar) // 写单参数的指令
{
if(check_cmd_st() == 0) return 1;
CCD();
DELAY5();
SWR();
DELAY5();
CWR();
DELAY5();
OutData(uPar);
DELAY5();
SWR();
DELAY5();
SCD();
if(check_cmd_st() == 0) return 2;
SCD();
DELAY5();
SWR();
DELAY5();
CWR();
DELAY5();
OutData(uCmd);
DELAY5();
SWR();
return 0; // 返回0 成功
}
/**********************************
//= 函数原型: uchar wr_cmd_0(uchar uCmd)
//= 功 能: 给T6963C写无参数的指令
//= 参 数:
//= 返 回 值: 返回0 成功,否则忙
//= 函数性质:私有函数
**********************************/
uchar wr_cmd_0(uchar uCmd) // 写无参数的指令
{
if(check_cmd_st() == 0) return 1;
SCD();
DELAY5();
SWR();
DELAY5();
CWR();
DELAY5();
OutData(uCmd);
DELAY5();
SWR();
return 0; // 返回0 成功
}
/**********************************
//= 函数原型: uchar wr_data(uchar uData)
//= 功 能: 给T6963C写一次数据
//= 参 数:
//= 返 回 值: 返回0 成功,否则忙
//= 函数性质:私有函数
**********************************/
uchar wr_data(uchar uData) // 写一次数据
{
if(check_cmd_st() == 0) return 1;
CCD();
DELAY5();
SWR();
DELAY5();
CWR();
DELAY5();
OutData(uData);
DELAY5();
SWR();
DELAY5();
SCD();
return 0; // 返回0 成功
}
/**********************************
//= 函数原型: uchar awr_data(uchar uData)
//= 功 能: 给T6963C写一个地址增加自动连续数据
//= 参 数:
//= 返 回 值: 返回0 成功,否则忙
//= 函数性质:私有函数
**********************************/
uchar awr_data(uchar uData) // 自动写数据
{
if(check_aw_st() == 0) return 1;
CCD();
DELAY5();
SWR();
DELAY5();
CWR();
DELAY5();
// P0= uData;
OutData(uData);
DELAY5();
SWR();
DELAY5();
SCD();
// LCMDP = uData;
return 0; // 返回0 成功
}
/**********************************
//= 函数原型: uchar ard_data(uchar uData)
//= 功 能: 从T6963C读一个地址增加自动连续数据
//= 参 数:
//= 返 回 值: 返回0 成功,否则忙
//= 函数性质:私有函数
**********************************/
uchar ard_data(void) // 自动读数据
{
uchar temp;
if(check_ar_st() == 0) return 1;
CCE();
DELAY5();
CCD();
DELAY5();
SRD();
DELAY5();
CRD();
DELAY5();
temp = (uchar)((IO0PIN&0x00000FF0)>>4); //读总线数据
SRD();
return temp;
// if(check_ar_st() == 0) return 1;
// return LCMDP;
}
/**********************************
//= 函数原型: void char_addr_Pointer_Set(uchar urow, uchar ucol)
//= 功 能: 根据字符的行列设置vram地址
//= 参 数:
//= 返 回 值:
//= 函数性质:私有函数
**********************************/
void char_addr_Pointer_Set(uchar urow, uchar ucol)
{
uint iPos;
iPos = urow * 30 + ucol + txthome;
wr_cmd_2(LC_ADD_POS,iPos);
}
/**********************************
//= 函数原型: Clr_char_Scr(void)
//= 功 能: 清除当前文本屏幕
//= 参 数:
//= 返 回 值:
//= 函数性质:公有函数
**********************************/
void Clr_char_Scr(void)//文本屏可以在内存中保持很多屏
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -