📄 lcddriver.c
字号:
/*------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 + -