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

📄 ocm12864.c

📁 LCD显示 在液晶屏上显示文字 51单片机应用
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
下面是对OCM12864进行操作的函数接口
*/
#include "reg51.h"
#include "ldy.h"
#include "ZiMo.h"	
#include "ExternDefine.h"

#define uchar unsigned char		//声明uchar为无符号字符型
#define uint unsigned int		//声明uint为无符号整型

#define REFRESH 20
uchar ucFn = 0;
bit bChinese = 1;
bit bErrorFlag = 0;	//是否已显示提示错误

//bit bPause = 0;	//暂停指示灯标志位
extern unsigned char idata Buffer[RDCOUNT][BUFFLEN];
extern unsigned char buffin,ucRCount,ucDCount;
extern bit bReceError1,bReceError2;	//add by zhx,05.12.29,出现校验和错误
extern bit bAllUp,bLast;
extern unsigned char KeyValue[2];

/****************************/
/********/
/*函数原型:void delay(uint v)
/*参数:v
/*功能:延时
/*说明:delay(1)相当于延时10微秒(us)
/********/
/****************************************/
void delay(uint v) //声明函数名为delay的函数,并定义无符号整形变量v
	{

	WDTRST = 0x1E;	//启动看门狗
	WDTRST = 0xE1;	

	while(v!=0)v--;//当v不等于0时,v自减,目的为指令延时
	WDTRST = 0x1E;	//启动看门狗
	WDTRST = 0xE1;	
    }

/****************************/
/********/
/*函数原型:void reset()
/*参数:
/*功能:复位
/*说明:当RST送低电平复位,高电平正常工作
/********/
/****************************************/

void reset()		//声明函数名为reset的函数
	{
	P32=0;         //LCD的RST置低电平
	delay(20);     //延时约200微秒
	P32=1;         //LCD的RST置高电平
	delay(20);     //延时约200微秒
	}

/*******************************/
/********/
/*函数原型:void wcode(uchar c,uchar cs1,uchar cs2)
/*参数:c,cs1,cs2
/*功能:写代码
/*说明:D/I和R/W都为0时为写代码,根据p1不同的数据发送不同的指令cs1、cs2分别为左右选屏
/*********/
/****************************************/
void wcode(uchar c,uchar cs1,uchar cs2)       //声明函数名为wcode()的函数,并定义无符号整形变量c,cs1,cs2
	{
	P34=cs1;       //cs1=1打通LCD左半屏片选
	P33=cs2;       //cs2=1选通LCD右半屏片选
	P37=0;         //D/I赋0为写代码(命令)
	P36=0;		   //R/W赋0为写操作
	P1=c;  		   //c数据送p1
	P35=0;         //使能位置0
	delay(10);	   //延时约100微秒
	P35=1;         //使能位置1
	delay(10);     //延时约100微秒
	P35=0;         //使能位由1变0,数据有效传送
	}
	
/*************************************/
/********/
/*函数原型:void wdata(uchar c,uchar cs1,uchar cs2)
/*参数:c,cs1,cs2
/*功能:写显示数据
/*说明:D/I为1、R/W为0时,c为要发送到RAM中的显示数据,cs1、cs2分别为选择左右半屏,置1为选中,置0为不选。
/********/
/*************************************/
void wdata(uchar c,uchar cs1,uchar cs2)	//定义名为wdata的函数,并将形参c,cs1,cs2定义为无符号字符型变量
	{
 	P34=cs1;	//是否选中左半屏
 	P33=cs2;	//是否选中右半屏
 	P37=1;		//LCM的D/I置1,选择显示资料寄存器
 	P36=0;		//LCM的R/W置0,选择写操作
 	P1=c;		//将要写入LCM的显示资料送P1
 	P35=0;		//使能位置0
 	delay(10);	//延时约100微秒
 	P35=1;		//使能位置1
 	delay(10);	//延时约100微秒
 	P35=0;		//使能位由1到0向下跳变,显示数据有效传送
	}
	
/********************************************/
/********/
/*函数原型:void set_startline(uchar i)	
/*参数:i
/*功能:设置显示开始行
/*说明:设置显示开始行为第i行,i为小于64的正整数
/********/
/*******************************************/
void set_startline(uchar i)	//定义名为set_startline的函数,并将形参i定义为无符号字符型变量
	{
	i=0xc0+i;		//设定显示起始行的指令代码
 	wcode(i,1,1);		//将显示起始行指令写入LCM的左右半屏
	}
	
/******************************************/
/********/
/*函数原型:void set_adr(uchar x,uchar y)	
/*参数:x,y
/*功能:设置读/写显示数据的具体位置
/*说明:设置读/写显示数据的具体位置为第X页的第Y列
/********/
/*******************************************/
void set_adr(uchar x,uchar y)	//定义名为set_ adr的函数,并将形参x、y定义为无符号字符型变量
	{
 	x=x+0xb8;y=y+0x40;	//设置第X页和第Y列的指令代码
 	wcode(x,1,1);		//将页地址写入LCM的左右半屏
 	wcode(y,1,1);		//将列地址写入LCM的左右半屏
	}
	
/*****************************/
/*函数原型:dison_off(uchar o)
/*参数:o
/*功能:显示开关
/*说明:当o为0时为关显示,当o为1时为开显示
/*****************************/
void dison_off(uchar o)		//定义名为dison_off的函数,并将形参o定义为无符号字符型变量
	{
	o=o+0x3e;		//设定显示开关的指令代码
	wcode(o,1,1);		//将显示开关指令写入LCM的左右半屏	
	}
	
/****************************/
/********/
/*函数原型:void clear()
/*功能:清屏
/*说明:以整个显示RAM填0的方式清屏
/*************/
/****************************************/
void clear()			            //声明清屏函数void clear()
{
	uchar i,loop;		            //定义无符号整形变量i,loop
	
	for(i=0;i<8;i++)				//整屏共8页,循环8次
		{
		WDTRST = 0x1E;	//启动看门狗
		WDTRST = 0xE1;	
		set_adr(i,0);				//设置页地址
		for(loop=0;loop<64;loop++)	//一页有64个Y地址,循环64次
			wdata(0,1,1);			//写0至左右半屏	
		}
}

/****************************/
/********/
/*函数原型:void Lcd_Init()
/*功能:液晶屏初始化
/*说明:指令代码控制屏幕的开启
/*************/
/****************************************/
void Lcd_Init()		//液晶初始化
{
	reset();        //复位子程序
	clear();    	//清屏
	dison_off(1);   //开屏
}

/*****************************/
/*函数原型:Show12864_Row(unsigned char cs1,unsigned char cs2,unsigned char x,unsigned char y,unsigned char ucSelect,unsigned char * pScr_Row)
/*参数:cs1,cs2,X,Y,ucSelect,*pScr_Row
/*功能:液晶显示的具体位置和显示时的正反选状态以及显示的内容
/*说明:cs1为1时打开左屏,为cs2为1时打开右屏;x为显示的行值,可以为0,1,2,3; y为显示的列值(0~127);ucSelect为0时为正选,为1时为反显;*pScr_Row指向要显示的内容
/*****************************/
void Show12864_Row(unsigned char cs1,unsigned char cs2,unsigned char x,unsigned char y,unsigned char ucSelect,unsigned char * pScr_Row)	//区信息显示函数,x为显示页,pScr_Row为显示信息内容
{
	unsigned char ch = '\0',cs1 = 0, cs2 = 0, col_up = y,col_down = y;
	unsigned char i,j;

	while(*pScr_Row)
	{
		WDTRST = 0x1E;	//启动看门狗
		WDTRST = 0xE1;	

		if(*pScr_Row > 0xA0)	//为中文信息
		{
			ch = *pScr_Row++;
			for(i = 0;i < 114;i ++)	//共114个汉字可供检索
			{
				WDTRST = 0x1E;	//启动看门狗
				WDTRST = 0xE1;	

				if(ch == GB_32[i].Index[0]&&*pScr_Row == GB_32[i].Index[1])	//找到信息
				{
					set_adr(x*2,y%64);	//在x,y处开始显示,上半部分信息

					for(j = 0;j < 16;j ++)
					{
						if(col_up > 63&&col_up < 128)
						{
							if(cs2 == 0)
							set_adr(x*2,0);
							 cs2 = 1;
						}
						else if(col_up > 127)
							break;
						else
							
								cs1=1;

						if(ucSelect == 1)	//反显
							wdata(~GB_32[i].Msk[j],cs1,cs2);
						else				//不反显
							wdata(GB_32[i].Msk[j],cs1,cs2);
						col_up ++;
					}

					WDTRST = 0x1E;	//启动看门狗
					WDTRST = 0xE1;	

					set_adr(x*2+1,y%64);	//在x,y处开始显示,下半部分信息

					for(j = 0;j < 16;j++)
					{
						if(col_down > 63&&col_down < 128)
						{
							if(cs2 == 0)
								set_adr(x*2+1,0);
							cs2=1;
						}
						else if(col_down > 127)
							return;
						else
						{	c = 0;
							cs1=1;
						}

						if(ucSelect == 1)	//反显
							wdata(~GB_32[i].Msk[j + 16],cs1,cs2);
						else				//不反显
							wdata(GB_32[i].Msk[j + 16],cs1,cs2);
						col_down ++;
					}

					y += 16;	//16×16的汉字
					break;	
				}
				
			}
			pScr_Row++;
		}
		else				//为西文信息
		{
			for(i = 0;i < 75;i++)	//共75个西文可供检索	
			{
				WDTRST = 0x1E;	//启动看门狗
				WDTRST = 0xE1;	

				if(*pScr_Row == GB_16[i].Index)
				{
					set_adr(x*2,y%64);	//在x,y处开始显示,上半部分信息

					for(j = 0;j < 8;j ++)
					{
						if(col_up > 63)
						{
							if(cs2 == 0)
								set_adr(x*2,0);
							cs2=1;
						}
						else
							cs1=1;
					
						if(ucSelect == 1)	//反显
							wdata(~GB_16[i].Msk[j],cs1,cs2);
						else				//不反显
							wdata(GB_16[i].Msk[j],cs1,cs2);
						col_up ++;
					}

					WDTRST = 0x1E;	//启动看门狗
					WDTRST = 0xE1;	

					set_adr(x*2+1,y%64);	//在x,y处开始显示,下半部分信息

					for(j = 0;j < 8;j ++)
					{
						if(col_down > 63)
						{
							if(cs2 == 0)
								set_adr(x*2+1,0);					
							cs2=1;
						}
						else 
							cs1=1;
				
						if(ucSelect == 1)	//反显
							wdata(~GB_16[i].Msk[j + 8],cs1,cs2);
						else				//不反显
							wdata(GB_16[i].Msk[j + 8],cs1,cs2);
						col_down ++;
					}

					y += 8;	//16×8的西文
					break;
				}
				
			}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -