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

📄 lcd12864.c

📁 用AVR单片机对LCD12864液晶操作源程序
💻 C
字号:
//******************************************************************************/
//**
//** 模 块 名: -------------------lcd12864.C----------------------------------
//**            -----------------12864液晶显示模块----------------------------*/
//** 功能描述: 
//**
//** 创 建 人: LXJ(xingyusky)   	日期:2008-4-7   */
//** 修 改 人:                 	        日期:2008-4-7    */ 
//** 其他说明: 
//******************************************************************************/


#include<avr/io.h>
#include"type.h"
#include <string.h> 
#include <util/delay.h>
#include <stdio.h>
#include <avr\pgmspace.h>
#include"zimo_code.h"
#include"lcd12864.h"

//********************************************************
// 判忙函数

//读状态:输入:D/I=L,CS1或CS2=H,R/W=H,E=H 输出:D0--D7=状态字
//********************************************************
void Is_lcd12864_busy(UCHAR right)
{
	
	LCD12864_DataPort_DIR=0X00;   
	LCD12864_DataPort=0xff;
	CLR_LCD_EN;
	_delay_us(2);
	CLR_LCD_DI;
   	_delay_us(1);
	if(1==right)
	 {
		CLR_LCD_CS1;
		SET_LCD_CS2;
		
	 }
	else //左半平面 
	{
		
		SET_LCD_CS1;
		CLR_LCD_CS2;
	}
	SET_LCD_RW;
	_delay_us(1);
    SET_LCD_EN;
	_delay_us(2); 
	while(LCD12864_IP_DataPort & BUSY);
//	{
//	DDRA=0XFF;
//	PORTA=0XFF;
//	}
	CLR_LCD_EN;
	_delay_us(100);
//	PORTA=0X00;
	LCD12864_DataPort_DIR=0XFF;
}
//********************************************************
// 写控制志
//写控制志:输入:D/I=L,CS1或CS2=H,R/W=L,E=H D0--D7=指令码,E=L
//********************************************************
void Write_lcd12864_Order(UCHAR order,UCHAR right)
{
	
	Is_lcd12864_busy(right);
	CLR_LCD_EN;
	_delay_us(2); 
    CLR_LCD_DI;
	_delay_us(1);
    CLR_LCD_RW;
	_delay_us(1);
	LCD12864_DataPort=order;
    SET_LCD_EN;
	 _delay_us(2);  
	CLR_LCD_EN;
	 _delay_us(2); 
//order=
		//0x3e//显示开/关	 //on=on|3e	 (0——1)						
		//0xc0//起始行地址为0//x=x|c0    (0——63)
		//0xb8//起始页地址为0//ye=ye|b8  (0——7)
		//0x40//起始列地址为0//y=y|40   (0——63)	
}

//********************************************************
// 写数据
//写数据:输入:D/I=H,CS1或CS2=H,R/W=L,E=H D0--D7=数据,E=L
//********************************************************
void Write_lcd12864_Data(/*字号设置*/UCHAR H /*X*/,UCHAR L,/*页设置*/UCHAR page,/*列设置*/UCHAR y,/*显示内容设置*/char  hz[],/*左右半屏设置*/UCHAR right)
{
	UCHAR i,ki,j;
	UCHAR len;
	 UINT k;
	 char *p1;
	
	
	
//**************************************************************	
	

len=strlen(hz);	 	//取输入字符串的长度									
if(8>=H)			//判断字体大小
for(ki=0;ki<len;ki++)
{
   p1=&hz[ki];								//取出传送的字符(一个一个的取)				  

//*************************************************************
switch(H)					  
{
	//*************************************************************	
  case 5:									 //5*8
	 {
	for(k=0;k<sizeof(ASC_5)/sizeof(ASC_5[0]);k++)		 //取出字库的长度
	{
		 												 //找出对应字符
		if(p1[0] == ASC_5[k].Index[0] )					 
		
			break;
	}
	
	for(i=0;i<L/8;i++)									 //从第一页写
	{
		Write_lcd12864_Order( (page+i)|0xb8,right);
		Write_lcd12864_Order((y+ki*8)|0x40,right);
		
		
		for(j=0;j<H;j++)								 //写行
		{
		
			Is_lcd12864_busy(right);
			CLR_LCD_EN;
			_delay_us(2);
    		SET_LCD_DI;
			_delay_us(1);
    		CLR_LCD_RW;
			_delay_us(1);
		LCD12864_DataPort=ASC_5[k].Msk[H*i+j];


    		SET_LCD_EN; 
			_delay_us(2);
			CLR_LCD_EN;
			_delay_us(2);
		}
	   
	}
	break;
	}	 
//********************************************************
   case 8:
	 {
	for(k=0;k<sizeof(ASC_8)/sizeof(ASC_8[0]);k++)
	{
		 
		if(p1[0] == ASC_8[k].Index[0] )
		
			break;
	}
	
	for(i=0;i<L/8;i++)
	{
		Write_lcd12864_Order( (page+i)|0xb8,right);
		Write_lcd12864_Order((y+ki*8)|0x40,right);
		
		
		for(j=0;j<H;j++)
		{
		
			Is_lcd12864_busy(right);
			CLR_LCD_EN;
			_delay_us(2);
    		SET_LCD_DI;
			_delay_us(1);
    		CLR_LCD_RW;
			_delay_us(1);
		LCD12864_DataPort=ASC_8[k].Msk[H*i+j];


    		SET_LCD_EN;
			_delay_us(2);
			CLR_LCD_EN;
			_delay_us(2);
		}
	   
	}
	break;
	}
}
}
	 
//********************************************************	
else

for(ki=0;ki<len;ki=ki+2)	  
{
   p1=&hz[ki];
//*************************************************************
switch(H)					  
{					  

	
//*************************************************************	
   case 12:
	{

	for(k=0;k<sizeof(GB_12)/sizeof(GB_12[0]);k++)
	{
		 
		if(p1[0] == GB_12[k].Index[0] && p1[1] == GB_12[k].Index[1])
		
			break;
	}
	
	for(i=0;i<L/8;i++)
	{
		Write_lcd12864_Order( (page+i)|0xb8,right);
		Write_lcd12864_Order((y+ki*8)|0x40,right);
		
		for(j=0;j<H;j++)
		{
		
			Is_lcd12864_busy(right);
			CLR_LCD_EN;
			_delay_us(2);
    		SET_LCD_DI;
			_delay_us(1);
    		CLR_LCD_RW;
			_delay_us(1);
    	
		LCD12864_DataPort=GB_12[k].Msk[H*i+j];


    		SET_LCD_EN;
			_delay_us(2); 
			CLR_LCD_EN;
			_delay_us(2);
		}
	   
	}
	break;
	}
//********************************************************
    case 16:
	 {
	for(k=0;k<sizeof(GB_16)/sizeof(GB_16[0]);k++)
	{
		 
		if(p1[0] == GB_16[k].Index[0] && p1[1] == GB_16[k].Index[1])
		
			break;
	}
	
	for(i=0;i<L/8;i++)
	{
		Write_lcd12864_Order((page+i)|0xb8,right);
		Write_lcd12864_Order((y+ki*8)|0x40,right);
		
		
		for(j=0;j<H;j++)
		{
		
			Is_lcd12864_busy(right);
			CLR_LCD_EN;
			_delay_us(2);
    		SET_LCD_DI;
			_delay_us(1);
    		CLR_LCD_RW;
			_delay_us(1);
    	
			
		LCD12864_DataPort=GB_16[k].Msk[H*i+j];


    		SET_LCD_EN;
			_delay_us(2);	
			CLR_LCD_EN;
			_delay_us(2);
		}
	   
	}
	break;
	}
	//********************************************************
case 100:
	 {
	for(k=0;k<sizeof(TU_48)/sizeof(TU_48[0]);k++)
	{
		 
		if(p1[0] == TU_48[k].Index[0] && p1[1] == TU_48[k].Index[1])
		
			break;
	}
	
	 //CLR_LCD_CS1;
	 //SET_LCD_CS2;
	for(i=0;i<L/8;i++)
	{
		Write_lcd12864_Order( (page+i)|0xb8,0);
		Write_lcd12864_Order((y+ki*8)|0x40,0);
		
		
		for(j=0;j<H/2+6;j++)
		{
		
			Is_lcd12864_busy(0);
			CLR_LCD_EN;
			_delay_us(2);
    		SET_LCD_DI;
			_delay_us(1);
    		CLR_LCD_RW;
			_delay_us(1);
		
		LCD12864_DataPort=TU_48[k].Msk[H*i+j];


    		SET_LCD_EN; 
			_delay_us(2);
			CLR_LCD_EN;
			_delay_us(2);
		}
	   
	}
	//***************************************************
	 //  	SET_LCD_CS1;
	//	CLR_LCD_CS2;
	for(i=0;i<L/8;i++)
	{
		Write_lcd12864_Order( (page+i)|0xb8,1);
		Write_lcd12864_Order((y+ki*8)|0x40,1);
		
		
		for(j=H/2+6;j<H;j++)
		{
		
			Is_lcd12864_busy(1);
			CLR_LCD_EN;
			_delay_us(2);
    		SET_LCD_DI;
			_delay_us(1);
    		CLR_LCD_RW;
			_delay_us(1);
		
		LCD12864_DataPort=TU_48[k].Msk[H*i+j];


    		SET_LCD_EN;
			_delay_us(2);
			CLR_LCD_EN;
			_delay_us(2);
		}
	   
	}
	break;
	}
//*********************************************************
case 128:
	 {
	for(k=0;k<sizeof(TU_64)/sizeof(TU_64[0]);k++)
	{
		 
		if(p1[0] == TU_64[k].Index[0] && p1[1] == TU_64[k].Index[1])
		
			break;
	}
	
	 //CLR_LCD_CS1;
	 //SET_LCD_CS2;
	for(i=0;i<L/8;i++)
	{
		Write_lcd12864_Order((page+i)|0xb8,0);
		Write_lcd12864_Order((y+ki*8)|0x40,0);
		
	
		for(j=0;j<H/2;j++)
		{
		
			Is_lcd12864_busy(0);
			CLR_LCD_EN;
			_delay_us(2);
    		SET_LCD_DI;
			_delay_us(1);
    		CLR_LCD_RW;
			_delay_us(1);
		
		LCD12864_DataPort=TU_64[k].Msk[H*i+j];


    		SET_LCD_EN;
			_delay_us(2);
			CLR_LCD_EN;
			_delay_us(2);
		}
	   
	}
	//***************************************************
	  // 	SET_LCD_CS1;
	//	CLR_LCD_CS2;
	for(i=0;i<L/8;i++)
	{
		Write_lcd12864_Order( (page+i)|0xb8,1);
		Write_lcd12864_Order((y+ki*8)|0x40,1);
		
		
		for(j=H/2;j<H;j++)
		{
		
			Is_lcd12864_busy(1);
			CLR_LCD_EN;
			_delay_us(2);
    		SET_LCD_DI;
			_delay_us(1);
    		CLR_LCD_RW;
			_delay_us(1);
		
		LCD12864_DataPort=TU_64[k].Msk[H*i+j];


    		SET_LCD_EN;
			_delay_us(2);
			CLR_LCD_EN;
			_delay_us(2);
		}
	   
	}
	break;
	}
//********************************************************
}
}
}	
//********************************************************

//********************************************************
// //清屏
//********************************************************
void Clearscreen(UCHAR right)
   
{
	UCHAR j,k;
//清半屏幕
	for(k=0;k<8;k++)
	{
		Write_lcd12864_Order( k|0xb8,right);
		Write_lcd12864_Order(0x40,right);
	
		for(j=0;j<64;j++)
		{
			
			Is_lcd12864_busy(right);
			CLR_LCD_EN;
			_delay_us (2);
    		SET_LCD_DI;
			_delay_us(1);
    		CLR_LCD_RW;
			_delay_us(1);
			LCD12864_DataPort_DIR=0XFF;
    		LCD12864_DataPort=0x00;
    		SET_LCD_EN;
			_delay_us (2);
			CLR_LCD_EN;
			_delay_us (2);
		}
	}
/*
//清左半屏幕
	for(k=0;k<8;k++)
	{
		Write_lcd12864_Order( k|0xb8);
		Write_lcd12864_Order(0x40);
		for(j=0;j<64;j++)
		{
	    	//CLR_LCD_CS1;
			//SET_LCD_CS2;
	
			Is_lcd12864_busy(0);
			//CLR_LCD_EN;
			//_delay_us (100);
    		SET_LCD_DI;
			_delay_us(10);
    		CLR_LCD_RW;
			_delay_us(10);
			LCD12864_DataPort=0x00;
    		SET_LCD_EN;
			_delay_us (100);
			CLR_LCD_EN;
			_delay_us (100);
		}
	}
*/
}
//********************************************************
 //LCD12864初始化
//********************************************************
void Lcd12864_Init(void)
{
	Write_lcd12864_Order(0x3f,0);
	Write_lcd12864_Order(0x3f,1);
	Write_lcd12864_Order(0x0c,0);
	Write_lcd12864_Order(0x0c,1);
	Write_lcd12864_Order(0xc0,0);
	Write_lcd12864_Order(0xc0,1);
	Write_lcd12864_Order(0xb8,0);
	Write_lcd12864_Order(0xb8,1);
	Write_lcd12864_Order(0x40,0);
	Write_lcd12864_Order(0x40,1);
	Write_lcd12864_Order(0x0c,0);
	Write_lcd12864_Order(0x0c,1);
	Clearscreen(0);
	Clearscreen(1);
//	BAKLight=0;
	//Write_lcd12864_Order(;);	
}

/*******************************************************************************
****                              End Of File
*******************************************************************************/

⌨️ 快捷键说明

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