📄 tg12864a.c
字号:
/****************************************************************************************************
* 文件名: TG12864A.c *
* Copyright (c) 2008 *********武汉理工大学信息工程学院电信系 *
* 创建人: 王康 *
* 日 期: 2008.8.6实现了液晶屏上任意显示汉字的功能 *
* 修改人: 王康 *
* 日 期: 2008.8.7完成了工程功能的扩充,即在液晶屏的任意位置打点,可以用来波形显示 *
* 描 述: 本文件包含了液晶模块的基本函数和显示汉字的所有操作子函数,可共其他的模块进行调用 *
* 接口定义: *
*
* 版 本: IAR V4.11 *
****************************************************************************************************/
//头文件
#include "config.h"
#include "ziku.h"
//定义结构体数组
struct Word_Buffer
{
uchar word[2];
};
struct Word_Buffer word_buf[32]; //定义结构体数组来存储待显示的汉字,共32个
/*****************************************************************************************************
* 函 数 名: LCD_12864_Init
* 功能描述: 本函数为初始化子函数
* 全局变量: 无
* 入口参数: 无
* 出口参数: 无
* 调用模块: 无
* 作 者: 王康
* 日 期: 2008.8.6
* 修 改 人: 王康
* 日 期:
* 版 本: IAR V4.11
******************************************************************************************************/
void LCD_12864_Init(void)
{
WriteCmd(0x3e); //关显示
LCD_12864_CON1_DIR = 0xff; //设置控制通道1方向为输出
LCD_12864_CON2_DIR = 0xff; //设置控制通道2方向为输出
WriteCmd(0x3f); //开显示
}
/*****************************************************************************************************
* 函 数 名: CheckBusy
* 功能描述: 本函数为判断LCD忙子函数,BUSY=1时,为忙;BUSY=0时,为空闲
* 全局变量: 无
* 入口参数:
* 出口参数: 无
* 调用模块: 无
* 作 者: 王康
* 日 期: 2008.8.6
* 修 改 人: 王康
* 日 期:
* 版 本: IAR V4.11
******************************************************************************************************/
void CheckBusy(void)
{
LCD_12864_DAT_DIR = 0xff; //设置数据通道方向为输出
LCD_12864_DAT_OUT = 0xff; //数据通道输出0xff
CLR_DI;
SET_RW0;
SET_E;
LCD_12864_DAT_DIR = 0x00;
while(LCD_12864_DAT_IN & 0x80); //BUSY=1时,为忙,则等待;BUSY=0时,为空闲
CLR_E;
// LCD_12864_DAT_OUT = 0x00; //数据通道输出0x00
}
/*****************************************************************************************************
* 函 数 名: WriteCmd
* 功能描述: 本函数为写指令子函数
* 全局变量: 无
* 入口参数: cmd -- 要写入的指令
* 出口参数: 无
* 调用模块: CheckBusy()
* 作 者: 王康
* 日 期: 2008.8.6
* 修 改 人: 王康
* 日 期:
* 版 本: IAR V4.11
******************************************************************************************************/
void WriteCmd(uchar cmd) //写指令子函数
{
uchar i;
CheckBusy();
CLR_DI;
CLR_RW0;
LCD_12864_DAT_DIR = 0xff; //设置数据通道方向为输出
LCD_12864_DAT_OUT = cmd; //将命令字cmd送入数据通道
SET_E;
for(i = 0; i < 100; i++);
CLR_E;
}
/*****************************************************************************************************
* 函 数 名: WriteData
* 功能描述: 本函数为写数据子函数
* 全局变量: 无
* 入口参数: data -- 要写入的数据
* opp -- 显示标志位: 为1,显示阳码(点亮为0);为0,显示阴码(点亮为1)
* 出口参数: 无
* 调用模块: CheckBusy()
* 作 者: 王康
* 日 期: 2008.8.6
* 修 改 人: 王康
* 日 期:
* 版 本: IAR V4.11
******************************************************************************************************/
void WriteData(uchar dat) //写数据子函数
{
uchar i;
CheckBusy();
SET_DI;
CLR_RW0;
LCD_12864_DAT_DIR = 0xff; //设置数据通道方向为输出
LCD_12864_DAT_OUT = dat; //将命令字cmd送入数据通道
SET_E;
for(i = 0; i < 100; i++);
CLR_E;
}
/*****************************************************************************************************
* 函 数 名: ReadData
* 功能描述: 本函数为读数据子函数
* 全局变量: 无
* 入口参数:
* 出口参数: 无
* 调用模块: CheckBusy()
* 作 者: 王康
* 日 期: 2008.8.6
* 修 改 人: 王康
* 日 期:
* 版 本: IAR V4.11
******************************************************************************************************/
uchar ReadData(void)
{
uchar rddata;
CheckBusy();
SET_DI;
SET_RW0;
SET_E;
LCD_12864_DAT_DIR = 0x00; //设置数据通道方向为输入
rddata = LCD_12864_DAT_IN;
CLR_E;
return rddata;
}
/*****************************************************************************************************
* 函 数 名: SetPos
* 功能描述: 本函数为设置显示起始地址(显示行,页地址,Y地址)子函数
* 全局变量: 无
* 入口参数: st_line -- 液晶显示的起始行,0--63,共64行
* xadd -- 液晶显示的页地址,即为DDRAM的行地址,8行为一页,共8页
* yadd -- 液晶显示的Y地址,0--128,在对DDRAM进行读/写操作后,Y地址指针自动加1
* 出口参数: 无
* 调用模块: WriteCmd()
* 作 者: 王康
* 日 期: 2008.8.6
* 修 改 人: 王康
* 日 期:
* 版 本: IAR V4.11
******************************************************************************************************/
void SetPos(uchar st_line, uchar x_add, uchar y_add) //设置显示起始地址子函数
{
st_line &= 0x3f; //st_line(起始行)的取值范围为0--63
x_add &= 0x07; //x_add(页地址)的取值范围为0--7
WriteCmd(st_line + 0xc0); //+ 0xc0根据液晶显示模块指令中设置起始行的格式
WriteCmd(x_add + 0xb8); //+ 0xb1根据液晶显示模块指令中设置页地址的格式
if(y_add < 64)
{
CLR_CS1;
SET_CS2;
WriteCmd(y_add + 0x40); //y_add的取值范围为0-63,y_add<64时,右半屏显示
}
else
{
SET_CS1;
CLR_CS2;
WriteCmd(y_add); //63<y_add<124时,左半屏显示
}
}
/*****************************************************************************************************
* 函 数 名: ClearDDRAM
* 功能描述: 本函数为清DDRAM子函数
* 全局变量: 无
* 入口参数: 无
* 出口参数: 无
* 调用模块: WriteData(),SetPos()
* 作 者: 王康
* 日 期: 2008.8.6
* 修 改 人: 王康
* 日 期:
* 版 本: IAR V4.11
******************************************************************************************************/
void ClearDDRAM(void)
{
uchar i; //i表示页地址
uchar j; //j表示列地址
for(i = 0; i < 8; i++) //清右半屏
{
//此处注意,起始行地址受到页地址的限制
SetPos(0, i, 0); //设置起始行为第0行,起始页为第0页,起始列为第0列
for(j = 0; j < 64; j++) //将右半屏DRAM的64个字节全部清零
{
WriteData(0);
}
}
for(i = 0; i < 8; i++) //清左半屏
{
SetPos(0, i, 64); //设置起始行为第0行,起始页为第0页,起始列为第64列
for(j = 0; j < 64; j++) //将左半屏DRAM的64个字节全部清零
{
WriteData(0);
}
}
}
/*****************************************************************************************************
* 函 数 名: WriteWord
* 功能描述: 本函数为在液晶屏的任意位置写单个汉字的子函数
* 全局变量: 无
* 入口参数: st_line,显示的起始行,0--63
* x_add,显示的页地址,0--7
* y_add,显示的列地址,0--63
* Index[2],字符串数组,用来存储汉字
* 出口参数: 无
* 调用模块: WriteData(),SetPos()
* 作 者: 王康
* 日 期: 2008.8.6
* 修 改 人: 王康
* 日 期:
* 版 本: IAR V4.11
******************************************************************************************************/
void WriteWord(uchar st_line, uchar x_add, uchar y_add, uchar Index[2])
{
uchar i;
uchar j;
if(y_add < 64)
{
CLR_CS1;
SET_CS2;
WriteCmd(y_add + 0x40);
}
else
{
SET_CS1;
CLR_CS2;
WriteCmd(y_add);
}
SetPos(st_line, x_add, y_add); //设置显示指针的位置
for(i = 0; i < 255; i++)
{
//汉字作为双字节字符串处理 采用顺序检索方式查找结构体名
if((GB_16[i].Index[0] == Index[0]) && (GB_16[i].Index[1] == Index[1]))
{
for(j = 0; j < 16; j++) //先写上半字节
{
WriteData(GB_16[i].Msk[j]);
}
SetPos(st_line, x_add + 1, y_add); //也地址加1,准备写下半字节
for(j = 16; j < 32; j++)
{
WriteData(GB_16[i].Msk[j]); //写下半字节
}
//break语句只能跳出一层循环
break; //break的用处是跳出for循环,以免重复写入
}
}
}
/*****************************************************************************************************
* 函 数 名: WriteFixWord
* 功能描述: 本函数为在液晶屏的固定位置写汉字的子函数
* 因为液晶每行显示8个汉字,一共能显示32个汉字,因此add%32可以得到显示的字为第几个,
* x_add只能为0,2,4,6;y_add只能为0,16,32,48,64,80,96,112.从而得到转换公式
* 全局变量: 无
* 入口参数: add,指定地址范围为0--31,全屏可写32个字(16*16)
* Index[2],字符串数组,用来存储汉字
* 出口参数: 无
* 调用模块: WriteWord()
* 作 者: 王康
* 日 期: 2008.8.6
* 修 改 人: 王康
* 日 期:
* 版 本: IAR V4.11
******************************************************************************************************/
void WriteFixWord(uchar add, uchar Index[2])
{
uchar st_line = 0; //设置起始行为0
uchar x_add = add % 32 / 8 * 2; //转换得到相应的x_add,y_add
uchar y_add = add % 32 % 8 * 16;
WriteWord(st_line, x_add, y_add, Index); //调用任意位置写单个汉字的子函数
}
/*****************************************************************************************************
* 函 数 名: WriteSentence
* 功能描述: 本函数为在液晶屏上写句子的子函数,按照0到31的顺序写入句子
* 从第0个字的位置开始写入汉字,写完一个之后字指针加1,继续写下一个汉字
* 全局变量: 无
* 入口参数: sentence[],待写入汉字,组成字符串
* 出口参数: 无
* 调用模块: WriteWord(),strlen()
* 作 者: 王康
* 日 期: 2008.8.6
* 修 改 人: 王康
* 日 期:
* 版 本: IAR V4.11
******************************************************************************************************/
void WriteSentence(uchar sentence[255])
{
uchar Index[2];
uchar i = 0;
uchar j = 0;
while(sentence[i] != '\0')
{
Index[0] = sentence[i];
Index[1] = sentence[i + 1];
i += 2;
WriteFixWord(j++, Index);
}
}
/*****************************************************************************************************
* 函 数 名: ScrolDisplay(调试未通过)
* 功能描述: 本函数为在液晶屏上滚动显示句子的子函数
* 所谓滚动显示,即需要建立一个显示缓冲区
* 全局变量: 无
* 入口参数: sentence[],待写入汉字,组成字符串
* 出口参数: 无
* 调用模块: WriteWord()
* 作 者: 王康
* 日 期: 2008.8.6
* 修 改 人: 王康
* 日 期:
* 版 本: IAR V4.11
******************************************************************************************************/
void ScrolDisplay(uchar sentence[255])
{
uchar i = 0;
uchar j;
while(sentence[i] != '\0')
{
for(j = 0; j <= i; j++)
{
word_buf[i].word[0] = sentence[i];
word_buf[i].word[1] = sentence[i + 1];
WriteFixWord(i,word_buf[i].word);
}
i += 2;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -