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

📄 lcd.c

📁 本源码是液晶的12232b-4的控制程序 包括 读写
💻 C
字号:
/*============================================================
功能:使用12232液晶显示图片演示
作者: Mingtree	ycxms88@163.com   http://www.mcu123.com
==============================================================
硬件:TG12232B (122*32)模拟口线接线方式
连接线图: 
请到这里下载:
http://www.mcu123.net/bbs/dispbbs.asp?boardID=23&ID=1062&page=1

本程序源码只供学习参考,如有需要请联系作者。

编译平台:Icc Avr 6.31A


//可能看起来有点乱,不过效果还是不错的,显示图形总的来说比显示汉字要简单,当然显示汉字也不难。
希望此程序能给你一些帮助。
有什么问题可以发email 给我或到我的论坛发问.
http://www.mcu123.net/bbs
=============================================================*/


#define E1_1 IOD5=1		//块1  左边
#define E1_0 IOD5=0	//块1  左边
#define E2_1 IOD6=1		//块1  左边
#define E2_0 IOD6=0		//块2  右边

#define RW_1 IOE|=0X80		//
#define RW_0 IOE&=0X7F		//

#define A0_1 IOD4=1 	//A0为1时是数据,0时为指令数据
#define A0_0 IOD4=0 	//A0为1时是数据,0时为指令数据
#define DATA IOC 	//数据

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


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

//左页
//发送数据
void	OUTMD(BYTE i)
{
	A0_1;	//写数据
	delay(5);
	E1_1;
	delay(10);
	DATA=i;
	delay(5);
	E1_0;
	
}
//左页
//发送命令
void	OUTMI(BYTE i)
{
	A0_0;	//写指令
	delay(5);
	E1_1;
	delay(10);
	DATA=i;
	delay(5);
	E1_0;
	
}
//右页
//发送数据
void	OUTSD(BYTE i)
{
	A0_1;	//写数据
	delay(5);
	E2_1;
	delay(10);
	DATA=i;
	delay(5);
	E2_0;

}
//右页
//发送命令
void	OUTSI(BYTE i)
{
	A0_0;	//写指令
	delay(5);
	E2_1;
	delay(10);
	DATA=i;
	delay(5);
	E2_0;
	
}



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

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

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

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

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

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

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

调用方式:void DrawBmp(bit layer,BYTE width,BYTE *bmp)
函数说明:画一个图,layer表示上下层,width是图形的宽,高都是16,bmp是
图形指针
          使用zimo3软件,纵向取模,字节倒序/240字节
--------------------------------------------------------------------------------
-*/
void DrawBmp(BYTE layer,BYTE width,BYTE const *bmp)
{
BYTE x,address,i=0;     //address表示显存的物理地址
BYTE page=0;	//page表示上下两页
BYTE 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)
{
BYTE i;
BYTE 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, BYTE width,BYTE const *bmp)
{
BYTE x,address,i=0;     //address表示显存的物理地址
BYTE page=0;	//page表示上下两页
BYTE 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(BYTE d_where,uint x_add,bit layer,BYTE width)
//d_where表示在码表中第几个汉字,x_add横坐标位置,layer显示的层, width显示的宽度。
//---------------------------------------------------------------


void Draw_word(BYTE d_where,uint x_add,BYTE layer,BYTE width)
{
BYTE x,i=0,address;     //address表示显存的物理地址
BYTE page=0;	//page表示上下两页
BYTE 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++;
}
}

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

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

//显示动态的等待图标
void wait1(BYTE 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
 DDRA=0xFF;PORTA=0xFF;
 DDRB=0xFF;PORTB=0xFF;
 DDRC=0xFF;PORTC=0xfF;
 DDRD=0xFF;PORTD=0x7F;
 }
 
 
//演示程序
void main()                                                                                                                          
{                
 init_port();                                                                                                    
 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 + -