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

📄 lcd_demo.c

📁 LPC2142 LCD12232的显示动画 keil环境
💻 C
字号:
/*============================================================
LPC214X 液晶功能演示
作者: Mingtree	ycxms88@163.com   http://www.mcu123.com
==============================================================

/*
引脚分布
P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7
TX0	 RX0			CS1		  K4   K3

P0.8 P0.9 P0.10 P0.11 P0.12 P0.13 P0.14 P0.15
TX1	 RX1  RW 	SCL	  SDA	 K1	  VRST	K2

P0.16 P0.17 P0.18 P0.19 P0.20 P0.21 P0.22 P0.23
BEEP  SCK1	MISO  MOSI	SSEL  RS_COM RW	   VB
P0.24 P0.25 P0.26 P0.27 P0.28 P0.29 P0.30 P0.31
	  AOUT	D+	   D-	A_IN1 A_IN2	 CS2   ULED

LED引脚
L1---------L8
P1.16----P1.23
*/

#include <LPC214X.H>                        /* LPC214x definitions */

#include <Code.H>
#define	uchar unsigned char
#define uint unsigned int


#define E1	4	  //块1  左边
#define E2	30	  //块2  右边

#define RW	22	  //读写控制端	   0为写 1为读
#define A0	21	  //A0为1时是数据,0时为指令数据


#define DATA PORTB 	//数据




void Io_Set(uchar pin)	   //单个IO口置位函数
{
unsigned int io_data=1;
io_data=io_data<<pin;
IOSET0=io_data;         //IOSET0为IO线上置位寄存器,1有效,0无
}


void Io_Clr(uchar pin)	   //单个IO口清零函数
{
unsigned int io_data=1;
io_data=io_data<<pin;
IOCLR0=io_data;         //IOCLR0为IO线上清零寄存器,1有效,0无
}


void Io_Set1(uchar pin)	   //单个IO口置位函数
{
unsigned int io_data=1;
io_data=io_data<<pin;
IOSET1=io_data;         //IOSET0为IO线上置位寄存器,1有效,0无
}


void Io_Clr1(uchar pin)	   //单个IO口清零函数
{
unsigned int io_data=1;
io_data=io_data<<pin;
IOCLR1=io_data;         //IOCLR0为IO线上清零寄存器,1有效,0无
}
void OUT_DATA(unsigned char data)
{
unsigned char i;
for(i=0;i<8;i++) 
  {
  
   if(data&1) {Io_Set1(i+16);}	 //把相应的IO口置位或者清零
   else {Io_Clr1(i+16);}
   data=data>>1;
   }
}



//延时
void delay(unsigned int i)
{
	unsigned int k=1000;
	while(i>0)
	{
		i--;
	}
	while(k>1)k--;
}


void delayms (unsigned int i) {                        /* Delay function */
unsigned int n;
while(i>1)
{
	for(n=65535;n>1;n--);
	i--;
}
}
//左页
//发送数据
void	OUTMD(unsigned char i)
{
	Io_Set(A0);	//A0_1;	//写数据
	delay(1);
	Io_Set(E1);	//E1_1;
	delay(1);
	OUT_DATA(i);//	DATA=i;
	delay(1);
	Io_Clr(E1);	//E1_0;
	
}
//左页
//发送命令
void	OUTMI(unsigned char i)
{
	Io_Clr(A0);	//A0_0;	//写指令
	delay(1);
	Io_Set(E1);	//E1_1;
	delay(1);
	OUT_DATA(i);	//DATA=i;
	delay(1);
	Io_Clr(E1);	//E1_0;
	
}
//右页
//发送数据
void	OUTSD(unsigned char i)
{
	Io_Set(A0);	//A0_1;	//写数据
	delay(1);
	Io_Set(E2);	//E2_1;
	delay(1);
	OUT_DATA(i);	//DATA=i;
	delay(1);
	Io_Clr(E2);	//E2_0;

}
//右页
//发送命令
void	OUTSI(unsigned char i)
{
	Io_Clr(A0);	//A0_0;	//写指令
	delay(1);
	Io_Set(E2);	//E2_1;
	delay(1);
	OUT_DATA(i);	//DATA=i;
	delay(1);
	Io_Clr(E2);	//E2_0;
	
}




//初始化
void	lcdini(void)
{
	Io_Clr(RW);		//RW_0;
	OUTMI(0XE2);
	delay(1);
	OUTSI(0XE2);//复位
	delay(1);
	OUTMI(0XAE);
	delay(1);
	OUTSI(0XAE);//POWER SAVE
	delay(1);
	OUTMI(0XA4);
	delay(1);
	OUTSI(0XA4);//动态驱动
	delay(1);
	OUTMI(0XA9);
	delay(1);
	OUTSI(0XA9);//1/32占空比
	delay(1);
	OUTMI(0XA0);
	delay(1);
	OUTSI(0XA0);//时钟线输出
	delay(1);
	OUTMI(0XEE);
	delay(1);
	OUTSI(0XEE);//写模式
	delay(1);
	OUTMI(0X00);
	OUTMI(0XC0);
	OUTSI(0X00);
	OUTSI(0XC0);
	
	OUTMI(0XAF);
	OUTSI(0XAF);
	
}
/*
函数说明:同时设置主从显示页为0-3页。(内函数,私有,用户不直接调用)
------------------------------------------------------------------------
*/
void SetPage(uchar page0,uchar page1)
{
OUTMI(0xB8|page1);OUTSI(0xB8|page0);
}

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

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

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

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

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

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

调用方式:void DrawBmp(bit layer,uchar width,uchar *bmp)
函数说明:画一个图,layer表示上下层,width是图形的宽,高都是16,bmp是
图形指针
          使用zimo3软件,纵向取模,字节倒序/240字节
--------------------------------------------------------------------------------
-*/
void DrawBmp(unsigned layer,uchar width,unsigned char const *bmp)
{
uchar x,address,i=0;     //address表示显存的物理地址
uchar page=0;	//page表示上下两页
uchar 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;
uchar 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,unsigned char const *bmp)
{
uchar x,address,i=0;     //address表示显存的物理地址
uchar page=0;	//page表示上下两页
uchar 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(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]);
	
	
	SetPage(0,0);
	SetAddress(address,address);
	if(window==1)PutCharR(bmp[i+width+width]);
	else	PutCharL(bmp[i+width+width]);
	SetPage(1,1);
	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,uchar layer,uchar width)
{
uchar x,i=0,address;     //address表示显存的物理地址
uchar page=0;	//page表示上下两页
uchar 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(unsigned char i)
{
	while(i>1)
	{
		i--;
		delayms(20);
	}
}

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

//	DrawBmp1(0,60,Bmptc); //
	DrawBmp1(76,19,Bmpt3); //
	delay1s(2);

//	DrawBmp1(0,60,Bmptc); //
	DrawBmp1(76,19,Bmpt4); //
	delay1s(2);

//	DrawBmp1(0,60,Bmptc); //
	DrawBmp1(76,19,Bmpt5); //
	delay1s(2);

//	DrawBmp1(0,60,Bmptc); //
	DrawBmp1(76,19,Bmpt6); //
	delay1s(2);

//	DrawBmp1(0,60,Bmptc); //
	DrawBmp1(76,19,Bmpt7); //
	}

}

 void init_port(void)
 {
 //port initialized
 IODIR1=0x00FF0000;
 IODIR0=0x40600010;
 }
 
 
//演示程序
void main()                                                                                                                          
{                
//unsigned int i;
 init_port();
 //while(1)
// {
 // for(i=1;i<=128;i<<=1 )
 // {
//  OUT_DATA(i);
//  delayms(10);
//  }
  //for (j = 0x010000; j < 0x800000; j <<= 1) { /* Blink LED 0,1,2,3,4,5,6 */
  //    IOSET1 = j;                               /* Turn on LED */
  //    delayms (10);                                  /* call wait function */
  //    IOCLR1 = j;                               /* Turn off LED */
  //  }
// }                                                                                                    
 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); //

  clrscr(); //
 DrawBmp(0,112,ARMKIT_bmp);
 DrawBmp(1,119,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 + -