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

📄 lcddriver.c

📁 lcd12864驱动程序:lcd控制器st7920
💻 C
📖 第 1 页 / 共 2 页
字号:
/*------LcdDriver.c-------*/

#include "DSP28_Device.h"
#include "string.h"

//	=============液晶显示宏定义==============
#define Lcd_input 0x0FF00
#define Lcd_output 0x0FFFF

#define LCD_MuxCtrl	GpioMuxRegs.GPAMUX.all
#define LCD_DirCtrl	GpioMuxRegs.GPADIR.all
	
#define LCD_Data	GpioDataRegs.GPADAT.bit.GPIOA07//8
#define LCD_E		GpioDataRegs.GPADAT.bit.LCD_E//1
#define LCD_RWRS	GpioDataRegs.GPADAT.bit.LCD_RWRS//2
	
#define LCD_CS	GpioDataRegs.GPGDAT.bit.LCD_CS//2//2使能,3不使能
#define LCD_BGI	GpioDataRegs.GPADAT.bit.BGI//1//0使能,1不使能
#define LCD_RST	GpioDataRegs.GPADAT.bit.LCD_RST//1//0使能,1不使能

#define LCD_DIR	GpioDataRegs.GPADAT.bit.LCD_DIR//1//0使能,1不使能
	

#define LCD_Gset	50
#define	LCD_Gfult	60

//=================function==================

void LcdDelay(unsigned int Timelong) //修改时间
{
	unsigned int i;	
	Timelong=Timelong*10/5;
	for(i=0;i<Timelong;i++)i=i;//最大值为6500us	
}	


//----------------------带字库液晶显示模块lCM12864ZK

//发送一个字节
void SendByte(unsigned int dat)
{
	dat=dat&0x0FF;
	LCD_Data=dat;
}

//接收一个字节
unsigned int RecieveByte(void)
{
	unsigned int dat;
	
	dat=LCD_Data&0x00FF;
	return(dat);
}

//读取标志位BF
unsigned int ReadBF(void)
{
    unsigned int dat=0;
    

	EALLOW;
	LCD_DirCtrl=Lcd_input;
	EDIS;
    LCD_CS=0;
    LCD_DIR=0;
    
    LCD_RWRS=1;
    
    LCD_RST=1;
	LCD_E=1;
	LCD_E=1;
	
     dat=RecieveByte();
     LCD_E=1;
	LCD_E=1;
     LCD_E=0;     
     if(dat&0x80)return 1;//忙
     else return 0;
}
void Buzyloop(void)
{
	do
	{
	  LCDvarb.buzy=ReadBF();
	}while(LCDvarb.buzy);
}
//发送命令
void LCD_CMD(unsigned int cmd)
{

	Buzyloop();
		
    EALLOW;
	LCD_DirCtrl=Lcd_output;
	EDIS;
	
	LCD_CS=0;
    LCD_DIR=1;
	
    LCD_RWRS=0;
	LCD_E=1;
	LCD_E=1;
		
	SendByte(cmd); 
	LCD_E=1;
	LCD_E=1;
	LCD_E=0;
	//LcdDelay(72);


}

//基本命令============================================================***********
void LCD_Clear(void)//清屏
{
	LCD_CMD(0x1);
}

void LCD_AdRt(void)//位址归位
{
	LCD_CMD(0x2);
}
void LCD_Cursor(unsigned int Mode4)//显示状态开关
{
	if(Mode4==0)
	LCD_CMD(0x0C);
	else
	LCD_CMD(0x0F);
}
void LCD_FstAD(void)//进入点设置
{
	LCD_CMD(0x07);
}
void LCD_MoveMode(unsigned int movemode)//游标或显示移位控制
{
	switch (movemode)
				{
					case 0:LCD_CMD(0x10);
					break;
					case 1:LCD_CMD(0x14);
					break;
					case 2:LCD_CMD(0x18);
					break;
					case 3:LCD_CMD(0x1C);
					break;
				}
}
void LCD_Function(unsigned int RE)//功能设定
 {
	if(RE==0)
		LCD_CMD(0x30);	//基本指令集
	else
		LCD_CMD(0x34);	//扩展指令集
}
void LCD_CgramAdd(unsigned int cgramadd)//设定CGRAM位址(造字功能)
{
	cgramadd=(cgramadd&0x7F)|0x40;
	LCD_CMD(cgramadd);
}
void LCD_DdramAdd(unsigned int ddramadd)//设定DDRAM位址(显示功能)
{
	ddramadd=ddramadd|0x80;
	LCD_CMD(ddramadd);
}

//扩充指令--------------------------------------------------------------
void LCD_Function2(unsigned int REaddGmode)//功能设定及绘图显示控制
{	unsigned int Re,Gmode;
	Re=REaddGmode&0x0F0;
	Gmode=REaddGmode&0x0F;
	if(Re==0)//基本指令集
	{
		if(Gmode==0)
		LCD_CMD(0x30);
		else
		LCD_CMD(0x32);	
		
		
	}
	else//扩展指令集
	{
		if(Gmode==0)
		LCD_CMD(0x34);
		else
		LCD_CMD(0x36);	
		
	}
		
}
void LCD_Hult(void)//待命模式
{
	LCD_Function(1);
	LCD_CMD(0x01);
	LCD_Function2(0x01);
	
}
void LCD_SetAdd(unsigned int mode1)//卷动位址或RAM位址选择
{
	LCD_Function(1);
	if(mode1==0)
		LCD_CMD(0x2);	//允许输入RAM位址(扩充:IRAM;基本:CGRAM)
	else
		LCD_CMD(0x3);	//允许输入卷动位址
	LCD_Function2(0x01);
}
void LCD_Invert1(unsigned int row1)//反白测试函数:无用
{
	LCD_Function(1);
	switch (row1)
		{
			case 1:LCD_CMD(0x4);
			break;
			case 2:LCD_CMD(0x5);
			break;
			case 3:LCD_CMD(0x6);
			break;
			case 4:LCD_CMD(0x7);
			break;
		}
	LCD_Function2(0x01);	
}

void LCD_Wait(unsigned int wait1)//睡眠模式
{
	LCD_Function(1);
	if(wait1==0)
		LCD_CMD(0x8);	//进入睡眠
	else
		LCD_CMD(0x0C);	//脱离睡眠
	LCD_Function2(0x01);
}
void LCD_IramAdd(unsigned int iramadd)//设定IRAM位址或卷动位址
{
	LCD_Function(1);
	iramadd=iramadd|0x40;
	LCD_CMD(iramadd);
	LCD_Function2(0x01);
}

void LCD_GdramAdd(unsigned int gdramadd)//设定GDRAM位址
{
	gdramadd=gdramadd|0x80;
	LCD_CMD(gdramadd);
}


//*/*******************************************************************************/
//向lcd发送数据

void SendLcdDat(unsigned int dat)
{

	Buzyloop();      //???????????????????????????
	
	EALLOW;
	LCD_DirCtrl=Lcd_output;
	EDIS;
	LCD_CS=0;
    LCD_DIR=1;
	

    LCD_RWRS=2;
	LCD_E=1;
	LCD_E=1;

	SendByte(dat);
	LCD_E=1;
	LCD_E=1;
	LCD_E=0;
//	LcdDelay(72);
		
}

unsigned int RecieveLcdDat(void)
{
    unsigned int dat;
    
	Buzyloop();      //???????????????????????????

	EALLOW;
	LCD_DirCtrl=Lcd_input;
	EDIS;
	
	LCD_CS=0;
    LCD_DIR=0;
	

    LCD_RWRS=3;
	LCD_E=1;
	LCD_E=1;	
	dat=RecieveByte();
	LCD_E=1;
	LCD_E=1;
	LCD_E=0;
	//LcdDelay(72);	 
	
	return(dat);
}

void LCD_DramRD(unsigned int Daddr,unsigned int *pstr,unsigned int n)
{
	unsigned int i;
	LCD_DdramAdd(Daddr);
	*pstr=RecieveLcdDat();
	for(i=0;i<n;i++)
	{
	   *(pstr+i)=RecieveLcdDat();
	}
}

void  Display(char *ptr,unsigned int ddram )
{
	unsigned int Length,Num,LcdFlag;
	Length=0;
	if(ddram<0x88)
	 {LCDvarb.lcd_hang=0;}		//定位行地址:第一行
	else if(ddram<0x90)
	 {LCDvarb.lcd_hang=2;}		//定位行地址:第三行
	else if(ddram<0x98)
	 {LCDvarb.lcd_hang=1;}		//定位行地址:第二行
	else 
	 {LCDvarb.lcd_hang=3;}		//定位行地址:第四行
	
	LCDvarb.lcd_lie=0x0F&ddram; 	//定位列地址
	
	if(LCDvarb.lcd_lie>0x07)
	  { 
		LCDvarb.lcd_lie=LCDvarb.lcd_lie-0x08;
	  }
	LcdFlag=LCDvarb.lcd_lie*2;
	LCD_Function(0);
	LCD_CMD(ddram); // 定位显示起始地址
	while ((ptr[Length])!='\0')
	{Length++;}
	
	for (Num=0;Num<Length;Num++)
	{ 
			SendLcdDat(ptr[Num]); //输出单个字符
			LcdFlag++;
		   if (LcdFlag ==0x10)
		    { 
			    LcdFlag=0;
				LCDvarb.lcd_hang++;
				switch (LCDvarb.lcd_hang)
				{
					case 0:LCD_CMD(0x80);
					break;
					case 1:LCD_CMD(0x90);
					break;
					case 2:LCD_CMD(0x88);
					break;
					case 3:LCD_CMD(0x98);
					break;
				}
				if (LCDvarb.lcd_hang>3)
				{
					LCD_CMD(0x80);
					LCDvarb.lcd_hang=0;
				}
		    }
	}
}
void LCD_FgOn(void)
{
	
	unsigned int i,j;
	LCD_Function(1); //选择扩充功能
	LCD_Function2(0x10);
	
	LCD_GdramAdd(0x0);
	LCD_GdramAdd(0x0);
	
   for(j=0;j<=32;j++)
	{
		for(i=0;i<=15;i++) 
			{
				SendLcdDat(0x0FF);//写入高8位数据
				SendLcdDat(0x0FF);//写入低8位数据
			}
		if(j<=32)
		{
		  LCD_GdramAdd(j);
		  LCD_GdramAdd(0x0);
		}
	}	
	
	LCD_Function2(0x11);
	LCD_Function2(0x01);
}

void LCD_FgClear(void)
{
	
	unsigned int i,j;
	LCD_Function(1);   //选择扩充功能
	LCD_Function2(0x10);
	LCD_GdramAdd(0x0);
	LCD_GdramAdd(0x0);
					
   for(j=0;j<=32;j++)
	{
		for(i=0;i<=15;i++) 
			{
				SendLcdDat(0x00);//写入高8位数据
				SendLcdDat(0x00);//写入低8位数据
			}
		if(j<=32)
		{
		  LCD_GdramAdd(j);
		  LCD_GdramAdd(0x0);
		}

	}	
	
	LCD_Function2(0x11);
	LCD_Function2(0x01);
}

void LCD_FgRow(unsigned int Ghang,unsigned int FigMode)
{
	
	unsigned int i,j,xteam;
	
	LCD_Function(1); //选择扩充功能
	LCD_Function2(0x10);
	switch (Ghang)
				{
					case 1:LCD_GdramAdd(0x0);
							LCD_GdramAdd(0x0);
							xteam=0x00+1;
							break;
					case 2:LCD_GdramAdd(0x10);
							LCD_GdramAdd(0x0);
							xteam=0x10+1;
							break;
					case 3:LCD_GdramAdd(0x0);
						   LCD_GdramAdd(0x8);
							xteam=0x00+1;
							break;
					case 4:LCD_GdramAdd(0x10);
							LCD_GdramAdd(0x8);
							xteam=0x10+1;
							break;
					default:return;
				
				}
				
	if(FigMode==1)
		FigMode=0x0FF;
if((Ghang==1)||(Ghang==2))
	{		
	   
	    for(j=0;j<=15;j++)
		{
			for(i=0;i<=7;i++) 

⌨️ 快捷键说明

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