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

📄 lcd_12232.c

📁 基于lpc2148的按键扫描程序
💻 C
字号:


#include "config.h"


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

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


void OUT_DATA(unsigned char data)
{
unsigned char i;
for(i=0;i<8;i++) 
  {
  
   if(data&1) {Io_SetG(1,i+16);}	 //把相应的IO口置位或者清零
   else {Io_ClrG(1,i+16);}
   data=data>>1;
   }
}


//延时
void delay(unsigned int i)
{
	unsigned int k=6000;
	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_SetG(A0);	//A0_1;	//写数据
	//delay(5);
	Io_SetG(E1);	//E1_1;
	//delay(10);
	OUT_DATA(i);     //DATA=i;
	//delay(5);
	Io_ClrG(E1);	//E1_0;
	
}
//左页
//发送命令
void	OUTMI(unsigned char i)
{
	Io_ClrG(A0);	//A0_0;	//写指令
	//delay(5);
	Io_SetG(E1);	//E1_1;
	//delay(10);
	OUT_DATA(i);	//DATA=i;
	//delay(5);
	Io_ClrG(E1);	//E1_0;
	
}
//右页
//发送数据
void	OUTSD(unsigned char i)
{
	Io_SetG(A0);	//A0_1;	//写数据
	//delay(5);
	Io_SetG(E2);	//E2_1;
	//delay(10);
	OUT_DATA(i);	//DATA=i;
	//delay(5);
	Io_ClrG(E2);	//E2_0;

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




//初始化
void	lcdini(void)
{
	Io_ClrG(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(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,uchar layer,uchar width)
{
uchar x,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++;
}
}


void	delay1s(unsigned char i)
{
	while(i>1)
	{
		i--;
	
		delay(65530);
	}
}



 void init_port(void)
 {
 //port initialized
 IO1DIR|=0x00FF0000|(1<<24)|(1<<25);
 IO0DIR|=(1<<16)|(1<<23);

 }
 

//------------------------------------------------------------------
//字模2显示一个字符
//纵向取模,字节倒序
void Draw_char(uchar d_where,uint x_add,uchar layer,uchar width)
{
uchar x,address;     //address表示显存的物理地址
//uchar page=0;	//page表示上下两页
uchar window=0;  //window表示左右两页
//putcharR	//右边
//putcharL	//左边
d_where=d_where*16;

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++;
}
}


//演示程序
int lcd_init()                                                                                                                          
{                
 init_port();                                                                                
 lcdini(); //reset                                                   
 clrscr(); //clr          
 return 0;
} 
                                              

⌨️ 快捷键说明

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