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

📄 lcd12232.c

📁 在89C51上操作小型LCD,显示汉字,字符和图案,字库放在EEPROM
💻 C
字号:
#define E2 P3_5
#define E1 P3_6

#define A0 P3_7 
#define DATA P2 

/*----------------------------------------------------------------------------
调用方式:void OutMI(uchar i)
函数说明:发指令i到主窗口。(内函数,私有,用户不直接调用)
------------------------------------------------------------------------------*/
void OutMI(uchar i)
{
	E1=1;_nop_();_nop_(); 
	A0=0;_nop_();_nop_();
	DATA=i;_nop_();_nop_();
	E1=0;_nop_();_nop_();
}
/*------------------------------------------------------------------------------
--
调用方式:void OutMD(uchar i)
函数说明:发数据i到主窗口。(内函数,私有,用户不直接调用)
--------------------------------------------------------------------------------
-*/
void OutMD(uchar i)
{
	E1=1;_nop_();_nop_();
	A0=1;_nop_();_nop_();
	DATA=i;_nop_();_nop_();
	E1=0;_nop_();_nop_();
}
/*------------------------------------------------------------------------------
--
调用方式:void OutSI(uchar i)
函数说明:发指令i到从窗口。(内函数,私有,用户不直接调用)
--------------------------------------------------------------------------------
-*/
void OutSI(uchar i)
{
	A0=0;_nop_();_nop_();
	E2=1;_nop_();_nop_();
	DATA=i;_nop_();_nop_();
	E2=0;_nop_();_nop_();
}

/*------------------------------------------------------------------------------
--
调用方式:void OutSD(uchar i)
函数说明:发数据i到从窗口。(内函数,私有,用户不直接调用)
--------------------------------------------------------------------------------
-*/
void OutSD(uchar i)
{
	A0=1;_nop_();_nop_();
	E2=1;_nop_();_nop_();
	DATA=i;_nop_();_nop_();
	E2=0;_nop_();_nop_();
}

/*------------------------------------------------------------------------------
--
调用方式:void LcdIni(void)
函数说明:12232点阵液晶初始化,开机后仅调用一次。
--------------------------------------------------------------------------------
-*/
void LcdIni(void)
{
	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);
} 

/*------------------------------------------------------------------------------
--
调用方式:void SetPage(uchar page0,uchar page1)
函数说明:同时设置主从显示页为0-3页。(内函数,私有,用户不直接调用)
--------------------------------------------------------------------------------
-*/
void SetPage(uchar page0,uchar page1)
{
	OutMI(0xB8|page1);OutSI(0xB8|page0);
}

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

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

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

/*------------------------------------------------------------------------------
--
调用方式:void DrawBmp(uchar x,bit layer,uchar width,uchar *bmp)
函数说明:画一个图,横坐标是x,layer表示上下层,width是图形的宽,高都是16,bmp是
图形指针
          使用zimo21软件,采用纵向取模得到bmp数据。
--------------------------------------------------------------------------------
-*/
void DrawBmp(uchar x0,bit layer,uchar width,uchar *bmp)
{
	uchar x,address,i=0;     //address表示显存的物理地址
	uchar page=0;
	bit window=0;  //page表示上下两页,window表示左右两页
	if (layer) page=2;
	
	for (x=x0;x<x0+width;x++)
	{
	if (x>60) {window=1;address=x%61;}
	else address=x;
	
	SetPage(page,page);
	SetAddress(address,address);
	
	if (window) PutChar1(bmp[i]);
	   else PutChar0(bmp[i]);//画上层
	
	SetPage(page+1,page+1);
	SetAddress(address,address);
	
	if (window) PutChar1(bmp[i+width]);
	           else PutChar0(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++){
			PutChar0(0);
			PutChar1(0);
		}
	}
} 
·	急!板注:我用了你的源代码,可是他是在左右屏同时显示一样的字符的,我只想显示一屏,怎么修改? [keilc51] [7次] 01-9-10 上午 11:46:28 
·	检查cs信号(E1,E2)的处理,你可能把左右两块同时打开了? [晓奇] [1次] 01-9-10 下午 12:39:26 
·	在每个子函数里,E1,E2选中后都会关掉,应该不会是这个问题吧。 [keilc51] [4次] 01-9-10 下午 02:42:44 
·	可能是什么问题呢?谁能看看龙版注的程序? [keilc51] [2次] 01-9-10 下午 06:03:41 
·	我可没有在左右屏同时显示一样的字符,你是不是在硬件上把两个片选E1/E2接一起了? [龙啸九天] [2次] 01-9-10 下午 09:23:51 
·	没有呀,如果我要显示超过4个汉字时(16*16),右边屏的汉字同时会在左屏显示,而且把左屏原来的汉字覆盖了。 [keilc51] [4次] 01-9-11 上午 09:33:01 
·	以下是我的主程序,再请大虾帮我看一下: [keilc51] [30次] 01-9-12 上午 10:18:37 
void main()
{
	 uint j;
	 LcdIni(); //reset
	 clrscr(); //
	 for(j=0;j<6;j++)
	   DrawBmp(16*j,0,16,table+32*j); //table为字模表格首址,显示六个汉字
	 while (1);
} 

⌨️ 快捷键说明

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