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

📄 at89c52+12232lcd.c

📁 proteus中LCD--HDM32GS12b的仿真及源码.
💻 C
字号:
/*
---------------------------------------------------------------
|DB0-----P0.0 | DB4-----P0.4 | RW-------P1.1 | A0--------P1.0 |
|DB1-----P0.1 | DB5-----P0.5 | RS-------P2.1 | V0接1K电阻到GND |
|DB2-----P0.2 | DB6-----P0.6 | E1-------P1.3 |
|DB3-----P0.3 | DB7-----P0.7 | E2-------P1.2 |
---------------------------------------------------------------


[注:AT89x52使用22.1184M或11.0592M晶振,实测使用22.1184M或11.0592都可以]
编译平台:Keil uV2 7.08
									*/

#include "reg52.h"
#include "INTRINS.H"



#define uchar unsigned char
#define uint unsigned int

//#define E1 P1_2 //块1 左边
//#define E2 P1_3 //块2 右边
//#define RW P1_1
//#define A0 P1_0 //A0为1时是数据,0时为指令数据
//#define DATA P0 //数据
						

sbit A0=P1^0;
sbit RW=P1^1;
sbit E1=P1^2;
sbit E2=P1^3;



sbit RS=P2^1;
#define DATA P0



extern uchar code Bmpt1[];
extern uchar code Bmpt2[];
extern uchar code Bmpt3[];
extern uchar code Bmpt4[];
extern uchar code Bmpt5[];
extern uchar code Bmpt6[];
extern uchar code Bmpt7[];
extern uchar code Bmptc[];
extern uchar code bmp001[];
extern uchar code bmp002[];
extern uchar code Bmp08[];
extern uchar code Bmp07[];
extern uchar code Bmp06[];
extern uchar code Bmp05[];
extern uchar code Bmp04[];
extern uchar code Bmp03[];
extern uchar code Bmp02[];
extern uchar code Bmp01[];
extern uchar code Bmp012[];
extern uchar code Bmp003[];
extern uchar code Bmp002[];


//延时
void delay(uint i)
{
	uint k=200;
	while(i>0)
  	{     i--;   }
	while(k>0)
   	{  k--;  }
}

void waitenl(void)
{	
	uchar i=0x00;
	E1=0;
	E2=0;
	A0=0;
	RW=1;
	P0=0xff;
	_nop_();
	E1=1;
	_nop_();
	i=P0;
	E1=0;
	i&=0x80;
	while(i)
	{
		E1=1;
		_nop_();
		i=P0;
		_nop_();
		E1=0;
		i&=0x80;
		
	}
	E1=0;
	E2=0;
	A0=0;
	RW=1;
	_nop_();

}	
void waitenr(void)
{	
	uchar i=0x00;
	E1=0;
	E2=0;
	_nop_();
	A0=0;
	RW=1;
	P0=0xff;
	_nop_();
	E2=1;
	_nop_();
	i=P0;
	E2=0;
	i&=0x80;
	while(i)
	{
		E2=1;
		_nop_();
		i=P0;
		_nop_();
		E2=0;
		i&=0x80;
	}
	E1=0;
	E2=0;
	A0=0;
	RW=1;
	_nop_();
}	

//左页
//发送数据
void  OUTLD(uchar i)
{
waitenl();
E1=0;
_nop_();
A0=1; //写数据
RW=0;
_nop_();
E1=1;
_nop_();
DATA=i;
_nop_();
E1=0;
_nop_();
A0=0;
RW=1;
_nop_();
DATA=0xff;
}
//左页
//发送命令
void OUTLI(uchar i)
{
waitenl();
E1=0;
_nop_();
A0=0; //写指令
RW=0;
_nop_();
E1=1;
_nop_();
DATA=i;
_nop_();
E1=0;
_nop_();
A0=0;
RW=1;
_nop_();
DATA=0xff;
}
//右页
//发送数据
void OUTRD(uchar i)
{
waitenr();
E2=0;
_nop_();
A0=1; //写数据
RW=0;
_nop_();
E2=1;
_nop_();
DATA=i;
_nop_();
E2=0;
_nop_();
A0=0;
RW=1;
_nop_();
DATA=0xff;
}
//右页
//发送命令
void OUTRI(uchar i)
{
waitenr();
E2=0;
_nop_();
A0=0; //写指令
RW=0;
_nop_();
E2=1;
_nop_();
DATA=i;
_nop_();
E2=0;
_nop_();
A0=0;
RW=1;
_nop_();
DATA=0xff;
}


//初始化
void LCDINI(void)
{
OUTLI(0xE2);
OUTRI(0xE2);//复位
OUTLI(0xAE);
OUTRI(0xAE);//display off
OUTLI(0xA4);
OUTRI(0xA4);//static drive off
OUTLI(0xA9);
OUTRI(0xA9);//1/32占空比
OUTLI(0xA1);
OUTRI(0xA1);//时钟线输出,select ADC=CW
OUTLI(0xEE);
OUTRI(0xEE);//写模式,read-modify-write off

OUTLI(0x00); //column address
OUTLI(0xC0); //display start line
OUTRI(0x00);
OUTRI(0xC0);

OUTLI(0xAF);//display on
OUTRI(0xAF);

}
/*
函数说明:同时设置主从显示页为0-3页。(内函数,私有,用户不直接调用)
------------------------------------------------------------------------
*/
void SetPage(uchar page0,uchar page1)
{
OUTLI(0xB8|page0);
OUTRI(0xB8|page1);
}

/*
--------------------------------------------------------------------------------
函数说明:同时设置主从列地址为0-121。(内函数,私有,用户不直接调用)
--------------------------------------------------------------------------------
*/
void SetAddress(uchar address0,uchar address1)
{
OUTLI(address0);
OUTRI(address1);
}

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

调用方式:void PutChar0(uchar ch)
函数说明:在右页当前地址画一个字节8个点。(内函数,私有,用户不直接调用)
--------------------------------------------------------------------------------
-*/
void PutCharR(uchar ch)
{
OUTRD(ch);
}

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

调用方式:void PutChar1(uchar ch)
函数说明:在左页当前地址画一个字节8个点。(内函数,私有,用户不直接调用)
--------------------------------------------------------------------------------
-*/
void PutCharL(uchar ch)
{
OUTLD(ch);
}

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

调用方式:void DrawBmp(bit layer,uchar width,uchar *bmp)
函数说明:画一个图,layer表示上下层,width是图形的宽,高都是16,bmp是
图形指针
使用zimo3软件,纵向取模,字节倒序/240字节
--------------------------------------------------------------------------------
-*/
void DrawBmp(bit layer,uchar width,uchar *bmp)
{
uchar x,address,i=0; //address表示显存的物理地址
uchar page=0; //page表示上下两页
bit window=0; //window表示左右两页
//putcharR //右边
//putcharL //左边

for (x=width;x>1;x--)
{
if (i>60) {window=1;address=i%61;}
else address=i;

if(layer==0) //显示一行八个字
{
SetPage(0,0);
SetAddress(address,address);
if(window==1)PutCharR(bmp[i]);
else PutCharL(bmp[i]);
SetPage(1,1);
SetAddress(address,address);
if(window==1)PutCharR(bmp[i+width]);
else PutCharL(bmp[i+width]);
}
else
{ //显示第二行八个汉字
SetPage(2,2);
SetAddress(address,address);
if(window==1)PutCharR(bmp[i]);
else PutCharL(bmp[i]);
SetPage(3,3);
SetAddress(address,address);
if(window==1)PutCharR(bmp[i+width]);
else PutCharL(bmp[i+width]);
}
i++;

}
}


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

调用方式:void clrscr(void)
函数说明:清屏
--------------------------------------------------------------------------------
-*/
void clrscr(void)
{
uchar i,page;
for (page=0;page<4;page++)
{
SetPage(page,page);
SetAddress(0,0);
for (i=0;i<61;i++){PutCharR(0);PutCharL(0);}
}
}

//-----------------------------------------------------------
//图片显示
//采用字模2生成或字模3生成的都可以.
//-----------------------------------------------------------
void DrawBmp1(uint x_add, uchar width,uchar *bmp)
{
uchar x,address,i=0; //address表示显存的物理地址
uchar page=0; //page表示上下两页
bit window=0; //window表示左右两页
//putcharR //右边
//putcharL //左边
for (x=width;x>1;x--)
{
if (x_add>60) {window=1;address=x_add%61;}
else address=x_add;


SetPage(0,0);
SetAddress(address,address);
if(window==1)PutCharR(bmp[i]);
else PutCharL(bmp[i]);
SetPage(1,1);
SetAddress(address,address);
if(window==1)PutCharR(bmp[i+width]);
else PutCharL(bmp[i+width]);


SetPage(2,2);
SetAddress(address,address);
if(window==1)PutCharR(bmp[i+width+width]);
else PutCharL(bmp[i+width+width]);
SetPage(3,3);
SetAddress(address,address);
if(window==1)PutCharR(bmp[i+width+width+width]);
else PutCharL(bmp[i+width+width+width]);
i++;
x_add++;

}
}

//---------------------------------------------------------------
//---------------------------------------------------------------
//采用zimo2 显示汉字,以汉字的显示方式
//void Draw_word(uchar d_where,uint x_add,bit layer,uchar width)
//d_where表示在码表中第几个汉字,x_add横坐标位置,layer显示的层, width显示的宽度。
//---------------------------------------------------------------


void Draw_word(uchar d_where,uint x_add,bit layer,uchar width)
{
	uchar x,i=0,address; //address表示显存的物理地址
	uchar page=0; //page表示上下两页
	bit window=0; //window表示左右两页
	//putcharR //右边
	//putcharL //左边
	d_where=d_where*32;

	for (x=width;x>1;x--)
	{
		if (x_add>60) {window=1;address=x_add%61;}
		else address=x_add;
	
		if(layer==0) //显示第一行八个字
		{

			SetPage(0,0);
			SetAddress(address,address);
			if(window==1)PutCharR(bmp001[d_where]);//右边
			else PutCharL(bmp001[d_where]);//左边
			SetPage(1,1);
			SetAddress(address,address);
			if(window==1)PutCharR(bmp001[d_where+width]);
			else PutCharL(bmp001[d_where+width]);

		}
		else
		{ 	//显示第二行八个汉字
			SetPage(2,2);
			SetAddress(address,address);
			if(window==1)PutCharR(bmp001[d_where]);//右边
			else PutCharL(bmp001[d_where]);//左边
			SetPage(3,3);
			SetAddress(address,address);
			if(window==1)PutCharR(bmp001[d_where+width]);
			else PutCharL(bmp001[d_where+width]);

		}
		x_add++;
		d_where++;
	}
}
/*
//------------------------------------------------------------------
//字模2显示一个汉字
//纵向取模,字节倒序
void disp_one(bit top_low,bit widows,uchar address,uchar width,uchar*bmp)
{
if(top_low==0)
{
SetPage(0,0);
SetAddress(address,address);
if(window==1)PutCharR(bmp001[next][i]);
else PutCharL(bmp001[next][i]);
SetPage(1,1);
SetAddress(address,address);
if(window==1)PutCharR(bmp001[next][i+width]);
else PutCharL(bmp001[next][i+width]);
}
else
{
SetPage(0,0);
SetAddress(address,address);
if(window==1)PutCharR(bmp001[next][i]);
else PutCharL(bmp001[next][i]);
SetPage(1,1);
SetAddress(address,address);
if(window==1)PutCharR(bmp001[next][i+width]);
else PutCharL(bmp001[next][i+width]);
}
}
*/


//液晶显示规则
// M(左) S(右)
// page page
// 0 | 0
// 1 | 1
// 2 | 2
// 3 | 3

void delay1s(uchar i)
{
while(i>1)
{
i--;

delay(65530);
}
}

//显示动态的等待图标
void wait1(unsigned char i)
{
for(;i>1;i--)
{delay1s(2);
clrscr(); //
DrawBmp1(0,60,Bmptc); //
DrawBmp1(76,19,Bmpt1); //
delay1s(2);
clrscr(); //
DrawBmp1(0,60,Bmptc); //
DrawBmp1(76,19,Bmpt2); //
delay1s(2);
clrscr(); //
DrawBmp1(0,60,Bmptc); //
DrawBmp1(76,19,Bmpt3); //
delay1s(2);
clrscr(); //
DrawBmp1(0,60,Bmptc); //
DrawBmp1(76,19,Bmpt4); //
delay1s(2);
clrscr(); //
DrawBmp1(0,60,Bmptc); //
DrawBmp1(76,19,Bmpt5); //
delay1s(2);
clrscr(); //
DrawBmp1(0,60,Bmptc); //
DrawBmp1(76,19,Bmpt6); //
delay1s(2);
clrscr(); //
DrawBmp1(0,60,Bmptc); //
DrawBmp1(76,19,Bmpt7); //
}

}


//演示程序
void main()
{

LCDINI(); //reset
clrscr(); //clr





Draw_word(0,0,0,16); 

Draw_word(1,16,0,16); 

Draw_word(2,32,0,16); //
Draw_word(3,48,0,16); //
Draw_word(0,64,0,16); //
Draw_word(1,80,0,16); //
Draw_word(2,96,0,16); //

DrawBmp(1,120,Bmp002); //
clrscr(); //
delay1s(3);
DrawBmp1(0,122,Bmp012); //LOGO
while(1)
{
delay1s(3);

clrscr(); //
DrawBmp1(10,101,Bmp07); //

delay1s(8);
clrscr(); //
wait1(3);
DrawBmp1(0,122,Bmp04); //
delay1s(8);
clrscr(); //
wait1(3);
DrawBmp1(0,122,Bmp03); //超前科技
delay1s(8);
clrscr(); //
wait1(3);
clrscr(); //
DrawBmp1(10,101,Bmp05); //
delay1s(8);
clrscr(); //
wait1(3);
clrscr(); //
DrawBmp1(10,101,Bmp06); //
delay1s(8);
clrscr(); //
wait1(3);
clrscr(); //
DrawBmp1(10,101,Bmp08); //
delay1s(8);
clrscr(); //
wait1(3);
clrscr(); //
DrawBmp1(0,122,Bmp01); //这仿真器真不错,用过都说好.
wait1(8);
}
}

⌨️ 快捷键说明

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