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

📄 ca240128c.c

📁 ca240128字符型液晶显示模块 Keil C51开发环境下使用
💻 C
📖 第 1 页 / 共 2 页
字号:
//                    CA240128 A & B
//***************************************************************************
//*  Create by :  2004/10/22       KeilC V7.0                  *
//***************************************************************************
//连线表:  CPU=89C52                                                        *
//C/D=P2.0           /CE=P2.7            FS=P3.5         /WR=/WR   /RD=/RD  *
//FOSC=12MHz         D0-D7=P0.0-P0.7     /RSET=/(CPU RSET)                  *
//***************************************************************************
#include <reg52.h>
#include <intrins.h>
#include <stdio.h>

#define uint  unsigned int
#define uchar unsigned char
#define Graphic	1
#define TXT		0
#define LcmLengthDots	240
#define LcmWidthDots		128

char xdata LcmDataPort _at_ 0x0000;
char xdata LcmCmdPort  _at_ 0x0100;
sbit FS = P3^5;
sbit Key= P3^4;

uchar code bmp1[];
uchar code str1[];

//指令&数据读写状态
void CheckRWCD(void)
{
	while((LcmCmdPort & 0x03) != 0x03);	//低电平忙
}
//数据自动写状态
void CheckAutoWrite(void)
{
	while((LcmCmdPort & 0x08) == 0);	//低电平忙
}
//屏读/屏考贝出错状态
void CheckScreen(void)
{	
	while(LcmCmdPort & 0x40);	//1出错,0正确
}
//一个数据子写入函数
void LcmWriteData(uchar uData)				
{
	LcmDataPort = uData;
}
//一个数据读出函数
uchar LcmReadData( void )
{
	uchar uData;
	uData = LcmDataPort;
	return uData;
}
//无参数指令写入函数
void LcmWriteCommand(uchar Command)			
{
	CheckRWCD();				//检测指令读写状态
	LcmCmdPort = Command;
}
//单参数指令写入函数
void LcmWriteCommandWith1Par(uchar Parameter,uchar Command)
{
	CheckRWCD();				//检测指令读写状态
	LcmDataPort = Parameter;
	CheckRWCD();
	LcmCmdPort = Command;
}
//双参数指令写入函数
void LcmWriteCommandWith2Par(uchar Parameter1,uchar Parameter2,uchar Command)
{
	CheckRWCD();				//检测指令读写状态
	LcmDataPort = Parameter1;
	CheckRWCD();
	LcmDataPort = Parameter2;
	CheckRWCD();
	LcmCmdPort = Command;
}
//LCM初始化函数
void LcmInit( void )
{
	LcmWriteCommandWith2Par(0x00,0x00,0x40);	//设置文本显示区首地址
	LcmWriteCommandWith2Par(LcmLengthDots/8,0x00,0x41);	//设置文本显示区宽度
	LcmWriteCommandWith2Par(0x00,0x08,0x42);	//设置图形显示区首地址0x0800
	LcmWriteCommandWith2Par(LcmLengthDots/8,0x00,0x43);	//设置图形显示区宽度
	LcmWriteCommand(0xA7);			//设置光标形状 8x8方块
	LcmWriteCommand(0x81);			//显示方式设置 文本xor图形(异或)
	LcmWriteCommand(0x9C);			//显示开关设置 文本开,图形开,光标闪烁关
}
//延时函数
void Delay(uint MS)
{
	uchar us,usn;
	while(MS!=0)				//12M Crystal
	{ 
		usn = 2;
		while(usn!=0)
		{
			us=0xf2;
			while (us!=0){us--;};
			usn--;
		}
		MS--;
	}
}
//通过按键设定延时函数
void DelayKey(unsigned char HalfSecond)
{					//Delay_key加入时间参数0.5秒一级
	unsigned int i;
	for(i=0;i<50*HalfSecond;i++)		//12M Crystal
	{
		if(Key==0)
		{
			Delay(20);
			while(Key==0) {Delay(20);}
			break;
		}
		Delay(10);
	}
}
//清显示存储器函数
void LcmClear( uchar FillByte )
{
	uint i = 8192;	//此处仅清8K RAM,如果您32K RAM都使用,请修改i=32768
	if(FillByte) 
	  	LcmWriteCommandWith2Par(0x00,0x08,0x24);	//填充0xff时候要在图形区
	else
		LcmWriteCommandWith2Par(0x00,0x00,0x24);
	LcmWriteCommand(0xB0);			//进入自动写
	while(i--)
	{
		CheckAutoWrite();
		LcmWriteData( FillByte );
	}
	LcmWriteCommand(0xB2);			//退出自动写
}
//设定显示地址函数
void LocateXY(uchar x,uchar y,uchar mode)
{
	uint  temp;
	temp= LcmLengthDots/8*y + x;
	if(mode)				//mode=1为Graphic
	{					//如果图形模式要加上图形区首地址0x0800
		temp+=0x0800;
	}
	LcmWriteCommandWith2Par(temp&0xff,temp/256,0x24);
}
//显示一个ASCII码函数
void PutChar(uchar x,uchar y,uchar CharByte)
{
	LocateXY(x,y,TXT);
	LcmWriteCommandWith1Par(CharByte,0xC4);
}
//显示一个字符串函数
void PutString(uchar x,uchar y,uchar *str)
{
	while(*str != 0)
	{
		if(x> 29)		//自动换行
		{
			x=0;
			y++;
		}
		PutChar(x,y,*str);
		++x;
		++str;
	}
}
//显示一副图片函数
void DisplayOneBmp(uchar *puts)
{
	uchar i,j;
	uint  X=0;
	LocateXY(0,0,Graphic);
	LcmWriteCommand(0xB0);			//进入自动写
	for(i=0;i<LcmWidthDots;i++)
	{
		for(j=0;j<LcmLengthDots/8;j++)
		{
			CheckAutoWrite();
			LcmWriteData(puts[X]);
			X++;
		}
	}
	LcmWriteCommand(0xB2);			//退出自动写
}
//反显一副图片函数
void ReverseOneBmp( void )
{											//利用数据一次读写操作
	uchar i,j,X;						//只能对一段RAM取反
	LocateXY(0,0,Graphic);
	for(i=0;i<LcmWidthDots;i++)
	{
		for(j=0;j<LcmLengthDots/8;j++)
		{
			LcmWriteCommand(0xC5);	//读数据,地址不变
			CheckRWCD();
			X = LcmReadData();
			X = ~X;
			LcmWriteCommandWith1Par(X,0xC0);
		}
	}
}

//屏读功能演示
void ScreenReadDemo( void )
{                              							//利用屏读
                             								//能对当前屏幕反显,包括合成内容(本函数仅读文本到图形)
                             								//但是写入后的内容都在图形区
                             								//可以将文本区内容读出以图形方式写到图形区
     uchar i,j,X;
                             								//使用屏读屏考时候必须设置宽度为40(硬件已决定)
                             								//所以如确定要用到屏读屏考的话最后初始化时就设40
     LcmWriteCommandWith2Par(0x28,0x00,0x41);      //设置文本显示区宽度=40
     LcmWriteCommandWith2Par(0x28,0x00,0x43);      //设置图形显示区宽度=40
     PutString(0,0,str1);                          //0,0不会受到宽度改变的影响
     for(i=0;i<8;i++)            						//屏幕较慢,就以一行文本做演示
     {
           LcmWriteCommandWith2Par((0x28*i+0x800)&0xff,(0x28*i+0x800)/256,0x24);
           for(j=0;j<LcmLengthDots/8;j++)
           {
                 LcmWriteCommand(0xE0);
                 CheckScreen();
                 CheckRWCD();
                 X = LcmReadData();
                 X = ~X;
                 LcmWriteCommandWith1Par(X,0xC0);      
           }            
     }
     //屏读需要一点时间,运行速度比较慢,运行过程中由于文本图形互补的关系,屏幕全黑
     LcmWriteCommand(0x98);      //关闭文本区看显示效果
     DelayKey(3);
     LcmWriteCommand(0x9C);      //恢复文本区显示
     LcmWriteCommandWith2Par(LcmLengthDots/8,0x00,0x41);      //宽度改回原值
     LcmWriteCommandWith2Par(LcmLengthDots/8,0x00,0x43);
     LcmClear(0);            //清屏
}

//主函数
void main(void)								
{
	uchar i;
	FS =0;
	Delay(60);
	LcmInit();
	LcmClear(0);
	while(1)
	{
		DisplayOneBmp(bmp1);	//显示一副图片
		DelayKey(3);
		//ReverseOneBmp();		//反显当前图片
		//DelayKey(3);
		//LcmClear(0);		//清屏,此处不清屏可观察文本xor图形的显示效果
		//for(i=0;i<16;i++) 	//显示一屏字符串
			//PutString(0,i,str1);
		//DelayKey(3);
		//LcmClear(0);
		//LcmClear(0xff);		//全黑检测

⌨️ 快捷键说明

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