📄 ocm240128.c
字号:
/**********************************************************************************************
** 文件名称: OCM240128.H
** 最后修改: 2009-10-26
** 版 本: 1.0
** 描 素: OCM240128液晶驱动程序
**---------------------------------------------------------------------------------------------
** 作 者: 李雪川
** 创作日期: 2009-10-6-26
** 文件描述: OCM240128液晶驱动程序,采用8位数据总线方式驱动
内部字符库使用方式:字符地址 = ASCII - 0x20
------------------------硬件端口连接定义-------------------------------------------------------
** OXM240128 MCU
** FS GND 字形选择0: 8*8 1: 6*8
** C_D P2.6 =1选择指令, =0选择数据
** _CE P2.7 片选=0有效
** _RW P3.6(_RW) 总线控制读写
** _RD P3.7(_RD)
** PDAT P0 8位总线数据端口
----------------------------------------------------------------------------------------------
** 全局变量:
** 主要函数:
******************OCM240128内部有CGRAM 2K(256字节)空间*************************************
使用内部字符发生器CGROM时低128字节为内部字符,CGROM的高128字节可自己定义
禁止内部字符发生器CGROM时CGRAM256字节都用于用户字符定义
通过void OCM_mode(uchar mod,uchar cg) cg参数控制
*******************************************************************************************
void OCM_ac(uchar target, uint dat) 地址设置
void OCM_area(uchar target, uint int) 显示区域设置
OCM_onewr(mod, dat) 单次写
void OCM_autrd(uint, uchar num, uchar *p) 连续自动读
void OCM_autwr(uadd, uchar num, uchar *p) 连续自动写)
void OCM_picture(uint addr, uchar w, uchar h, uchar *tab) 图形显示
void OCM_picture_clr(uint addr, uchar w, uchar h) 图形清除
void OCM_line_clr(uint addr,uchar dat) 清除一行
void OCM_clr(uchar dat) 清屏
void OCM_init(void) 初始化
**----------------------------------------------------------------------------------------------
** 硬件平台: 51系列单片机,总线方式驱动
** 软件平台: Keil3.0
*************************************************************************************************/
#include "OCM240128.H"
/****************************************************************************************
** 函数名称: uchar OCM_rdint(void)
** 功能描述: 读OCM液晶状态字
** 输入参数; 无
** 输出参数: uchar OCM液晶当前状态字
** 全局变量: 无
** 调用模块: OCM240128.C文件内部调用
****************************************************************************************/
uchar OCM_rdint(void)
{
uchar init;
init = C_Addr; //定义外部数据,总线方式读取指令
return (init);
}
/******************************************************************************************
** 函数名称: uchar OCM_busy(uchar mode)
** 功能描述: 读忙判断,单次读写,自动读,自动写,屏读/考呗出错
对应位为1准备好,0状态忙
** 输入参数: uchar mode: 0 单次读写遇忙判断
1 自动读遇忙判断
2 自动写遇忙判断
3 屏读/考呗出错判断
其他 默认为0,单次读写遇忙判断
** 输出参数: uchar 1当前查询状态准备好,0当前查询状态忙
** 全局变量: 无
** 调用模块: 0CM240128.C文件内部调用
******************************************************************************************/
uchar OCM_busy(uchar mode)
{
uchar state = 0,busy = 0;
state = OCM_rdint(); //读取当前状态字
switch (mode)
{
case 0: busy = ((state & 0X03) == 0X03)? 1 : 0; break; //单次读写遇忙判断
case 1: busy = state & (0X01 << 2); break; //自动读遇忙判断
case 2: busy = state & (0X01 << 3); break; //自动写遇忙判断
case 3: busy = state & (0X01 << 6); break; //屏读/考呗出错判断
default:busy = ((state & 0X01) & (state & 0X02)); //默认为判断单次读写遇忙
}
return (busy);
}
/******************************************************************************************
** 函数名称: void 0CM_ac(uchar target, uint dat)
** 功能描述: AC地址设置:光标地址,CGRAM地址,显示地址设置
双参数指令
** 输入参数: target: 0: 光标地址设置
1: CGRAM地址设置默认设置的地址为0X80开始
2: 显示地址设置(显示存储器的地址为, 该地址指针计
数器为 16 位字长)显示地址超出范围无效
其他:默认为0:光标地址设置
tartet:0 1 2
dat低位: 水平位置(字节单位) 偏置地址值 低 8 位地址(字节单位)
dat高位: 垂直位置 0X80 高 8 位地址
** 输出参数: 无
** 全局变量: 无
** 调用模块: 0CM240128.C文件内部调用
******************************************************************************************/
void OCM_ac(uchar target, uint dat)
{
uchar dat1 ,dat2;
dat1 = (uchar)(dat & 0xFF);
dat2 = (uchar)(dat >> 8);
while (!OCM_busy(0)); //单次读写遇忙判断
switch (target)
{
case 0:
D_Addr = (dat1 & 0X7F); //水平位置,数据的第7位有效,地址范围(0~0X4F),该指令判断不准确
while (!OCM_busy(0)); //单次读写遇忙判断
D_Addr = (dat2 & 0X1F); //垂直位置,第5位有效
while (!OCM_busy(0)); //单次读写遇忙判断
C_Addr = 0X21; //光标地址设置
break;
case 1:
D_Addr = (dat1 & 0X1F); // 偏置地址值(高 5 位),数据第5位有效
while (!OCM_busy(0)); //单次读写遇忙判断
D_Addr = 0X80; //数据2格式为0
while (!OCM_busy(0)); //单次读写遇忙判断
C_Addr = 0X22; //CGRAM地址设置
break;
case 2:
D_Addr = dat1; //dat1为低 8 位地址
while (!OCM_busy(0)); //单次读写遇忙判断
D_Addr = dat2; //dat2为高 8 位地址
while (!OCM_busy(0)); //单次读写遇忙判断
C_Addr = 0X24; //显示地址设置
break;
default:
D_Addr = (dat1 & 0X7F);
while (!OCM_busy(0));
D_Addr = (dat2 & 0X1F);
while (!OCM_busy(0));
C_Addr = 0X21; //默认为光标地址设置
break;
}
}
/******************************************************************************************
** 函数名称: void OCM_area(uchar target, uint dat)
** 功能描述: 显示区域设置:文本显示区 图形显示区
双参数指令
** 输入参数: target: 0: 文本显示区首地址设置
1: 文本显示区宽度设置
2: 图形显示区首地址设置
3: 图形显示区宽度设置
其他:默认为无效
tartet: 0 1 2 3
datL: 低字节 字节数 低字节 字节数
datH: 高字节 00 高字节 00
** 输出参数: 无
** 全局变量: 无
** 调用模块: 0CM240128.C文件内部调用
******************************************************************************************/
void OCM_area(uchar target, uint dat)
{
uchar dat1 ,dat2;
dat1 = (uchar)(dat & 0xFF);
dat2 = (uchar)(dat >> 8);
while (!OCM_busy(0)); //单次读写遇忙判断
switch (target)
{
case 0:
D_Addr = dat1; //文本显示区首地址低字节
while (!OCM_busy(0)); //单次读写遇忙判断
D_Addr = dat2; //文本显示区首地址高字节
while (!OCM_busy(0)); //单次读写遇忙判断
C_Addr = 0X40; //文本显示区首地址设置
break;
case 1:
D_Addr = dat1; //文本显示区宽度字节数
while (!OCM_busy(0)); //单次读写遇忙判断
D_Addr = 0; //数据2格式为0
while (!OCM_busy(0)); //单次读写遇忙判断
C_Addr = 0X41; //文本显示区宽度设置
break;
case 2:
D_Addr = dat1; //图形显示区首地址低字节
while (!OCM_busy(0)); //单次读写遇忙判断
D_Addr = dat2; //图形显示区首地址高字节
while (!OCM_busy(0)); //单次读写遇忙判断
C_Addr = 0X42; //图形显示区首地址设置
break;
case 3:
D_Addr = dat1; //图形显示区宽度字节数
while (!OCM_busy(0)); //单次读写遇忙判断
D_Addr = 0; //数据2格式为0
while (!OCM_busy(0)); //单次读写遇忙判断
C_Addr = 0X43; //图形显示区宽度设置
break;
default: //命令无效
break;
}
}
/******************************************************************************************
** 函数名称: void OCM_mode(uchar mod,uchar cg)
** 功能描述: 显示方式设置:或 异或 与 文本显示特性以双字节表示
CG 位 字符发生器选择位
** 输入参数: mode: 0: 文本与图形以逻辑“或”的关系合成显示
1: 文本与图形“异或”
2: 文本与图形“与”
3: 文本显示特性以双字节表示
在设置了文本属性显示方式后,图形显示区将转换成为文本属性区,用来控制文本属性
其他:默认为无效
cg: 非0:启用内部字符发生器CGROM
0:禁止内部 CGROM
******************OCM240128内部有CGRAM 2K(256字节)空间*************************************
使用内部字符发生器CGROM时低128字节为内部字符,CGROM的高128字节可自己定义
禁止内部字符发生器CGROM时CGRAM256字节都用于用户字符定义
通过void OCM_mode(uchar mod,uchar cg) cg参数控制
*******************************************************************************************
** 输出参数: 无
** 全局变量: 无
** 调用模块: 0CM240128.C文件内部调用
******************************************************************************************/
void OCM_mode(uchar mod,uchar cg)
{
uchar cgrom_stat;
if (cg) //cg !=0 启用内部字符发生器CGROM
{
cgrom_stat = (0x00 << 3); //第4位位0启用
}
else //cg = 0 禁止内部 CGROM
{
cgrom_stat = (0x01 << 3); //CG位为1禁止内部 CGROM
}
while (!OCM_busy(0)); //单次读写遇忙判断
switch (mod)
{
case 0: C_Addr = 0X80 | cgrom_stat; break; //“或”
case 1: C_Addr = 0X81 | cgrom_stat; break; //“异或”
case 2: C_Addr = 0X83 | cgrom_stat; break; //“与”
case 3: C_Addr = 0X84 | cgrom_stat; break; //文本显示特性以双字节表示
default: break;
}
}
/******************************************************************************************
** 函数名称: void OCM_state(uchar mod)
** 功能描述: 显示状态设置,相应位为1,启用相应功能,为0关闭相应功能
N1 N2 N3 N4
光标闪烁设 光标显示设置 文本显示设置 图形显示设置
** 输入参数: mod: 参数格式 (1 << 0 | 1 << 1 | 1 << 2 | 1 << 3)所以功能打开
** 输出参数: 无
** 全局变量: 无
** 调用模块: 0CM240128.C文件内部调用
******************************************************************************************/
void OCM_state(uchar mod)
{
uchar tmp = mod;
while (!OCM_busy(0)); //单次读写遇忙判断
tmp &= 0X0F; //低4位有效
C_Addr = 0X90 | tmp; //写命令字
}
/******************************************************************************************
** 函数名称: void OCM_cursor(uchar mod)
** 功能描述: 光标形状设置(Cursor pattern select)
mod (0~7) mod越大,光标也越大
** 输入参数: mod:
** 输出参数: 无
** 全局变量: 无
** 调用模块: 无
******************************************************************************************/
void OCM_cursor(uchar mod)
{
uchar tmp = mod;
tmp &= 0x07; //低3位有效
while (!OCM_busy(0)); //单次读写遇忙判断
C_Addr = 0XA0 | tmp; //写命令字
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -