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

📄 ocm12864.h

📁 此源码为KEIL uVision3 for ARM 的ocm12864系列字符液晶显示模块。
💻 H
字号:

#include "ASCII816.h" //标准ASCII库

#define LCD_CS1 (1<<10)
#define LCD_CS2 (1<<11)
#define LCD_RW (1<<13)
#define LCD_RS (1<<12)
#define LCD_EN (1<<14)
#define LCD_RST (1<<8)
#define LCD_BUSY (1<<23)

//#define __IN_REAL_TARGET


//延时
void LCDmsDelay(uint8 ms)
{
	uint16 i,j;
	for(j=0;j<ms;j++)
	{
		for(i=0;i<6000;i++);
	}
}
void LCDusDelay(uint8 us)
{
	uint8	i,j;
	for(j=0;j<us;j++)
	{
		for(i=0;i<5;i++);
	}
}
/*----------------------------------------------------------------------------------------------------*/
//状态检查

uint8 rd_state()	//读状态
	{
	uint8 temp;	   
	IO1DIR&=0xFF00FFFF;
	IO0CLR=LCD_RS;
	IO0SET=LCD_RW;	
	IO0SET=LCD_RW;
	IO0SET=LCD_EN;
	temp=IO1PIN>>16;   	
	IO0CLR=LCD_EN;
	return(temp);
	}


void CheckState()	//等待可读写
	{
	uint8 temp;
	temp=rd_state();

#ifdef __IN_REAL_TARGET
	while((temp&0x90)==0x90)	//判断状态位STA1,STA0(读写指令和读写数据状态),
								//在写指令的读、写数据之前,这两个标志位必须同时为1
#else
	while((temp&0x90)!=0x90)	//判断状态位STA1,STA0(读写指令和读写数据状态),
								//在写指令的读、写数据之前,这两个标志位必须同时为0	
#endif

	temp=rd_state();
	}
/*----------------------------------------------------------------------------------------------------*/
//写显示数据
//dat:显示数据
void WriteByte(uint8 dat)
{
	CheckState(); 
	IO1DIR|=0xFF0000;
	IO1CLR=0xff0000;
	IO0SET=LCD_RS;
	IO0CLR=LCD_RW;
	IO1SET=dat<<16;
	IO0SET=LCD_EN;
	LCDusDelay(5);
	IO0CLR=LCD_EN;
}
/*----------------------------------------------------------------------------------------------------*/
//读显示数据
uint8 ReadByte()
{
	uint8 dat;		 
	CheckState();
	IO0SET=LCD_RS|LCD_RW;
	IO1DIR&=0xFF00FFFF;	
	IO1SET=0xFF<<16;
	IO0SET=LCD_RS;
	IO0SET=LCD_RW;
	IO0SET=LCD_EN;
	dat=IO1PIN>>16;
	IO0CLR=LCD_EN;
	return(dat);
}
/*-----------------------------------------------------------------------------------------------------*/
//向LCD发送命令
//command :命令
void SendCommandToLCD(uint8 command)
{				   
	CheckState();
	IO0CLR=LCD_RW;
	IO0CLR=LCD_RS;
	IO1DIR|=0xFF0000;
	IO1CLR=0xff0000;
	IO1SET=command<<16;
	IO0SET=LCD_EN;
	LCDusDelay(5);
	IO0CLR=LCD_EN;
}
/*---------------------------------------------------------------------------------------------------*/
//选择屏幕
//screen: 0-全屏,1-左屏,2-右屏
void SelectScreen(uint8 screen)
{
	switch(screen)
	{
#ifdef __IN_REAL_TARGET	 
		case 0:
			IO0SET=LCD_CS1;
			IO0SET=LCD_CS2;
			break;
		case 1:
			IO0SET=LCD_CS2;
			IO0CLR=LCD_CS1;
			break;
		case 2:
			IO0CLR=LCD_CS2;
			IO0SET=LCD_CS1;
			break;
#else
		case 0:
			IO0SET=LCD_CS1;
			IO0SET=LCD_CS2;
			break;
		case 1:
			IO0SET=LCD_CS1;
			IO0CLR=LCD_CS2;
			break;
		case 2:
			IO0CLR=LCD_CS1;
			IO0SET=LCD_CS2;
			break;
#endif
	}
}


/*----------------------------------------------------------------------------------------------------*/
//设定行地址(页)--X 0-7
void SetLine(uint8 line)
{
	line=line & 0x07; // 0<=line<=7
	line=line | 0xb8; //1011 1xxx
	SendCommandToLCD(line);
}
//设定列地址--Y 0-63
void SetColumn(uint8 column)
{
	column=column & 0x3f; // 0=<column<=63
	column=column | 0x40; //01xx xxxx
	SendCommandToLCD(column);
}
//设定显示开始行--XX
void SetStartLine(uint8 startline) //0--63
{
	startline=startline & 0x07;
	startline=startline | 0xc0; //1100 0000
	SendCommandToLCD(startline);
}
//开关显示
void SetOnOff(uint8 onoff)
{
	onoff=0x3e | onoff; //0011 111x
	SendCommandToLCD(onoff);
}

/*---------------------------------------------------------------------------------------------------*/
//清屏
//screen: 0-全屏,1-左屏,2-右
void ClearScreen(unsigned char screen)
{
	uint8 i,j;
	SelectScreen(screen);
	for(i=0;i<8;i++)
	{
		SetLine(i);
		SetColumn(0);
		for(j=0;j<64;j++)
		{
			WriteByte(0x00);
		}
	}
}

/*--------------------------------------------------------------------------------------------------*/
//显示8*8点阵
//旋转90度:字模被竖着切分
//lin:行(0-7), column: 列(0-15)
//address : 字模区首地址

void Show88(uint8 lin,uint8 column,const uint8 *address)
{
	uint8 i;
	if(column>16) {return;}
	if(column<8) SelectScreen(1); 	//如果列数<8(0,1,2,3,4,5,6,7)则写在第一屏上
	else
	{
		SelectScreen(2); 			//否则 (8,9,10,11,12,13,14,15)写在第二屏上
		column=column & 0x07; 		//防止越界
	}
	SetLine(lin);
	SetColumn(column<<3);
	for(i=0;i<8;i++) WriteByte(*(address+i));
}

/*------------------------------------------------------------------------------------------------*/
//显示8*16字符
//旋转90度:字模被竖着切分
//lin:行(0-3), column: 列(0-15)
//character:字符代码(标准ASCII码)

void ShowChar(uint8 lin,uint8 column,uint8 character)
{
	lin=lin<<1;
	Show88(lin,column,ASCII816[character-0x20]);
	Show88(lin+1,column,ASCII816[character-0x20]+8);
}

/*-----------------------------------------------------------------------------------------------*/

//显示8*16字符串
//!!!只能显示在一行上即: 串长+column <=15
//旋转90度:字模被竖着切分
//lin:行(0-3), column: 列(0-15)
//address : 字模区首地址
void ShowString(uint8 lin,uint8 column, uint8 *string)
{
	uint8 ch;
	uint8 i=0;

	while(*string!='\0')
	{
		ch=*string;
		if(i+column >15) break; //(只能显示在一行上即: 串长+column <=15)
		ShowChar(lin,i+column,ch);
		string++; i++;
	}
}
/*----------------------------------------------------------------------------------------------*/
//显示一个汉字
//旋转90度:字模被竖着切分
//lin:行(0-3), column: 列(0-7)
//hzcode: 汉字代码(自定义的)
//uchar code HZtable

void ShowHZ(uint8 lin,uint8 column,uint16 hzcode)
{
	lin=lin<<1; //lin*2
/*
	Show88(lin,column,HZTable[hzcode]);
	Show88(lin,column+1,HZTable[hzcode]+8);
	Show88(lin+1,column,HZTable[hzcode]+16);
	Show88(lin+1,column+1,HZTable[hzcode]+24);
*/
}

/*----------------------------------------------------------------------------------------------*/
//显示一行字符串(汉字,字母混排,一行16字节)
//lin:行
//lineheadaddr: 此行汉字代码区首地址
void ShowLine(uint8 lin,uint8 linehead[])
{
	uint8 i;
	uint8 byte;
	uint16 hzcode;
	for( i=0; i<16; )
	{
		byte=linehead[i];
		if(byte < 0x80) //字母
		{
			if(i>15) return; //!!编译器有问题,须强制退出
			i=i+1;
	
		}
		else // byte >= 0x80(汉字)
		{
			if(i>15) return; //!!编译器有问题,须强制退出

			byte=byte & 0x7f; //最高位置0,即:减去0x8000
			hzcode=(unsigned int)byte<<8; //?? //高8位
			hzcode=hzcode+linehead[i+1]; //加低8位,组合成整型数地址
			ShowHZ( lin,i,hzcode);
			i=i+2;
		}
	}
}
/*----------------------------------------------------------------------------------------------------*/
//显示一屏汉字
//pageheadaddr:此屏汉字代码地址区首地址
void ShowPage(uint8 pagehead[][16])
{
	uint8 i;
	for(i=0;i<4;i++) ShowLine(i,pagehead[i]); //1行8个汉字,16字节
}


/*----------------------------------------------------------------------------------------------------*/
//反显一个8*8字块
//lin:行(0-3), column: 列(0-7)
void ReverseShow88(uint8 lin,uint8 column)
{
	uint8 i;
	uint8 tab[8];

	if(column<8) SelectScreen(1); //如果列数<4(0,1,2,3),则写在第一屏上
	else SelectScreen(2); //否则 (4,5,6,7), 写在第二屏上
//读上部8列
	column=column<<3; //每个方块8*8大小
	SetLine(lin);
	SetColumn(column);
	tab[0]=ReadByte(); //空读!!!!! //?
	for(i=0;i<8;i++) tab[i]=~ReadByte();
//写回
	SetLine(lin);
	SetColumn(column);
	for(i=0;i<8;i++) WriteByte(tab[i]);
}
/*----------------------------------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------------------------------*/
//反显一个字符
//lin:行(0-4), column: 列(0-15)
void ReverseShowChar(uint8 lin,uint8 column)
{
	lin=lin<<1;
	ReverseShow88(lin ,column);
	ReverseShow88(lin+1,column);
}
/*----------------------------------------------------------------------------------------------------*/
//反显一个汉字
//lin:行(0-3), column: 列(0-7)
void ReverseShowHZ(uint8 lin,uint8 column)
{
	lin=lin<<1;
	column=column<<1;
	ReverseShow88(lin ,column );
	ReverseShow88(lin ,column+1);
	ReverseShow88(lin+1,column );
	ReverseShow88(lin+1,column+1);
}
/*----------------------------------------------------------------------------------------------------*/
//反显一行汉字
//lin:行
void ReverseShow(uint8 lin)
{
	uint8 i;
	for(i=0;i<8;i++) ReverseShowHZ(lin,i);
}
/*----------------------------------------------------------------------------------------------------*/
void InitialiseLCD() //初始化LCD
{
    PINSEL0 = PINSEL0 & 0x00000000;	//P0.0:15为GPIO pins
	PINSEL2 &= 0xFFFFFFF7;			//PINSEL2.3=0,P1.25:16 为GPIO pins. PINSEL2.3=1, P1.25:16 用作Trace port.
	IO0DIR=LCD_RW|LCD_RS|LCD_CS1|LCD_CS2|LCD_EN|LCD_RST;

	IO0CLR=LCD_RST;
	LCDmsDelay(20);
	IO0SET=LCD_RST;
	LCDmsDelay(20);

//	SendCommandToLCD(0xC0);
	SelectScreen(0);
	SetOnOff(0); //关显示

	ClearScreen(1);//清屏
	ClearScreen(2);

	SelectScreen(0);
	SetOnOff(1); //开显示
}
/*----------------------------------------------------------------------------------------------------*/

⌨️ 快捷键说明

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