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

📄 ocm240128.c

📁 OCM240128-7.rar
💻 C
📖 第 1 页 / 共 2 页
字号:
/**********************************************************************************************
**  文件名称:       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 + -