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

📄 cepark-avr

📁 CEPARK-AVR单片机教程LCD12232液晶显示实验
💻
字号:
/**************************************************
LCD12232.c 文件
**************************************************/

#include "LCD12232.h"

unsigned char Bmp001[]=
{
/*------------------------------------------------------------------------------
;  若数据乱码,请检查字模格式设置,注意选择正确的取模方向和字节位顺序。
;  源文件 / 文字 : 字模
;  宽×高(像素): 122×32
;  字模格式/大小 : 单色点阵液晶字模,纵向取模,字节倒序/488字节
;  数据转换日期  : 2009-4-30 10:17:15
------------------------------------------------------------------------------*/
//宽的像素数,高的像素数,宽的字节数,参数设置可选
0x00,0x00,0x00,0x00,0x00,0xC0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x44,0x5C,
0x78,0x50,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xC0,0xE0,0xC0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0xFC,0x08,0x00,0x00,0x00,0x40,0x40,0x40,0x40,
0xFC,0xFC,0x40,0x40,0x40,0x40,0xFC,0xFC,0x40,0x40,0x40,0x60,0x70,0x60,0x40,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x07,0x03,
0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x90,0x50,0x30,0x38,
0x1C,0x18,0x12,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0xE2,
0xFF,0xFF,0x22,0x42,0xC3,0x83,0x02,0x00,0xFC,0xF8,0x4B,0x49,0x48,0x48,0x48,0x48,
0x4B,0x49,0x48,0xFC,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,
0x08,0x08,0x08,0xFF,0xFE,0x0B,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0C,0x0E,
0x0C,0x08,0x00,0x00,0x00,0xC0,0x20,0x18,0x07,0x03,0xFF,0xFF,0x00,0x00,0x01,0x87,
0x80,0x80,0x8F,0x8F,0x84,0x84,0x84,0xFC,0xBC,0x84,0x84,0x84,0x84,0x8F,0x8F,0x40,
0x60,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x30,0x70,0x3F,0x1F,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x7F,0x7F,0x00,0x00,0x40,0x40,0x40,0x20,0x20,0x10,0x18,0x0E,
0x07,0x01,0x00,0x01,0x02,0x0C,0x18,0x38,0x30,0x70,0x30,0x20,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};


unsigned char lab1[]={

/*--  文字:  1  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00

};

unsigned char lab2[]={
/*--  文字:  2  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00
};

unsigned char lab3[]={
/*--  文字:  3  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00
};

unsigned char lab4[]={
/*--  文字:  4  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00
};

unsigned char lab5[]={
/*--  文字:  5  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00
};

unsigned char lab6[]={
/*--  文字:  6  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00
};

unsigned char lab7[]={
/*--  文字:  7  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00
};

unsigned char lab8[]={
/*--  文字:  8  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00
};

unsigned char lab9[]={
/*--  文字:  9  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00
};

unsigned char lab0[]={
/*--  文字:  0  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00
};

/*****************************************
//display :汉字显示
****************************************/
unsigned char lab_n[]={
/*--  文字: 汉  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x04,0x04,0x7E,0x01,0x40,0x20,0x20,0x10,0x0B,0x04,0x0B,0x10,0x30,0x60,0x20,0x00,
0x10,0x60,0x01,0x86,0x60,0x04,0x1C,0xE4,0x04,0x04,0x04,0xE4,0x1C,0x04,0x00,0x00
};

unsigned char lab_y[]={
/*--  文字:  字  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x02,0x02,0x02,0x02,0x42,0x82,0x7F,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,
0x00,0x10,0x0C,0x24,0x24,0x24,0x25,0x26,0xA4,0x64,0x24,0x04,0x14,0x0C,0x00,0x00
};

unsigned char lab_l[]={
/*--  文字:  显  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x20,0x21,0x22,0x2C,0x20,0x3F,0x20,0x20,0x20,0x3F,0x28,0x24,0x23,0x20,0x20,0x00,
0x00,0x00,0x00,0x3E,0x2A,0xEA,0x2A,0x2A,0x2A,0xEA,0x2A,0x3E,0x00,0x00,0x00,0x00
};

unsigned char lab_g[]={
/*--  文字:  示  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x10,0x08,0x04,0x03,0x00,0x40,0x80,0x7F,0x00,0x00,0x01,0x02,0x0C,0x18,0x00,0x00,
0x00,0x20,0x20,0x22,0x22,0x22,0x22,0xE2,0x22,0x22,0x22,0x22,0x22,0x20,0x20,0x00

};

unsigned char lab_x[]={
/*--  文字:  例  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x00,0xFF,0x02,0x81,0x40,0x33,0x0C,0x03,0x00,0x00,0x07,0x40,0x80,0x7F,0x00,
0x40,0x20,0xF8,0x07,0x02,0x80,0x62,0x1E,0x12,0xF2,0x02,0xF8,0x00,0x00,0xFF,0x00
};

unsigned char lab_u[]={
/*--  文字: 子  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x01,0x01,0x01,0x01,0x01,0x41,0x81,0x7F,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,
0x00,0x00,0x02,0x02,0x02,0x02,0x02,0xE2,0x12,0x0A,0x06,0x02,0x00,0x80,0x00,0x00

};

unsigned char Add1=0;           //
unsigned char Add2=0;        //
unsigned char SEL_E1=1;         //
unsigned char SEL_E2=2;        //

//端口初始化
void LCDPort_Init()
{      
	//LCD数据端口设置
	PORTB = 0xff;         //
	DDRB = 0xFF;           //配置端口PB全部为输出口,LCD数据端口
	
	//LCD控制端口设置  
	SET_RES; 
	SET_A0;
	SET_RW;  
	SET_E1;  
	SET_E2;  
	DDRA = 0xff;          //
	Delayms(15);   
}

//LCD初始化
void LCD_Init()
{		
	WriteCommand(0x01,0xe2);  //rest 复位
	WriteCommand(0x02,0xe2);
	//WriteCommand(0x01,0xae);  //close display 关显示
	//WriteCommand(0x02,0xae);  
	//WriteCommand(0x01,0xa4);  //static driver关静态驱动
	//WriteCommand(0x02,0xa4);
	WriteCommand(0x01,0xa9);  //duty 1/32占空比1/32
	WriteCommand(0x02,0xa9);
	//WriteCommand(0x01,0xa0);  //clockwise output  ADC选择,顺时针还是逆时针读取RAM数据
	//WriteCommand(0x02,0xa0);
 
	//WriteCommand(0x01,0xee);  //end 关闭读修改写,无论读或写操作后,列地址都加1
	//WriteCommand(0x02,0xee);  
	//WriteCommand(0x01,0x00);         //行地址设置,设置显示RAM的行地址(Y地址)
	//WriteCommand(0x02,0x00);
	//WriteCommand(0x01,0xc0);  //显示起始行设置。指定显示器从显示RAM中的那一行开始显示
	                             //数据,(起始行=0)
	//WriteCommand(0x02,0xc0);
	WriteCommand(0x01,0xaf);  //opend display  开显示
	WriteCommand(0x02,0xaf);	
}

 //LCD写指令,
void WriteCommand(unsigned char chip_select,unsigned char cmd)
{
	if(chip_select & 1)     //判断对左页还是右页的操作
	{
		SET_E1;      //如果是左页,E1使能
	}
	
	else if(chip_select & 2)            //
	{
		SET_E2;       //右页,E2使能
	}
	
	CLR_A0;      //A0=0 写命令
	CLR_RW;     //RW=0 写操作
	
	PORTB = cmd;     //写命令数据到数据端口

	if(chip_select & 1)         //
	{
		CLR_E1;          //关闭左右页使能
	}
	
	else if(chip_select & 2)      //
	{
		CLR_E2;          //
	}
	
    SET_A0;         //
	SET_RW;         //    	
}

//写数据
void WriteData(unsigned char chip_select,unsigned char data)
{
	if(chip_select & 1)      //判断左右页
	{
		SET_E1;          //
	}
	
	else if(chip_select & 2)      //
	{
		SET_E2;         //
	}
	
	SET_A0;           //A0=1,写数据
	CLR_RW;        //RW=0,写操作
	
	PORTB = data;     //写数据到数据端口

	if(chip_select & 1)         //
	{
		CLR_E1;          //结束使能
	}
	
	else if(chip_select & 2)         //
	{
		CLR_E2;                //
	}
	
    CLR_A0;            //
	SET_RW;         //
}
 
 //清屏
void clear_lcd(void)
{
	unsigned char a,b,c;
	for(a = 0xb8;a < 0xbc;a++)     //清屏0-3页,指令分别是b8,b9,ba,bb(X地址)
	{
		b = 0;                        //
		WriteCommand(0x01,a);        //左,第0页开始
		WriteCommand(0x02,a);        //右,第0页开始
		WriteCommand(0x02,b);          //右,第0行开始(Y地址)
		WriteCommand(0x01,b);        //	左,第0行开始
	
		for(c = 0;c < 61;c++)       //总共122列,左右各61列
		{
			WriteData(0x01,0x00);     //左,每列均填充0
			WriteData(0x02,0x00);     //右,每列均填充0
		}
	}
}

//写字符
void tex_Write(unsigned char *pt)
{
	unsigned char a,b;
	if(SEL_E1)                  //左选中?
	{ 
		WriteCommand(0x01,0xb8);      //页设置,第0页(X地址)
		WriteCommand(0x01,Add1);     //第0行开始(Y)地址
		for(a = 8;a < 16;a++)        //
		{ 
			WriteData(0x01,*(pt + a));  //上半部分8-16,总高度16,
		}
  
		WriteCommand(0x01,0xb9);     //第一页
		WriteCommand(0x01,Add1);    //
		for(b = 0;b < 8;b++)        //
		{
			WriteData(0x01,*(pt + b));  //下半部分
		}
	}
	else if(SEL_E1 == 0)         //若为0,写右半边
	{
		WriteCommand(0x02,0xb8);      //
		WriteCommand(0x02,Add1);    //
		for(a = 8;a < 16;a++)       //
		{
		WriteData(0x02,*(pt + a));  //
		}
  
		WriteCommand(0x02,0xb9);   //
		WriteCommand(0x02,Add1);   //
		for(b = 0;b < 8;b++)      //
		{
			WriteData(0x02,*(pt + b));   //
		}
  
	}
	if((Add1 + 8) < 61)       
	Add1 += 8;               //如果不超过61列列地址+8
	else                   //
	{ 
		Add1 = 0;          //超过61列,则列地址置0,写右半边
		WriteCommand(0x02,0xb8);   //
		WriteCommand(0x02,Add1);    //
		for(a = 12;a < 16;a++)       //一个字符占8列,所以在61列之后还要写4列
		WriteData(0x02,*(pt + a));     //
		WriteCommand(0x02,0xb9);       //
		WriteCommand(0x02,Add1);       //
		for(b = 4;b < 8;b++)         //
		WriteData(0x02,*(pt + b));     //
		Add1 += 4;                    //
   
		SEL_E1 = 0;         //
	}
}

// 写汉字
void WriteCharacter(unsigned char *pt)
{
	unsigned char a,b;
    if(SEL_E2)            //
	{
		WriteCommand(0x01,0xba);       //
		WriteCommand(0x01,Add2);       //
		for(a=16;a<32;a++)         //
		{
			WriteData(0x01,*(pt+a));     //
		}
  
		WriteCommand(0x01,0xbb);        //
		WriteCommand(0x01,Add2);        //
		for(b=0;b<16;b++)            //
		{
			WriteData(0x01,*(pt+b));  //
		}
	}
	else if(SEL_E2==0)             //
	{
		WriteCommand(0x02,0xba);    //
		WriteCommand(0x02,Add2);        //
		for(a=16;a<32;a++)         //
		{
			WriteData(0x02,*(pt+a));  //
		}
  
		WriteCommand(0x02,0xbb);       //
		WriteCommand(0x02,Add2);       //
		for(b=0;b<16;b++)           //
		{
			WriteData(0x02,*(pt+b));  //
		}
  
	}
	if((Add2+16)<61)  
	Add2+=16;                  //
	else 
	{ 
		Add2=0;                       //
		WriteCommand(0x02,0xba);       //
		WriteCommand(0x02,Add2);        //
		for(a=29;a<32;a++)
		WriteData(0x02,*(pt+a));       //一个汉字16列,写完61列之后还要写3列
		WriteCommand(0x02,0xbb);           //
		WriteCommand(0x02,Add2);      //
		for(b=13;b<16;b++)
		WriteData(0x02,*(pt+b));         //
		Add2+=3;                       //
   
		SEL_E2=0;                     //
	}
}

 //绘图
void Drawing_Map(unsigned char *pt)
{
	unsigned char half,seg,page;
	unsigned char flag = 1;
	
	for(page = 0xb8;page < 0xbc;page++)
	{
		for(half = 0;half < 2;half++)
		{
			flag = !flag;
			if(flag)
			{
				WriteCommand(0x02,page);
				WriteCommand(0x02,0x00);
			}
			else
			{
				WriteCommand(0x01,page);
				WriteCommand(0x01,0x00);
			}
			for(seg = 0;seg < 61;seg++)
			{
				if(flag)
				{
					WriteData(0x02,*pt++);				
				}
				else
				{
					WriteData(0x01,*pt++);				
				}
			}
		}
	}
}         


//us级别的延时函数
void Delayus(unsigned int lus)
{
	while(lus--)
	{
		_delay_loop_2(3);      //_delay_loop_2(1)是延时4个时钟周期,参数为3则延时12
		           //个时钟周期,本实验用12M晶体,则12个时钟周期为12/12=1us
    }
}

//ms级别的延时函数
void Delayms(unsigned int lms)
{
	while(lms--)
	{
		_delay_loop_2(3000);        //延时1ms
    }
}

⌨️ 快捷键说明

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