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

📄 tg12864a.c

📁 基于MSP430F14X单片机的红外接收程序
💻 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 + -