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

📄 lcd.c

📁 单片机源程序精华包
💻 C
字号:
/***************************************************************
功能:实现液晶显示LCD 122*32点阵驱动器为0713
作者:MB
时间:2005-02-28
版本:V1.0
/*---------------------------------------------------------------------------------
CPU 端口定义
---------------------------------------------------------------------------------*/
sfr  LCD_PORT 	= 0x80;
sbit LCD_DI  	= 0xb3;
sbit LCD_ENA2	= 0xb4;
sbit LCD_ENA1	= 0xb5;
/*---------------------------------------------------------------------------------
西文字库点阵
---------------------------------------------------------------------------------*/
unsigned char code Large_DianZen[]={
//;--  0123456789  --  **  宋体, 12  **
//; 当前所选字体下一个汉字对应的点阵为:  宽度x高度=80x16,  调整后为: 80x16
0x00,0x00,0xE0,0x0F,0x10,0x10,0x08,0x20,0x08,0x20,0x10,0x10,0xE0,0x0F,0x00,0x00,  //0
0x00,0x00,0x10,0x20,0x10,0x20,0xF8,0x3F,0x00,0x20,0x00,0x20,0x00,0x00,0x00,0x00,  //1
0x00,0x00,0x70,0x30,0x08,0x28,0x08,0x24,0x08,0x22,0x88,0x21,0x70,0x30,0x00,0x00,  //2
0x00,0x00,0x30,0x18,0x08,0x20,0x88,0x20,0x88,0x20,0x48,0x11,0x30,0x0E,0x00,0x00,  //3
0x00,0x00,0x00,0x07,0xC0,0x04,0x20,0x24,0x10,0x24,0xF8,0x3F,0x00,0x24,0x00,0x00,  //4
0x00,0x00,0xF8,0x19,0x08,0x21,0x88,0x20,0x88,0x20,0x08,0x11,0x08,0x0E,0x00,0x00,  //5
0x00,0x00,0xE0,0x0F,0x10,0x11,0x88,0x20,0x88,0x20,0x18,0x11,0x00,0x0E,0x00,0x00,  //6
0x00,0x00,0x38,0x00,0x08,0x00,0x08,0x3F,0xC8,0x00,0x38,0x00,0x08,0x00,0x00,0x00,  //7
0x00,0x00,0x70,0x1C,0x88,0x22,0x08,0x21,0x08,0x21,0x88,0x22,0x70,0x1C,0x00,0x00,  //8
0x00,0x00,0xE0,0x00,0x10,0x31,0x08,0x22,0x08,0x22,0x10,0x11,0xE0,0x0F,0x00,0x00,  //9
 
//;--  ABCDEF  --  **  宋体, 12  **
//; 当前所选字体下一个汉字对应的点阵为:  宽度x高度=48x16,  调整后为: 48x16
0x00,0x20,0x00,0x3C,0xC0,0x23,0x38,0x02,0xE0,0x02,0x00,0x27,0x00,0x38,0x00,0x20, //A
0x08,0x20,0xF8,0x3F,0x88,0x20,0x88,0x20,0x88,0x20,0x70,0x11,0x00,0x0E,0x00,0x00, //B
0xC0,0x07,0x30,0x18,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x10,0x38,0x08,0x00,0x00, //C
0x08,0x20,0xF8,0x3F,0x08,0x20,0x08,0x20,0x08,0x20,0x10,0x10,0xE0,0x0F,0x00,0x00, //D
0x08,0x20,0xF8,0x3F,0x88,0x20,0x88,0x20,0xE8,0x23,0x08,0x20,0x10,0x18,0x00,0x00, //E
0x08,0x20,0xF8,0x3F,0x88,0x20,0x88,0x00,0xE8,0x03,0x08,0x00,0x10,0x00,0x00,0x00, //F
//;--  :  --  **  宋体, 12  **
//; 当前所选字体下一个汉字对应的点阵为:  宽度x高度=8x16,  调整后为: 8x16
0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x30,0xC0,0x30,0x00,0x00,0x00,0x00,0x00,0x00,//:
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //NULL                                                                
};                                                                             
                                                                               
/*---------------------------------------------------------------------------------
汉字字库点阵                                                                   
---------------------------------------------------------------------------------*/
unsigned char code HanZi[]={
//;--  ★电子工作室★  --  **  宋体, 12  **
//; 当前所选字体下一个汉字对应的点阵为:  宽度x高度=112x16,  调整后为: 112x16
0x00,0x00,0x00,0x00,0x40,0x20,0x42,0x22,0x5C,0x22,0x48,0x22,0x40,0x22,0x40,0x22,
0x7F,0x22,0x40,0x22,0x50,0x22,0x4E,0x22,0x44,0x22,0xC0,0x7F,0x00,0x00,0x00,0x00,

0x08,0x00,0x08,0x00,0xE8,0x7F,0xA8,0x04,0xA9,0x24,0xAE,0x44,0xEA,0x3F,0x08,0x00,
0x08,0x00,0xC8,0x1F,0x0C,0x40,0x0B,0x80,0xEA,0x7F,0x08,0x00,0x08,0x00,0x00,0x00,

0x10,0x02,0x21,0xFE,0x86,0x01,0x70,0x40,0x00,0x7F,0x7E,0x41,0x4A,0x41,0x4A,0x7F,
0x4A,0x41,0x4A,0x41,0x4A,0x7F,0x7E,0x41,0x00,0x41,0x00,0x7F,0x00,0x40,0x00,0x00,

0x00,0x80,0x00,0x60,0xFC,0x1F,0x04,0x80,0x24,0x80,0x24,0x42,0xFC,0x46,0xA5,0x2A,
0xA6,0x12,0xA4,0x12,0xFC,0x2A,0x24,0x26,0x24,0x42,0x24,0xC0,0x04,0x40,0x00,0x00,

0x80,0x00,0x80,0x40,0x80,0x20,0x80,0x10,0xBE,0x0E,0xAA,0x10,0xAA,0x20,0xAA,0x3F,
0xAA,0x44,0xAA,0x44,0xAA,0x44,0xBE,0x44,0x80,0x44,0x80,0x40,0x80,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,


//;--  现在是: :  :  --  **  宋体, 12  **
//; 当前所选字体下一个汉字对应的点阵为:  宽度x高度=104x16,  调整后为: 104x16
0x00,0x80,0x00,0x60,0xFC,0x1F,0x04,0x80,0x24,0x80,0x24,0x42,0xFC,0x46,0xA5,0x2A,
0xA6,0x12,0xA4,0x12,0xFC,0x2A,0x24,0x26,0x24,0x42,0x24,0xC0,0x04,0x40,0x00,0x00,

0x00,0x00,0xFC,0x07,0x44,0x04,0x44,0x04,0x44,0x04,0xFC,0x07,0x10,0x00,0x90,0x00,
0x10,0x03,0x10,0x40,0x10,0x80,0xFF,0x7F,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,

0x00,0x00,0xF8,0xFF,0x01,0x00,0x06,0x00,0x00,0x00,0xF0,0x07,0x92,0x04,0x92,0x04,
0x92,0x04,0x92,0x04,0xF2,0x07,0x02,0x40,0x02,0x80,0xFE,0x7F,0x00,0x00,0x00,0x00,

0x80,0x00,0x80,0x40,0x80,0x20,0x80,0x10,0xBE,0x0E,0xAA,0x10,0xAA,0x20,0xAA,0x3F,
0xAA,0x44,0xAA,0x44,0xAA,0x44,0xBE,0x44,0x80,0x44,0x80,0x40,0x80,0x40,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x30,0xC0,0x30,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,0xC0,0x30,0xC0,0x30,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,0xC0,0x30,0xC0,0x30,0x00,0x00,0x00,0x00,0x00,0x00,
};


unsigned char code LCD_Show_Tab[]={
0x90,0x00,0x90,0x01,0x90,0x02,0x90,0x03,0x90,0x04,0x90,0x05,0x90,0x06,0x11,0x11,  //★电子工作室★
0x90,0x07,0x90,0x08,0x90,0x09,0x90,0x0a,0x90,0x0b,0x90,0x0c,0x90,0x0d,0x11,0x11,  //现在是 ::。
};


/*-----------------------------------------------
LCD接收命令子程序:F为主/从选择0主模块被选中
------------------------------------------------*/

void LCD_Write_Set( unsigned char Com,bit F )
{
	LCD_PORT = Com;
	LCD_DI = 0;
    if ( F )
    {
    	LCD_ENA2 = 1;
        LCD_ENA2 = 0;
     }
     else
     {
     	LCD_ENA1 = 1;
     	LCD_ENA1 = 0;
     }
}

/*-----------------------------------------------
LCD接收数据子程序:F为主/从选择0主模块被选中
------------------------------------------------*/
void LCD_Write_Data( unsigned char Com,bit F )
{
	LCD_PORT = Com;
	LCD_DI = 1;
    if ( F )
    {
    	LCD_ENA2 = 1;
        LCD_ENA2 = 0;
     }
     else
     {
     	LCD_ENA1 = 1;
     	LCD_ENA1 = 0;
     }
}


/*--------------------------------------------------------------
//设置xPos,yPos(x,y行列坐标)
------------------------------------------------------------*/
void Set_xyPos_LCD(unsigned char xPos,unsigned char yPos)	//112*32 0713 xPos(0---112)  yPos(0---3)
{
	unsigned char i;
	if ( yPos < 2 )
   		i = 0xBA;
	else
		i = 0xB6;
	if ( xPos > 60 )
	{

		LCD_Write_Set(yPos + i,1);		//Page_LCD[i] i=0 first page i=7 seventh page
	//	LCD_Write_Set(((xPos - 57)>>4)&0x0F|0x10,1);	//set col address msb
		LCD_Write_Set(xPos - 61,1);				//set col address lsb
	}
	else
	{
		LCD_Write_Set(yPos + i,0);		//Page_LCD[i] i=0 first page i=7 seventh page
	//	LCD_Write_Set((xPos>>4)&0x0F|0x10,0);	//set col address msb
		LCD_Write_Set(xPos,0);				//set col address lsb
	}
}

/*--------------------------------------------------------------
//清除一行子程序
------------------------------------------------------------*/
void Clear_H_LCD(unsigned char H)
{
	unsigned char i,j;
	Set_xyPos_LCD(0, H << 1 );				//set col address lsb
	for( i = 0;i < 2;i++ )
	{
		for( j = 0;j < 61;j++ )
			LCD_Write_Data( 0x00,0 );
		Set_xyPos_LCD(0, (H << 1) + 1);		//set col address lsb
	}
	Set_xyPos_LCD(61, H << 1 );				//set col address lsb
	for( i = 0;i < 2;i++ )
	{
		for( j = 0;j < 61;j++ )
			LCD_Write_Data( 0x00,1 );
		Set_xyPos_LCD(61, (H << 1) + 1);	//set col address lsb
	}
}


/*---------------------------------------------------------------------------------
//延时1MS子程序
---------------------------------------------------------------------------------*/
void Delay_xMs(unsigned int xMs)
{
	unsigned int i,j;
	for(i=0;i<xMs;i++)
	{
		for(j=0;j<500;j++)
		;
	}
}

/*---------------------------------------------------------------------------------
//在X,Y处显示一个16*8的西文sData (0---d)
---------------------------------------------------------------------------------*/
void Show_XW_LCD(unsigned char xPos,unsigned char yPos,unsigned char sData)	
{
	bit F;
	unsigned int nTmp;
	unsigned char j,x,y;
	x = xPos;
	y = yPos;
	nTmp = sData * 16;
	for ( j = 0;j < 16;j+=2 )
	{
		Set_xyPos_LCD(x,y);
		F = 0;
		if ( x > 60 )
			F = 1;
		LCD_Write_Data(Large_DianZen[nTmp + j],F);
		x++;
	}

	y++;
	x = xPos;
	for ( j = 1;j < 16;j+=2 )
	{
		Set_xyPos_LCD(x,y);
		F = 0;
		if ( x > 60 )
			F = 1;
		LCD_Write_Data(Large_DianZen[nTmp + j],F);
		x++;
	}
}

/*---------------------------------------------------------------------------------
//在X,Y处显示一个16*16的汉字
---------------------------------------------------------------------------------*/
void Show_HZ_LCD ( unsigned char xPos, unsigned char yPos,unsigned char sData )
{
	bit F;
	unsigned int nTmp;
	unsigned char j,x,y;
	x = xPos;
	y = yPos;
	nTmp = sData * 32;
	for ( j = 0;j < 32;j+=2 )
	{
		Set_xyPos_LCD(x,y);
		F = 0;
		if ( x > 60 )
			F = 1;
		LCD_Write_Data(HanZi[nTmp + j],F);
		x++;
	}

	y++;
	x = xPos;
	for ( j = 1;j < 32;j+=2 )
	{
		Set_xyPos_LCD(x,y);
		F = 0;
		if ( x > 60 )
			F = 1;
		LCD_Write_Data(HanZi[nTmp + j],F);
		x++;
	}
}

/*-------------------------------------------------------------------------------------
预先定义内容表为LCD_Show_Tab[]
汉字表为HanZi[]
大西文表为Large_DianZen[]
与90H的分界碰到90H则是汉字,否则是西文
--------------------------------------------------------------------------------------*/
void Print_LCD (  unsigned char xPos, unsigned char yPos,int nSentenceID )
{
	unsigned char i,j=0;
	unsigned char Temp;							//存放要显示的数据

	for(i=0;i<16;i++)
	{
		Temp=LCD_Show_Tab[nSentenceID*16+i];  	//128 16个西文
		if(Temp==0x90) 							//汉字
		{
			i++;
			Temp=LCD_Show_Tab[nSentenceID*16+i];
			Show_HZ_LCD(xPos+j,yPos,Temp);  	//write 1个汉字子程序
			j+=16;
		}
		else									//西文
		{
			Temp= LCD_Show_Tab[nSentenceID*16+i];
			Show_XW_LCD(xPos+j,yPos,Temp);  	//write 1个西文子程序
			j+=8;
		}
	}
}


/*-----------------------------------------------
LCD初始化子程序:注意12232有两片0713点阵驱动器
------------------------------------------------*/
void LCD_Init( void )
{
	LCD_ENA1 = 0;
	LCD_ENA2 = 0;
//	LCD_Write_Set( 0x00,0 );
	LCD_Write_Set( 0xE2,0 );// 0713复位
//	LCD_Write_Set( 0xAE,0 );
	LCD_Write_Set( 0xC0,0 );// 设置第0行为开始行
	LCD_Write_Set( 0xB8,0 );//设置第0页为开始页
	LCD_Write_Set( 0xA0,0 );
	LCD_Write_Set( 0xA4,0 );//关静态驱动模式设置
	LCD_Write_Set( 0xA9,0 );//选择1/32DUTY
	LCD_Write_Set( 0xEE,0 );//设置END指令
	
	LCD_Write_Set( 0xE2,1);
//	LCD_Write_Set( 0xAE,1 );
	LCD_Write_Set( 0xC0,1 );
	LCD_Write_Set( 0xB8,1 );
	LCD_Write_Set( 0xA0,1 );
	LCD_Write_Set( 0xA4,1 );
	LCD_Write_Set( 0xA9,1 );
	LCD_Write_Set( 0xEE,1 );
	LCD_Write_Set( 0xAF,0 );
	LCD_Write_Set( 0xAF,1 );
	Delay_xMs( 10 );
}


/*----------------------------------------------
主程序
功能:循环显示"电子工作室 现在是: "
------------------------------------------------*/
/*
void main()
{
	unsigned char i;
    LCD_Init();
	Clear_H_LCD( 0 );
	Clear_H_LCD( 1 );
   	while(1)
	{
		for( i = 0;i < 5 ;i+=2 )
		{
			Print_LCD ( 0,0,i );
			Print_LCD ( 0,2,i+1 );
       		Delay_xMs(500);
		}
	}
}
*/

⌨️ 快捷键说明

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