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

📄 lcd12864.c

📁 说明 //LCD12864.C //适用范围:128X64点阵黑白液晶屏
💻 C
字号:
//***************************************************************************//
//                              说明
//库名:LCD12864.C
//适用范围:128X64点阵黑白液晶屏,如:KS0108等
//注意事项:对液晶屏操作时,应先操作左屏完成后,再对右屏操作,
//		   如需要再回过来写左屏应先清全屏,否则会花屏!
//Design by Minstar@8.5 N.S.
//Test by Minstar
//***************************************************************************//

#include "LCD12864.h"
#include <stdio.h>
#include "absacc.h"
#include "intrins.h"
#include "hztable.h"
#include "ASCII816.H"
#include "bjtable.h"
#include "num5x8.h"
#include "Delay.h"
/*****************************函数实体****************************************/

/*****************************底层硬件操作************************************/

//延时
Lcd12864delay()
{
unsigned int i=500;
while(i--) {;}
}

//状态检查
void CheckState()
{
unsigned char dat;
Delay(5);
di=0;
Delay(5);
rw=1;
Delay(5);
do{
LCD12864DataPort=0xff;
Delay(5);
en=1;
Delay(5);
dat=LCD12864DataPort;
Delay(5);
en=0;
dat=0x90 & dat; 					//仅当第4,7位为0时才可操作
}while(!(dat==0x00));

//Delay(2000);
}

/*----------------------------------------------------------------------------------------------------*/
//写显示数据
//dat:显示数据
void WriteByte(unsigned char dat)
{
CheckState();
Delay(5);
di=1;
Delay(5);
rw=0;
Delay(5);
en=1;
Delay(5);
LCD12864DataPort=dat;
Delay(5);
en=0;
}

/*-----------------------------------------------------------------------------------------------------*/
//向LCD发送命令
//command :命令
SendCommandToLCD(unsigned char command)
{
CheckState();
Delay(5);
di=0;
Delay(5);
rw=0;
Delay(5);
en=1;
Delay(5);
LCD12864DataPort=command;
Delay(5);
en=0;
}

//设定行地址(页)--X 0-7
void SetLine(unsigned char line)
{
line=line & 0x07;						 // 0<=line<=7
line=line|0xb8; 						 //1011 1xxx
SendCommandToLCD(line);
}

//设定列地址--Y 0-63
void SetColumn(unsigned char column)
{
column=column &0x3f; 					// 0=<column<=63
column=column | 0x40; 					//01xx xxxx
SendCommandToLCD(column);
}

//设定显示开始行--XX
void SetStartLine(unsigned char startline) 				//0--63
{
startline=startline & 0x07;
startline=startline|0xc0; 								//1100 0000
SendCommandToLCD(startline);
}

//开关显示
void SetOnOff(unsigned char onoff)
{
onoff=0x3e | onoff;										 //0011 111x
SendCommandToLCD(onoff);
}

//选择屏幕
//screen: 0-全屏未选,1-左屏,2-右屏
void SelectScreen(unsigned char screen)
{ //北京显示器:负有效 cs1: 0--右; cs2: 0--左
switch(screen)
{ case 0: cs1=0;										//全屏未选
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
cs2=0; 
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
break; 
case 1: cs1=1;											//左屏
cs2=0;
break;
case 2: cs1=0;											//右屏
cs2=1;
break;
}
}
/**********************************液晶常用功能函数*******************************/

//清屏
//screen: 0-全屏未操作,1-左屏,2-右
void ClearScreen(unsigned char screen)
{ unsigned char i,j;
SelectScreen(screen);
for(i=0;i<8;i++)
{ SetLine(i);
for(j=0;j<64;j++)
{
WriteByte(0x00);
}
}
}
/******************************************************/
void InitLCD()    //初始化LCD
{
	Lcd12864delay();
	SetOnOff(0);
	SetOnOff(1);
	SetStartLine(0);
	SetLine(0);
	SetColumn(0);
	SelectScreen(1);
	ClearScreen(1);
	ClearScreen(2);
}
//显示一个汉字
//旋转90度:字模被竖着切分
//line:行(0-3), column: 列(0-3),screen:左(1)右(2)屏选择
//hzcode: 汉字代码(自定义的)
//uchar code HZtable(16x16)
void ShowHZ(unsigned char line,unsigned char column,unsigned char screen,unsigned int hzcode)
{
	unsigned char i;
	SelectScreen(screen);
	SetLine(line<<1);
	SetColumn(column<<4);
	for(i=0;i<16;i++)WriteByte(HZTable[hzcode][i]);
	SetLine((line<<1)+1);
	SetColumn(column<<4);
	for(i=0;i<16;i++)WriteByte(HZTable[hzcode][i+16]);
}

//显示8*16字符
//line:行(0-3), column: 列(0-7),screen:左(1)右(2)屏选择
//character:字符代码(自定义)
void ShowChar(unsigned char line,unsigned char column,unsigned char screen,unsigned char character)
{
	unsigned char i;
	SelectScreen(0);
	SelectScreen(screen);
	SetLine(line<<1);
	SetColumn(column<<3);
	for(i=0;i<8;i++)WriteByte(XWTable[character][i]);
	SetLine((line<<1)+1);
	SetColumn(column<<3);
	for(i=0;i<8;i++)WriteByte(XWTable[character][i+8]);
}


/******************************************************************/
//显示整屏背景图片
//unsigned char code BJTable(128X64)自定义取模!
void ShowBJTable()
{
	unsigned char i,j;
//	ShowNUM(4,10,1,0,0);						//标定零点
	for(i=0;i<8;i++)
	{
	SelectScreen(1);
	SetLine(i);
	SetColumn(0);
	for(j=0;j<64;j++)WriteByte(BJTable[i][j]);
	}
	for(i=0;i<8;i++)
	{
	SelectScreen(2);
	SetLine(i);
	SetColumn(0);
	for(j=0;j<64;j++)WriteByte(BJTable[i][j+64]);
	}
}

//显示5*8数字
//line:行(0-7), column: 列(0-11),screen:左(1)右(2)屏选择,addn:字符显示偏移量0-4
//character:字符代码(自定义)
void ShowNUM(unsigned char line,unsigned char column,unsigned char screen,unsigned char character,unsigned char addn)
{
	unsigned char i;
	SelectScreen(0);
	SelectScreen(screen);
	SetLine(line);
	SetColumn(column*5+addn);
	for(i=0;i<5;i++)WriteByte(NUMTable[character][i]);
	
}

//*********************以下为波形显示相关函数***********************************//

/*******************************************************************************/
//在指定的位置发送一个字节,操作对应的8个点显示
//line:行(0-7), column: 列(0-63),screen:左(1)右(2)屏选择,byte:待显示的操作字节
/*******************************************************************************/
void ShowByte(unsigned char line,unsigned char column,unsigned char screen,unsigned char byte)
{
	SetLine(line);
	SetColumn(column);
	SelectScreen(screen);
	WriteByte(byte);
}
//将数据值(0-8)转化为液晶屏上相应点值的表格
unsigned char  code  DataTab[]=
{
	0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,
};

/******************************************************************************/
//功能:显示左屏背景方格,长0-63点(每格10点),宽0-63点(每各10点)
/******************************************************************************/
void ShowBG_L()
{
	unsigned int i,x;
	for(x=0;x<64;x=x+10)                                	//在第一屏画横条
	{
		for(i=0;i<64;i=i+2) ShowByte(7-x/8,i,1,DataTab[x%8]);
	}
	for(x=0;x<64;x=x+10)									//画竖条
	{
		for(i=0;i<8;i++) ShowByte(i,x,1,0xaa);
	}
}

/******************************************************************************/
//功能:显示右屏背景方格,长0-35点(每格10点,起始点为6),宽0-63点(每各10点)
/******************************************************************************/

void ShowBG_R()
{
	unsigned int i,x;
	for(x=0;x<64;x=x+10)									//在第二屏画横条
	{
		for(i=0;i<36;i=i+2) ShowByte(7-x/8,i,2,DataTab[x%8]);
	}
	for(x=6;x<37;x=x+10)									//画竖条
	{
		for(i=0;i<8;i++) ShowByte(i,x,2,0xaa);
	}
}

/**********************************************************************/
//显示左屏上的数据点配合背景方格使用(参见ShowBG_L())
//dat(0-63):待显示的数据,column(0-63):显示点的列值

void ShowWave_L(unsigned char dat,unsigned char column)
{
	unsigned char x,z;
	if(column%2==0)
	{	
		for(z=0;z<64;z=z+10)
		{
			if(dat/8==z/8)x=DataTab[dat%8]|DataTab[z%8];
		}
			if(dat/8==4)x=DataTab[dat%8];
			
	}
	else x=DataTab[dat%8];
	if(column%10==0)x=x|0xaa;
	ShowByte(7-dat/8,column,1,x);
}

/**********************************************************************/
//显示右屏上的数据点配合背景方格使用(参见ShowBG_R())
//dat(0-63):待显示的数据,column(0-35):显示点的列值

void ShowWave_R(unsigned char dat,unsigned char column)
{
	unsigned char x,z;
	if(column%2==0)
	{	
		for(z=0;z<64;z=z+10)
		{
			if(dat/8==z/8)x=DataTab[dat%8]|DataTab[z%8];
		}
			if(dat/8==4)x=DataTab[dat%8];
			
	}
	else x=DataTab[dat%8];
	if((column-6)%10==0&column!=0)x=x|0xaa;
	ShowByte(7-dat/8,column,2,x);
}

⌨️ 快捷键说明

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