📄 lcmdrv.c
字号:
/****************************************Copyright (c)**************************************************
**--------------File Info-------------------------------------------------------------------------------
** File name: LCMDRV.C
** Last modified Date:2007-12-20
** Last Version: 1.0
** Descriptions: MG12864图形液晶模块驱动程序。T6963C控制器
**------------------------------------------------------------------------------------------------------
** Created by: Rein Lee
** Created date: 2007-12-20
** Version: 1.0
** Descriptions: The original version
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
********************************************************************************************************/
#include "config.h"
/* 定义总线起始的GPIO,即D0对应的GPIO值(P0.4) */
/* 定义显示缓冲区 */
#define BUS_NO 4
/* 输出总线数据宏定义 */
#define OutData(dat) IO0DIR = IO0DIR |(0xff<<BUS_NO); IO0CLR = 0xff<<BUS_NO; IO0SET = (dat&0xff)<<BUS_NO
#define InData() IO0DIR = IO0DIR &~(0x000000ff<<BUS_NO);dat = (uint8)((IO0PIN&(0xFFFFFFFF))>>BUS_NO)
/* 定义READ控制 */
#define LCM_RD 12
#define LCM_UNREAD() IO0SET = 1<<LCM_RD
#define LCM_READ() IO0CLR = 1<<LCM_RD
/* 定义WRITE控制 */
#define LCM_WR 13
#define LCM_UNWRITE() IO0SET = 1<<LCM_WR
#define LCM_WRITE() IO0CLR = 1<<LCM_WR
/* 定义C/D#控制 */
#define LCM_CD 14
#define LCM_COM() IO0SET = 1<<LCM_CD
#define LCM_DATA() IO0CLR = 1<<LCM_CD
/* 定义C/D#控制 */
#define LCM_CE 15
#define LCM_DISABLE() IO0SET = 1<<LCM_CE
#define LCM_ENABLE() IO0CLR = 1<<LCM_CE
/* 定义LCM操作的命令字 */
// T6963C 命令定义
#define LCM_CUR_POS 0x21 // 光标位置设置
#define LCM_CGR_POS 0x22 // CGRAM 偏置地址设置
#define LCM_ADD_POS 0x24 // 地址指针位置
#define LCM_TXT_STP 0x40 // 文本区首址
#define LCM_TXT_WID 0x41 // 文本区宽度
#define LCM_GRH_STP 0x42 // 图形区首址
#define LCM_GRH_WID 0x43 // 图形区宽度
#define LCM_MOD_OR 0x80 // 显示方式逻辑或
#define LCM_MOD_XOR 0x81 // 显示方式逻辑异或
#define LCM_MOD_AND 0x82 // 显示方式逻辑与
#define LCM_MOD_TCH 0x83 // 显示方式文本特征
#define LCM_DIS_SW 0x90 // 显示开关D0=1/0:光标闪烁启用/禁用
// D1=1/0:光标显示启用/禁用
// D2=1/0:文本显示启用/禁用
// D3=1/0:图形显示启用/禁用
#define LCM_CUR_SHP 0xA0 // 光标形状选择0xA0-0xA7表示光标占的行数
#define LCM_AUT_WR 0xB0 // 自动写设置
#define LCM_AUT_RD 0xB1 // 自动读设置
#define LCM_AUT_OVR 0xB2 // 自动读/写结束
#define LCM_INC_WR 0xC0 // 数据一次写地址加1
#define LCM_INC_RD 0xC1 // 数据一次读地址加1
#define LCM_DEC_WR 0xC2 // 数据一次写地址减1
#define LCM_DEC_RD 0xC3 // 数据一次读地址减1
#define LCM_NOC_WR 0xC4 // 数据一次写地址不变
#define LCM_NOC_RD 0xC5 // 数据一次读地址不变
#define LCM_SCN_RD 0xE0 // 屏读
#define LCM_SCN_CP 0xE8 // 屏拷贝
#define LCM_BIT_OP 0xF0 // 位操作
uint8 const turnf[8] = {7,6,5,4,3,2,1,0};
uint8 const DEC_HEX_TAB1[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
uint8 const DEC_HEX_TAB[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
/*********************************************************************************************************
** 函数名称: LCM_READSTATE
** 功能描述: 读取LCM内部的状态
** 输 入: 无
** 输 出: LCM内部状态值
** 全局变量:
** 调用模块:
**------------------------------------------------------------------------------------------------------
** Created by Rein Lee
** Created date: 2007-12-20
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 LCM_READSTATE()
{
uint8 dat;
IO0DIR = IO0DIR &~(0x000000ff<<BUS_NO);
LCM_UNWRITE();
LCM_COM();
LCM_READ();
LCM_ENABLE();
//DELAY5();
//DELAY5();
//DELAY5();
//InData();
dat = (uint8)((IO0PIN)>>BUS_NO);
//LCM_UNREAD();
//LCM_UNWRITE();
LCM_DISABLE();
return dat;
}
/*********************************************************************************************************
** 函数名称: LCM_STA01
** 功能描述: 状态位STA1,STA0判断读写指令和读写数据,在读写数据或者写入命令前必须保证均为1
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: LCM_READSTATE
**------------------------------------------------------------------------------------------------------
** Created by Rein Lee
** Created date: 2007-12-20
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 LCM_STA01(void)
{
uint8 i;
for(i=10;i>0;i--)
{
if(( LCM_READSTATE() & 0x03) == 0x03) // 读取状态
{
break;
}
}
return(i); // 若返回零说明错误
}
/*********************************************************************************************************
** 函数名称: LCM_STA3
** 功能描述: 状态位STA3
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: LCM_READSTATE
**------------------------------------------------------------------------------------------------------
** Created by Rein Lee
** Created date: 2007-12-20
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 LCM_STA3(void)
{
uint8 i;
for(i=10;i>0;i--)
{
if(( LCM_READSTATE() & 0x08) == 0x08) // 读取状态
{
break;
}
}
return(i); // 若返回零说明错误
}
/*********************************************************************************************************
** 函数名称: LCM_WrCommand
** 功能描述: 写命令子程序
** 输 入: command 要写入LCM的命令字
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**------------------------------------------------------------------------------------------------------
** Created by Rein Lee
** Created date: 2007-12-20
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void LCM_WrCommand(uint8 command)
{
LCM_UNREAD();
LCM_COM();
LCM_WRITE();
LCM_ENABLE();
OutData(command);
//LCM_UNWRITE();
//LCM_READ();
LCM_DISABLE();
}
/*********************************************************************************************************
** 函数名称: LCM_WrData
** 功能描述: 写数据子程序
** 输 入: wrdata 要写入LCM的数据
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**------------------------------------------------------------------------------------------------------
** Created by Rein Lee
** Created date: 2007-12-20
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void LCM_WrData(uint8 wrdata)
{
LCM_UNREAD();
LCM_DATA();
LCM_WRITE();
LCM_ENABLE();
OutData(wrdata);
//LCM_UNWRITE();
//LCM_READ();
LCM_DISABLE();
}
/*********************************************************************************************************
** 函数名称: LCM_WrParameter
** 功能描述: 向LCM写入参数,带双参数,一个参数,或者不带参数
** 输 入: cmd参数;para1参数1;para2参数2;num参数个数
** 输 出: 返回操作结果
** 全局变量: 无
** 调用模块: 无
**------------------------------------------------------------------------------------------------------
** Created by Rein Lee
** Created date: 2007-12-20
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 LCM_WrParameter(uint8 cmd,uint8 para1,uint8 para2,uint8 num)
{
switch (num)
{
case 0x00:
/*
if(LCM_STA01() == 0)
{
return 1;
}
*/
LCM_WrCommand(cmd);
break;
case 0x01:
/*
if(LCM_STA01() == 0)
{
return 1;
}
LCM_WrData(para1);
if(LCM_STA01() == 0)
{
return 2;
}
LCM_WrCommand(cmd);
*/
LCM_WrData(para1);
LCM_WrCommand(cmd);
break;
case 0x02:
/*
if(LCM_STA01() == 0)
{
return 1;
}
LCM_WrData(para1);
if(LCM_STA01() == 0)
{
return 2;
}
LCM_WrData(para2);
if(LCM_STA01() == 0)
{
return 3;
}
LCM_WrCommand(cmd);
*/
LCM_WrData(para1);
LCM_WrData(para2);
LCM_WrCommand(cmd);
break;
}
return 0;
}
/*********************************************************************************************************
** 函数名称: LCM_ReadByte
** 功能描述: 读取指定点上的字节数据
** 输 入: x,y坐标值
** 输 出: 返回该点上的字节数据
** 全局变量: 无
** 调用模块: 无
**------------------------------------------------------------------------------------------------------
** Created by Rein Lee
** Created date: 2007-12-20
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -