您的位置 首页 技术

内藏T6963C控制器的液晶模块的显现

本实验是以常用的8051单片机为实验样机,以CA12864B为显示样片叙述计算机与内置T6963C控制器的液晶显示模块的接口技术。本实验…

本试验是以常用的8051 单片机为试验样机,以CA12864B 为显现样片叙说核算机与内置T6963C 操控

器的液晶显现模块的接口技能。本试验选用的是直接拜访办法。
下面的程序都是通用的,假如要完成某一功用只需调用相应的子程序即可。调用子程序时只需在主程序

里调用相应的演示子程序,而写入程序由它的演示子程序调用。

一、C51程序:

/************************************************************************
图形液晶模块CA12864R的操控

T6963C

zhaojun
2008-1-19
*************************************************************************/
/****************** LCD12864指令 ********************************/

#include
#include
#include
/****************** LCD12864接线引脚界说 *************************/

#define LCM_WR P3_2 // 写操作信号
#define LCM_RD P3_3 // 读操作信号
#define LCM_CD P3_4 // 通道挑选信号
#define LCM_DATAP1 // 显现数据端口

#define uchar unsigned char
#define uint unsigned int

uchar code CCTAB [1024]={
/*– 宽度x高度=128×64 –*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x00,
0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x00,
0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x00,
0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x00,
0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x00,
0x00,0xF0,0x00,0x00,0x15,0x2A,0x00,0x00,0xF0,0x00,0x00,0xA8,0xA0,0x00,0x7C,0x00,
0x00,0xF0,0x00,0x00,0x00,0x55,0x00,0x03,0xC0,0x1F,0x00,0x54,0x00,0x00,0x7C,0x00,
0x00,0xF1,0xFF,0xFF,0x94,0xAA,0x0F,0xC7,0x80,0x11,0x80,0xA8,0xA9,0xFC,0x7C,0x00,
0x00,0xF3,0xFF,0xFF,0xA8,0x55,0x03,0xFF,0xF8,0x60,0xC0,0x51,0x54,0xFE,0x7C,0x00,
0x00,0xF3,0x00,0x00,0x14,0xAA,0x0F,0xFF,0xC0,0xDC,0x40,0x02,0xAA,0x06,0x7C,0x00,
0x00,0xF2,0x01,0x40,0x28,0x50,0x01,0xFF,0xFF,0xBE,0x41,0x45,0x54,0x06,0x7C,0x00,
0x00,0xF0,0xA2,0xA0,0x00,0x07,0xDF,0xFF,0x00,0x7E,0x62,0xA2,0xAA,0x06,0x7C,0x00,
0x00,0xF1,0x51,0x40,0x00,0x18,0xFF,0xFE,0x00,0x7E,0x21,0x45,0x54,0x06,0x7C,0x00,
0x00,0xF0,0xA2,0x80,0x00,0x21,0x9F,0xFC,0x00,0x1F,0x22,0xA2,0xAA,0x06,0x7C,0x00,
0x00,0xF1,0x50,0x00,0x00,0x46,0x3F,0xFC,0x00,0x07,0x21,0x45,0x54,0x06,0x7C,0x00,
0x00,0xF0,0xA2,0xA0,0x00,0x5C,0x7F,0x78,0x00,0x03,0x20,0x02,0xA8,0x06,0x7C,0x00,
0x00,0xF0,0x05,0x50,0x00,0x38,0xEE,0x78,0x00,0x00,0x60,0x01,0x50,0x06,0x7C,0x00,
0x00,0xF2,0x0A,0xA0,0x00,0x30,0xDC,0x70,0x00,0x00,0x30,0x00,0x00,0x06,0x7C,0x00,
0x00,0xF5,0x15,0x50,0x00,0x61,0x98,0x70,0x00,0x00,0x18,0x00,0x00,0x06,0x7C,0x00,
0x00,0xF2,0xAA,0xA0,0x00,0xC1,0x38,0x60,0x00,0x00,0x0C,0x00,0x00,0x00,0x7C,0x00,
0x00,0xF5,0x15,0x50,0x01,0x82,0x30,0x60,0x00,0x00,0x04,0x00,0x00,0x14,0x7C,0x00,
0x00,0xF0,0x2A,0xA0,0x53,0x02,0x20,0x40,0x00,0x00,0x06,0x00,0x00,0x2A,0x7C,0x00,
0x00,0xF3,0x15,0x40,0xA2,0x00,0x20,0x40,0x00,0x00,0x0E,0x00,0x0A,0x14,0x7C,0x00,
0x00,0xF3,0x2A,0x80,0x56,0x00,0x00,0x40,0x00,0x00,0x1F,0x00,0x15,0x2A,0x7C,0x00,
0x00,0xF3,0x15,0x00,0xA4,0x00,0x00,0x00,0x00,0x00,0x39,0x00,0x0A,0x14,0x7C,0x00,
0x00,0xF3,0x00,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x15,0x00,0x7C,0x00,
0x00,0xF3,0x00,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x0A,0x15,0x7C,0x00,
0x00,0xF3,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x00,0x2A,0xFC,0x00,
0x00,0xF3,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x0E,0x80,0x00,0x55,0x7C,0x00,
0x00,0xF3,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x28,0xAA,0xFC,0x00,
0x00,0xF3,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x50,0x55,0x7C,0x00,
0x00,0xF3,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x01,0xC0,0x28,0xAA,0xFC,0x00,
0x00,0xF3,0x00,0x14,0x08,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x50,0x55,0x7C,0x00,
0x00,0xF3,0x00,0x28,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0xAA,0xFC,0x00,
0x00,0xF3,0x05,0x14,0x07,0xFC,0x0F,0xFF,0xF0,0x80,0x18,0xC0,0x00,0x55,0x7C,0x00,
0x00,0xF3,0x0A,0xA8,0x0C,0x1C,0x08,0x00,0x1F,0x80,0x78,0xC0,0x00,0x2A,0x7C,0x00,
0x00,0xF3,0x15,0x00,0x0C,0x08,0x08,0x00,0x1C,0x80,0x78,0xC0,0x00,0x00,0x7C,0x00,
0x00,0xF3,0x0A,0x80,0x0A,0x10,0x04,0x00,0x0C,0x80,0x72,0xC0,0x00,0x06,0x7C,0x00,
0x00,0xF3,0x15,0x15,0x19,0xC0,0x03,0x00,0x03,0x00,0x3E,0xC0,0x00,0x06,0x7C,0x00,
0x00,0xF3,0x0A,0x2A,0x90,0x3E,0x00,0xFF,0xFC,0x00,0x7C,0x81,0x40,0x06,0x7C,0x00,
0x00,0xF3,0x00,0x55,0x50,0x3D,0x00,0x00,0x00,0x00,0x7C,0x80,0xA0,0x06,0x7C,0x00,
0x00,0xF3,0x28,0xAA,0x90,0x1F,0x00,0x00,0x00,0x00,0x79,0xA9,0x40,0x06,0x7C,0x00,
0x00,0xF3,0x54,0x55,0x53,0x1C,0x1C,0x01,0x50,0x00,0x3D,0x50,0xA0,0x06,0x7C,0x00,
0x00,0xF3,0x28,0xAA,0x9C,0x08,0x03,0x82,0xA8,0x00,0x7F,0x28,0x00,0x06,0x7C,0x00,
0x00,0xF3,0x50,0x55,0x19,0x08,0x00,0x71,0x50,0x00,0x7A,0x50,0x00,0x06,0x7C,0x00,
0x00,0xF3,0x00,0xAA,0x2A,0x08,0x7C,0x0C,0x00,0x00,0x66,0x01,0x50,0x06,0x7C,0x00,
0x00,0xF3,0x00,0x54,0x4D,0x08,0x03,0x02,0x00,0x00,0x0C,0x02,0xA8,0x06,0x7C,0x00,
0x00,0xF3,0xFF,0x28,0x16,0x08,0x38,0xC1,0x00,0x00,0x18,0x85,0x55,0xFE,0x7C,0x00,
0x00,0xF1,0xFF,0x80,0x87,0x08,0x06,0x30,0x00,0x00,0x31,0x4A,0xA9,0xFC,0x7C,0x00,
0x00,0xF0,0x00,0x00,0x29,0xCC,0x01,0x08,0x80,0x00,0xE2,0x85,0x54,0x00,0x7C,0x00,
0x00,0xF0,0x00,0x00,0x00,0x7E,0x00,0x84,0x00,0x03,0x81,0x4A,0xA8,0x00,0x7C,0x00,
0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x00,
0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x00,
0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x00,
0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

//============================ LCM12864操控部分 ========================================
code uchar Chinese [][32]={
/*– 文字: 赵 –*/
/*– 楷体_GB231212; 此字体下对应的点阵为:宽x高=16×16 –*/
0x00,0x00,0x04,0x00,0x04,0x10,0x07,0x10,0x1C,0x90,0x04,0x50,0x0F,0x20,0xF4,0x20,
0x07,0x50,0x24,0x88,0x35,0x08,0x4E,0x00,0x81,0xC0,0x00,0x3E,0x00,0x00,0x00,0x00,

/*– 文字: 俊 –*/
/*– 楷体_GB231212; 此字体下对应的点阵为:宽x高=16×16 –*/
0x00,0x40,0x08,0x40,0x08,0x90,0x11,0x38,0x13,0xC8,0x30,0x20,0x51,0x18,0x92,0x88,
0x14,0xF0,0x11,0x10,0x12,0xA0,0x14,0x60,0x11,0x9E,0x10,0x00,0x00,0x00,0x00,0x00,

/*– 文字: 设 –*/
/*– 楷体_GB231212; 此字体下对应的点阵为:宽x高=16×16 –*/
0x00,0x00,0x20,0xE0,0x11,0x20,0x01,0x20,0x01,0x20,0x62,0x38,0xA4,0x00,0x21,0xE0,
0x22,0x20,0x21,0x40,0x28,0x80,0x31,0x40,0x22,0x30,0x0C,0x1E,0x00,0x00,0x00,0x00,

/*– 文字: 计 –*/
/*– 楷体_GB231212; 此字体下对应的点阵为:宽x高=16×16 –*/
0x00,0x40,0x10,0x40,0x08,0x40,0x00,0x40,0x00,0x40,0x30,0x7C,0xD3,0xC0,0x10,0x40,
0x10,0x40,0x14,0x40,0x18,0x40,0x10,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,
};

/*****************************************************
函 数 名:void LCM_ReadStatus(void)
功 能:读忙状况
说 明:判别LCM的作业状况字;也能够不必此函数,用一段延时程序替代
进口参数:无
返 回 值:无
*****************************************************/
void LCM_ReadStatus(void)
{
do
{
LCM_DATA = 0xFF; // LCM数据口先置1
LCM_CD = 1; // CD=1为指令通道,CD=0为数据通道
LCM_RD = 0; // 核算机对T6963C进行读操作
ACC=LCM_DATA;
LCM_RD = 1;
}while((ACC&0x03)!=0x03); // 低电平忙
}

/*****************************************************
函 数 名:void LCM_AutoWriteStatus(void)
功 能:数据主动写时LCM的状况字
说 明:让数据主动读写时,要判别LCM是否忙
进口参数:无
返 回 值:无
*****************************************************/
void LCM_AutoWriteStatus(void)
{
do
{
LCM_DATA = 0xFF; // LCM数据口先置1
LCM_CD = 1; // CD=1为指令通道,CD=0为数据通道
LCM_RD = 0; // 核算机对T6963C进行读操作
ACC=LCM_DATA;
LCM_RD = 1;
}while((ACC&0x08)!=0x08); // 低电平忙
}

/*****************************************************
函 数 名:void LCM_WriteData(uchar WDLCM)
功 能:向LCM12864中写入数据
说 明:将形参WDLCM中的数据写入LCM中
进口参数:WDLCM
返 回 值:无
*****************************************************/
void LCM_WriteData(uchar WDLCM)
{
LCM_ReadStatus(); // 指令&数据读写状况
LCM_CD = 0; // 通道挑选:答应写入数据
LCM_DATA = WDLCM; // 写入数据到LCM
LCM_WR = 0; // WR=0
LCM_WR = 1; // WR=1
}

/*****************************************************
函 数 名:void LCM_WriteCommand(uchar WCLCM)
功 能:向LCM12864中写入无参指令
说 明:向LCM中写入指令
进口参数:WCLCM
返 回 值:无
*****************************************************/
void LCM_WriteCommand(uchar WCLCM)
{
LCM_ReadStatus();
LCM_DATA = WCLCM; // 写入指令到LCM
LCM_CD = 1; // 通道挑选:答应写入指令
LCM_WR = 0; // WR=0
LCM_WR = 1; // WR=1
}

/*****************************************************
函 数 名:void LCM_WriteCommand0ne(uchar WDATA,uchar WCLCM)
功 能:向LCM12864中写入单参指令
说 明:向LCM中写入指令
进口参数:WCLCM
返 回 值:无
*****************************************************/
void LCM_WriteCommand0ne(uchar WDATA,uchar WCOM)
{
LCM_ReadStatus();
LCM_WriteData(WDATA);
LCM_ReadStatus();
LCM_WriteCommand(WCOM);
}

/*****************************************************
函 数 名:void LCM_WriteCommandTwo(uchar WD1,uchar WD2,uchar WCOMD)
功 能:向LCM12864中写入双参指令
说 明:向LCM中写入指令
进口参数:WCLCM
返 回 值:无
*****************************************************/
void LCM_WriteCommandTwo(uchar WD1,uchar WD2,uchar WCOMD)
{
LCM_ReadStatus();
LCM_WriteData(WD1);
LCM_ReadStatus();
LCM_WriteData(WD2);
LCM_ReadStatus();
LCM_WriteCommand(WCOMD);
}
/*****************************************************
函 数 名:void LCM_Init()
功 能:初始化LCM12864
说 明:LCM在作业前先要对显现屏初始化,不然模块无法正常作业
进口参数:无
返 回 值:无
*****************************************************/
//LCM初始化
void LCM_Init(void)
{
LCM_WriteCommandTwo(0,0,0×40); // 设置文本显现区首地址
LCM_WriteCommandTwo(0x10,0,0×41); // 设置文本显现区宽度
LCM_WriteCommandTwo(0,0×08,0x42); // 设置图形显现区首地址0x0800
LCM_WriteCommandTwo(0x10,0,0×43); // 设置图形显现区宽度
LCM_WriteCommand(0xA7); // 设置光标形状 8×8方块
LCM_WriteCommand(0x80); // 显现办法设置:文本或图形
LCM_WriteCommand(0x9c); // 显现开关设置:文本开,图形开,光标闪耀关
}

/*****************************************************
函 数 名:void LCM_Clear(void)
功 能:清显现存储器函数
说 明:
进口参数:无
返 回 值:无
*****************************************************/
void LCM_Clear(void)
{
uint i = 8192; // 此处仅清8K RAM,假如32K RAM都运用,请批改i=32768
LCM_WriteCommandTwo(0x00,0x00,0x24);
LCM_WriteCommand(0xB0); // 进入主动写
while(i–)
{
LCM_AutoWriteStatus(); // 数据主动写状况
LCM_WriteData(0x00); // 写入数据
}
LCM_WriteCommand(0xB2); // 写完后退出,退出主动写
}

/*****************************************************
函 数 名:void LCM_DisplayePicture(uchar arr[])
功 能:显现图片
说 明:在液晶模块上显现一幅图片
进口参数:arr[]为图片
返 回 值:无
*****************************************************/
void LCM_DisplayePicture(uchar arr[])
{
uint i=0;
LCM_WriteCommandTwo(0,0×08,0x24); // 设置图形显现RAM地址
while(i<1024) // (128/8)*64
LCM_WriteCommand0ne(arr[i++],0xC0); // 写入数据
}

/*****************************************************
函 数 名:void LCM_DisplayOneChar()
功 能:按指定坐标中写入数据
说 明:X-横坐标,Y-纵坐标,DData为库内编码值
进口参数:x,y,DDATA
返 回 值:无
*****************************************************/
void LCM_DisplayOneChar(uchar x,uchar y,uchar DDATA)
{
uchar add;
add=y<<4|x; // 地址整合:y为高位地址,x为低位地址
LCM_WriteCommandTwo(add,0x00,0x24); // 写入字符显现地址
LCM_WriteCommand0ne(DDATA,0xC0); // 写入数据
}

/*****************************************************
函 数 名:void LCM_DisplayListChar(uchar x,uchar y,uchar *arr)
功 能:显现字符串
说 明:直接写字符串时,要减32;但写入数组时,就不必减
进口参数:x,y,*arr
返 回 值:无
*****************************************************/
void LCM_DisplayListChar(uchar x,uchar y,uchar *arr)
{
uchar i,add,ListLength;
ListLength=strlen(arr); // 读出字符串的长度
add=y<<4|x; // 地址整合:y为高位地址,x为低位地址
for(i=0;i {
LCM_DisplayOneChar(x,y,arr[i]-0x20); // 写入一个字符
x++; // 地址加1
}
}

/*****************************************************
函 数 名:void LCM_WriteChinese()
功 能:图形办法下写入汉字程序
说 明:每次写入一个汉字
进口参数:x,y,num,arr[][32]
返 回 值:无
*****************************************************/
void LCM_WriteChinese(uchar x,uchar y,uchar num,uchar arr[][32])
{
uchar i,j=0;
x *=2; // x每次以2增加
for(i=0;i<16;i++) // 循环写入汉字字模
{
LCM_WriteCommandTwo(x,y+0x08,0x24); // 写入汉字显现地址
LCM_WriteCommand0ne(arr[num][j],0xC0); // 写入汉字的左部字模
j++; // 取下一数据
LCM_WriteCommand0ne(arr[num][j],0xC0); // 写入汉字的左部字模
j++; // 取下一数据
x +=16; // 下一行显现
}
}

/*****************************************************
函 数 名:主函数
功 能:完成显现
说 明:
进口参数:无
返 回 值:无
*****************************************************/

void main()
{
LCM_Init(); // 初始化LCM
LCM_Clear(); // 清屏
LCM_DisplayePicture(CCTAB); // 写入一幅图
LCM_WriteChinese(2,0,0,Chinese); // 写入”赵”
LCM_WriteChinese(3,0,1,Chinese); // 写入”俊”
LCM_WriteChinese(4,0,2,Chinese); // 写入”设”
LCM_WriteChinese(5,0,3,Chinese); // 写入”计”
while(1);
}

/*============================= 程序完毕 =============================================*/

二、汇编程序:
= = = = = = = = = =主程序= = = = = = = = = =
ORG 0000H
START : ORL P3,#1CH ?直接操控办法操控线初始化
LCALL INT ?调用初始化子程序
LCALL CLEAR ?调用清屏子程序
. . . . . . ?调用其他子程序
SJMP $
= = = = = = = T6963C 直接拜访通用子程序= = = = = =
一、直接操控办法驱动子程序:
DAT1 EQU 30H ?榜首参数单元
DAT2 EQU 31H ?第二参数单元
COM EQU 32H ?指令代码单元
C_ADD EQU 8100H ?指令通道单元
D_ADD EQU 8000H ?数据通道单元
WR1 EQU P3.2 ?写操作信号
RD1 EQU P3.3 ?读操作信号
CD EQU P3.4 ?通道挑选信号
? _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
; 读状况字子程序
R_ST : ORL P3,#1CH ?直接操控办法操控线初始化
MOV P1,#0FFH ?P1 口置”1″
SETB CD ?CD=1
CLR RD ?RD=0
MOV A,P1 ?读操作
SETB RD ?RD=1
RET
?;
判状况位S1,S0 子程序(读写指令和读写数据状况)
ST01 : LCALL R_ST
JNB ACC.0,ST01 ?S0=1,次序履行,不然循环
JNB ACC.1,ST01 ?S1=1,次序履行,不然循环
RET
?;
判状况位S2 子程序(数据主动读状况)
ST2 : LCALL R_ST
JNB ACC.2,ST2 ?S2=1,次序履行,不然循环
RET
?;
判状况位S3 子程序(数据主动写状况)
ST3 : LCALL R_ST
JNB ACC.3,ST3 ?S1=1,次序履行,不然循环
RET
?;
判状况位S6 子程序(屏读/屏复制状况)
ST6 : LCALL R_ST
JNB ACC.6,ERR ?S6=1,次序履行,过错批改
RET
ERR : LJMP ST6 ?过错批改
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
; 写指令和写数据子程序
PR1 : LCALL ST01 ?双字节参数指令写入进口
MOV A,DAT1 ?取榜首参数单元数据
LCALL PR13 ?写入参数
PR11 : LCALL ST01 ?单字节参数指令写入进口
MOV A,DAT2 ?取第二参数单元数据
LCALL PR13 ?写入参数
PR12 : LCALL ST01 ?无参数指令写入进口
MOV A,COM ?取指令代码单元数据
LJMP PR14 ?写入指令代码
PR13 : CLR CD ?C/D=0/数据写入进口
PR14 : MOV P1,A ?设置数据
CLR WR1 ?WR=0
SETB WR1 ?WR=1
RET
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
; 读数据子程序
PR2 : LCALL ST01 ?判别状况位
CLR CD ?C/D=0
MOV P1,#0FFH ?P1 口置”1″
CLR RD ?RD=0
MOV A,P1 ?读取数据
SETB RD ?RD=1
MOV DAT2,A ?数据存入第二参数/数据单元
RET
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
二、初始化设置子程序
初始化设置主要是对显现区域的设置和显现办法的设置。此程序只需在主程序对体系初始化时调用一
次就能够了,除非要在运用中需求改动设置。其间在不同的显现办法下,其最终的两条指令不同,应根据
需求改动其值。
INT : MOV DAT1,#00H ?设置文本显现区域首地址
MOV DAT2,#00H
MOV COM,#40H
LCALL PR1
MOV DAT1,#10H ?设置文本显现区域宽度
MOV DAT2,#00H ?即一行显现所占字节数
MOV COM,#41H
LCALL PR1
MOV DAT1,#00H ?数值图形显现区域首地址
MOV DAT2,#08H ?或为文本特点区域首地址
MOV COM,#42H
LCALL PR1
MOV DAT1,#10H ?数值图形显现区域宽度
MOV DAT2,#00H ?或为文本特点区域宽度
MOV COM,#43H ?即一行显现所占字节数
LCALL PR1
MOV COM,#0A7H ?光标形状设置
LCALL PR12
MOV COM,#80H ?显现办法设置逻辑”或”组成
LCALL PR12
MOV COM,#98H ?显现开关设置开图形显现
LCALL PR12
RET
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
三、清显现存储器子程序
该子程序对显现存储器彻底清零,不分显现区域性质。所以在初始化是运用和在全显现存储器需求清
零时运用。别的该程序也能够作为接口电路及驱动程序的调试运用,将写入的数据不为“0”,即可调查显
示作用。
CLEAR : MOV DAT1,#00H ?设置显现存储器首地址
MOV DAT2,#00H
MOV COM,#24H
LCALL PR1
MOV R3,#00H ?设置循环量
MOV R4,#20H
MOV COM,#0B0H ?设置主动写办法
LCALL PR12
CLEAR1 : LCALL ST3 ?判状况为S2
MOV A,#00H ?置数据”0″
LCALL PR13 ?写入数据
DJNZ R3,CLEAR1 ?循环
DJNZ R4,CLEAR1
MOV COM,#0B2H ?设置主动写完毕指令
LCALL PR12
RET
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
四、文本办法汉字显现子程序
该子程序是在内部CGROM 有用时树立CGRAM 子程序的。所以运用的字符代码是从80H 开端的。本
程序有两中树立CGRAM 的子程序,其不同之处只是是因为选用不同的字模提取软件罢了。而关于汉字写
入子程序则是通用的。
文本办法汉字显现演示
WBXS : MOV COUNT,#08H ?树立8 字节CGRAM(2 个汉字)
LCALL CGRAM ?树立CGRAM 子程序
MOV CODE1,#80H ?显现”液”
MOV O_X,#03H
MOV O_Y,#02H
LCALL WRI_CT ?写入汉字
MOV CODE1,#84H ?显现”晶”
MOV O_X,#07H
MOV O_Y,#02H
LCALL WRI_CT ?写入汉字
RET
汉字写入子程序(文本办法)
O_Y EQU 34H ?Y 坐标
O_X EQU 35H ?X 坐标
COUNT EQU 36H ?计数器
WRI_CT : MOV A,O_Y ?核算显现RAM 地址
MOV B,#10H
MUL AB
ADD A,O_X
MOV O_X,A
MOV DAT1,A
MOV A,B
ADDC A,#00H ?文本显现区首地址为0000H
MOV O_Y,A
MOV DAT2,A ?设置显现RAM 地址
MOV COM,#24H
LCALL PR1
MOV A,CODE1 ?取汉字代码
MOV DAT2,A ?写入左上半部汉字代码
MOV COM,#0C0H
LCALL PR11
MOV A,CODE1
ADD A,#02H
MOV DAT2,A ?写入右上半部汉字代码
LCALL PR11
MOV A,#10H ?显现RAM 地址批改
ADD A,O_X
MOV DAT1,A
CLR A
ADDC A,O_Y
MOV DAT2,A
MOV COM,#24H ?设置显现RAM 地址
LCALL PR1
MOV A,CODE1
INC A
MOV DAT2,A ?写入左下半部汉字代码
MOV COM,#0C0H
LCALL PR11
MOV A,CODE1
ADD A,#03H
MOV DAT2,A ?写入右下半部汉字代码
LCALL PR11
RET
① 树立CGRAM 子程序
CODE1 EQU 33H ?汉字字符代码
CGRAM : MOV DAT1,#03H ?设置CGRAM 偏置地址
MOV DAT2,#00H
MOV COM,#22H
LCALL PR1
MOV DAT1,#00H ?设置存储器地址指针
MOV DAT2,#1CH
MOV COM,#24H
LCALL PR1
MOV COM,#0B0H ?设置主动写办法
LCALL PR12
MOV A,COUNT ?核算写入的字节数
MOV B,#08H
MUL AB
MOV COUNT,A ?核算低8 位数据
INC B ?核算高8 位数据
MOV DPTR,#CGTAB ?取字符库首地址
PUSH DPH ?存字符库指针
PUSH DPL
CGRAM1 : LCALL ST3 ?判主动写状况位
POP DPL ?取字符库指针
POP DPH
CLR A
MOVC A,@A+DPTR ?取数据
INC DPTR ?字符库指针加一
PUSH DPH ?存字符库指针
PUSH DPL
LCALL PR13 ?写入数据
DJNZ COUNT,CGRAM1 ?计数循环
DJNZ B,CGRAM1
MOV COM,#0B2H ?写入完毕主动写指令
LCALL PR12
POP ACC ?批改栈指针
POP ACC
RET
; 汉字库
CGTAB : DB 00H,040H,37H,10H,081H,061H,22H,0AH ?”液”
DB 16H,02BH,0E2H,22H,22H,22H,023H,22H
DB 80H,044H,0FEH,20H,20H,03CH,44H,64H
DB 98H,048H,50H,20H,50H,08EH,004H,00H
DB 00FH,08H,08H,00FH,08H,08H,00FH,08H ?”晶”
DB 07EH,42H,42H,07EH,42H,42H,07EH,42H
DB 0E0H,20H,20H,0E0H,20H,20H,0E0H,24H
DB 0FEH,84H,84H,0FCH,84H,84H,0FCH,84H
? 用PICKHZB。EXE 提取字模
? 汉字字模摆放格局为第1~16 字节为汉字左半部分自上而下摆放的数据,
? 第17~32 字节为汉字右半部分自上而下摆放的字模数据。
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
?0117?
?0218?
. . . . . .
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
② 树立CGRAM 子程序
CODE1 EQU 33H ?汉字字符代码
CGRAM : MOV DAT1,#03H ?设置CGRAM 偏置地址
MOV DAT2,#00H
MOV COM,#22H
LCALL PR1
;写入左半部分字模
MOV R0,#00H ?核算存储地址(奇数部分)
CGRAM0 : MOV A,R0
MOV B,#20H
MUL AB
MOV DAT1,A ?低位地址
MOV A,B
ADD A,#1CH
MOV DAT2,A ?高位地址
MOV COM,#24H ?设置存储器地址指针
LCALL PR1
MOV COM,#0B0H ?设置主动写办法
LCALL PR12
MOV R1,#02H ?接连写入字节数
MOV A,R1 ?核算写入的字节数
MOV B,#08H
MUL AB
MOV R1,A ?核算低8 位数据
INC B ?核算高8 位数据
CJNE R0,#00H,CRAM0 ?从第2次起越过符库首地址读取
MOV DPTR,#CGTAB ?取字符库首地址
CRAM0 : PUSH DPH ?存字符库指针
PUSH DPL
CGRAM1 : LCALL ST3 ?判主动写状况位
POP DPL ?取字符库指针
POP DPH
CLR A
MOVC A,@A+DPTR ?取数据
INC DPTR ?字符库指针加一
INC DPTR
PUSH DPH ?存字符库指针
PUSH DPL
LCALL PR13 ?写入数据
DJNZ R1,CGRAM1 ?计数循环
DJNZ B,CGRAM1
MOV COM,#0B2H ?写入完毕主动写指令
LCALL PR12
POP ACC ?批改栈指针
POP ACC
INC R0 ?R0 加”1″
DJNZ COUNT,CGRAM0 ?判别左半部分是否写完
;写入右半部分字模
MOV R0,#01H ?核算存储地址(偶数部分)
CGRAM2 : MOV A,R0
MOV B,#10H
MUL AB
MOV DAT1,A ?低位地址
MOV A,B
ADD A,#1CH
MOV DAT2,A ?高位地址
MOV COM,#24H ?设置存储器地址指针
LCALL PR1
MOV COM,#0B0H ?设置主动写办法
LCALL PR12
MOV R1,#02H ?接连写入字节数
MOV A,R1 ?核算写入的字节数
MOV B,#08H
MUL AB
MOV R1,A ?核算低8 位数据
INC B ?核算高8 位数据
CJNE R0,#01H,CRAM1 ?从第2次起越过符库首地址读取
MOV DPTR,#CGTAB ?取字符库首地址
INC DPTR
CRAM1 : PUSH DPH ?存字符库指针
PUSH DPL
CGRAM3 : LCALL ST3 ?判主动写状况位
POP DPL ?取字符库指针
POP DPH
CLR A
MOVC A,@A+DPTR ?取数据
INC DPTR ?字符库指针加一
INC DPTR
PUSH DPH ?存字符库指针
PUSH DPL
LCALL PR13 ?写入数据
DJNZ R1,CGRAM3 ?计数循环
DJNZ B,CGRAM3
MOV COM,#0B2H ?写入完毕主动写指令
LCALL PR12
POP ACC ?批改栈指针
POP ACC
INC R0 ?R0 加”2″
INC R0
DJNZ COUNT,CGRAM2 ?判别右半部分是否写完
RET
; 汉字库
CGTAB : ?宠[16*16]横排
DB 02h, 00h, 01h, 00h, 7Fh, 0FEh, 42h, 02h?代码为80H
DB 82h, 84h, 02h, 50h, 3Fh, 0F8h, 02h, 80h
DB 02h, 90h, 04h, 0B0h, 04h, 0C0h, 08h, 80h
DB 09h, 82h, 12h, 82h, 20h, 7Eh, 40h, 00h
?辱[16*16]横排
DB 00h, 10h, 3Fh, 0F8h, 20h, 00h, 2Fh, 0F0h?代码为84H
DB 20h, 00h, 3Fh, 0FCh, 29h, 10h, 28h, 0A0h
DB 4Ah, 60h, 8Ch, 1Ch, 00h, 20h, 0FFh, 0FEh
DB 04h, 20h, 02h, 20h, 00h, 0A0h, 00h, 40h
树立CGRAM 的过程:
1.在程序区内树立汉字字模表CGTAB;
2.汉字代码界说(以“宠”=80H 为例)
80H 汉字代码(表明汉字左上半部字模代码)
81H 隐含代码(表明汉字左下半部字模代码)
82H 隐含代码(表明汉字右上半部字模代码)
81H 隐含代码(表明汉字右下半部字模代码)
3.写入N 汉字的字模数据,设置COUNT 值为N*4
4.调用CGRAM 子程序
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
五、图形办法文本显现子程序
在图形办法下显现汉字是比较常用的办法。汉字字库作在程序区内,按排界说各汉字的代码。写入汉
字字模好像写入图形数据一般,这儿供给单字节汉字代码运用的汉字写入子程序。(即只要汉字,没有特点
的显现子程序)
图形办法文本演示程序
WBYS : MOV CODE1,#00H ?显现”宠”
MOV O_X,#00H
MOV O_Y,#00H
LCALL WRI_CC ?文本写入子程序
MOV CODE1,#01H ?显现”辱”
MOV O_X,#02H
MOV O_Y,#00H
LCALL WRI_CC
RET
图形办法下的写入程序
CODE1 EQU 33H ?汉字字符代码
O_Y EQU 35H ?Y 坐标
O_X EQU 36H ?X 坐标
COUNT EQU 34H ?计数器
WRI_CC : MOV A,O_Y ?核算图形显现RAM 地址
MOV B,#10H ?图形显现区宽度为20H
MUL AB
ADD A,O_X
MOV O_X,A
MOV A,B
ADDC A,#00H ?图形显现区首地址为0000H
MOV O_Y,A
MOV DPTR,#CCTAB ?核算汉字库字符首地址
MOV A,CODE1
MOV B,#20H
MUL AB
ADD A,DPL
MOV DPL,A
MOV A,B
ADDC A,DPH
MOV DPH,A
PUSH DPH ?存字库地址指针
PUSH DPL
MOV COUNT,#10H ?计数器设置为16 次
WRI_CC1 : MOV DAT1,O_X ?设置显现RAM 地址
MOV DAT2,O_Y
MOV COM,#24H
LCALL PR1
POP DPL ?取字库地址指针
POP DPH
CLR A
MOVC A,@A+DPTR ?取左部字模数据(奇数字模)
MOV DAT2,A ?设置数据
MOV A,#01H ?偏置地址为1
MOVC A,@A+DPTR ?取右部字模数据
MOV DAT1,A ?暂存数据
INC DPTR ?字库地址指针加一
INC DPTR ?字库地址指针加一
PUSH DPH ?存字库地址指针
PUSH DPL
MOV COM,#0C0H ?设置一次写数据指令代码
LCALL PR11 ?写入数据
MOV DAT2,DAT1 ?设置右部数据(偶数字模)
LCALL PR11 ?写入数据
MOV A,#10H ?显现RAM 地址批改
ADD A,O_X
MOV O_X,A
CLR A
ADDC A,O_Y
MOV O_Y,A
DJNZ COUNT,WRI_CC1 ?计数器循环
POP ACC ?批改栈指针
POP ACC
RET
; 汉字库
CCTAB : ?宠[16*16]横排
DB 02h, 00h, 01h, 00h, 7Fh, 0FEh, 42h, 02h?代码为00H
DB 82h, 84h, 02h, 50h, 3Fh, 0F8h, 02h, 80h
DB 02h, 90h, 04h, 0B0h, 04h, 0C0h, 08h, 80h
DB 09h, 82h, 12h, 82h, 20h, 7Eh, 40h, 00h
?辱[16*16]横排
DB 00h, 10h, 3Fh, 0F8h, 20h, 00h, 2Fh, 0F0h?代码为01H
DB 20h, 00h, 3Fh, 0FCh, 29h, 10h, 28h, 0A0h
DB 4Ah, 60h, 8Ch, 1Ch, 00h, 20h, 0FFh, 0FEh
DB 04h, 20h, 02h, 20h, 00h, 0A0h, 00h, 40h
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
六、西文字符写入子程序(文本特点显现办法的运用)
非文本特点显现办法的西文字符写入十分简略,先设置显现地址指针( 24H),再写入字符代码即可。
能够取WRI_C 程序的前15 条指令作为参阅。
西文演示子程序
XWXS : MOV COM,#84H ?设置文本特点显现办法
LCALL PR12
MOV COM,#9FH ?开文本,图形显现及光标闪耀显现
LCALL PR12
MOV DAT1,#0EH ?光标地址设置
MOV DAT2,#04H
MOV COM,#21H
LCALL PR1
LOOPA : MOV R2,#00H ?设置表间址寄存器=0
MOV R3,#00H ?设置显现X 坐标寄存器=0
MOV R4,#04H ?设置显现Y 坐标寄存器=1
LOOPB : MOV A,R2
MOV DPTR,#DTAB ?取代码首地址
MOVC A,@A+DPTR
MOV CODE1,A ?置字符代码
MOV ATTR,#05H ?设置负向显现
MOV O_X,R3 ?置X 坐标
MOV O_Y,R4 ?置Y 坐标
LCALL WRI_C ?调子西文显现程序
LCALL DELAY
MOV ATTR,#00H ?设置正向显现
MOV O_X,R3 ?置X 坐标
MOV O_Y,R4 ?置Y 坐标
LCALL WRI_C ?调子西文显现程序
LCALL DELAY
INC R2 ?表间址寄存器
INC R3 ?X 坐标加1
MOV A,R2
CJNE A,#12,LOOPB ?写入西文个数
LCALL DELAY
LJMP LOOPA
DELAY : MOV R5,#00H ?延时子程序
MOV R6,#00H
DELAY1: NOP
DJNZ R5,DELAY1
DJNZ R6,DELAY1
RET
西文显现子程序
CODE1 EQU 33H ?汉字字符代码
O_Y EQU 35H ?Y 坐标
O_X EQU 36H ?X 坐标
ATTR EQU 37H ?字符特点码(低4 位有用)
WRI_C : MOV A,O_Y ?核算文本显现RAM 地址
MOV B,#10H ?文本显现区宽度为10H
MUL AB
ADD A,O_X
MOV DAT1,A ?地址低8 位
MOV A,B
ADDC A,#00H
MOV DAT2,A ?地址高8 位
PUSH ACC ?存地址的高8 位
MOV COM,#24H ?设置地址指针
LCALL PR1
MOV DAT2,CODE1 ?写入字符代码
MOV COM,#0C4H
LCALL PR11
POP ACC
ADD A,#08H ?取地址的高8 位
MOV DAT2,A
MOV COM,#24H ?设置地址指针
LCALL PR1
MOV DAT2,ATTR ?写入特点参数
MOV COM,#0C4H
LCALL PR11
RET
字符库
DTAB : DB 37H,45H,4CH,43H,4FH,4DH,45H
DB 00H,39H,4FH,55H,01H ?Welcom You!
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
七、绘点与消点子程序
使用T6963C 的位操作指令,可很简略的设置点或铲除点。这样使作图或作曲线简略化了。程序的关
键点在于点地址的核算上。在演示程序中如是用的是置位指令则是用于置点。而用清零指令(即注释指令)
则是用于清零。
绘点演示子程序
LOOP0 : MOV R2,#00H ?X 坐标=0
MOV R3,#00H ?Y 坐标=0
MOV R4,#50H ?循环量=80
LOOP1 : MOV A,R2
MOV O_X,A ?设置X 坐标
MOV A,R3
SETB ACC.7 ?设置置点标志位
? CLR ACC.7 ?设置消点标志位
MOV O_Y,A ?设置Y 坐标
LCALL WRI_D ?调绘点子程序
INC R2 ?X 坐标加一
INC R3 ?Y 坐标加一
DJNZ R4,LOOP1 ?循环
DEC R3 ?Y 坐标减二
DEC R3
LOOP2 : MOV A,R2
MOV O_X,A
MOV A,R3
SETB ACC.7 ?设置置点标志位
? CLR ACC.7 ?设置消点标志位
MOV O_Y,A
LCALL WRI_D
INC R2 ?X 坐标加一
DJNZ R3,LOOP2 ?循环
MOV R4,#50H ?循环量=80
LOOP3 : MOV A,R2
MOV O_X,A
MOV A,R3
SETB ACC.7 ?设置置点标志位
? CLR ACC.7 ?设置消点标志位
MOV O_Y,A
LCALL WRI_D
INC R2 ?X 坐标加一
INC R3 ?Y 坐标加一
DJNZ R4,LOOP3 ?循环
RET
绘点子程序
O_Y EQU 35H ?Y 坐标(D7=1 置点? D7=0 清零)
O_X EQU 36H ?X 坐标
WRI_D : MOV A,O_Y ?核算图形显现RAM 地址
CLR ACC.7
MOV B,#10H ?图形显现区宽度位10H
MUL AB
MOV DAT1,A
MOV DAT2,B
MOV A,O_X ?核算列地址
MOV B,#08H
DIV AB ?B 为点数值
ADD A,DAT1
MOV DAT1,A
MOV A,#08H ?图形显现区首地址为0800H
ADDC A,DAT2
MOV DAT2,A
MOV COM,#24H ?设置显现RAM 地址
LCALL PR1
MOV A,B ?转化位数据
CPL A
ANL A,#07H
XCH A,O_Y ?设置置/消点位
SWAP A
ANL A,#08H
ORL A,#0F0H ?设置位操作指令标志
ORL A,O_Y ?设置操作位
MOV COM,A ?设置位操作指令
LCALL PR12
RET

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/jishu/275840.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部