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

📄 selcd.h

📁 基于430单片机 128*64 LCD 驱动程序(串口)
💻 H
字号:
//*****************************************************************************//
//**********************************SELCD.H*************************************//
//USED FOR FYD128-64 LCD series mode
//


#ifndef __SELCD_H__
#define __SELCD_H__
#define unint  unsigned int
#define unchar unsigned char
#define LCM_DELAY_TIME 70   //1624us
#define DELAY1 250
#define LCM_INIT_TIME  280   //6424us
//LCM接口  
//sbit LCM_SDA = P6.1 ;
//sbit LCM_SCL = P6.0 ;
unsigned char bcd_int[];


//*****************************************************************************

//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//----------------------------------以下是LCM显示功能---------------------------
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------

//*****************************************************************************
//功//8M晶振,毫秒延时,如用12M晶振,则nCount=(2667*8)/12;
extern void Delay_ms(unsigned long unTime);
//微秒延时
extern void Delay_us(unsigned long uTime);
//*****************************************************************************

//*****************************************************************************
//功能说明:把传入的数据发送给LCM,使用P1.0,P1.1
extern void SendByte(unsigned char cByte);
//*****************************************************************************

//*****************************************************************************
//写入指令或者数据
extern void WriteData(unsigned char cData,unsigned char bType);
//*****************************************************************************

//*****************************************************************************
//液晶模块初始化
extern void InitLCM(void);
//*****************************************************************************

//功能说明: 将输入的字符串显示在LCM的指定位置
extern void Display_Array(unchar * pBuf,unchar cNum,unchar cAddr);
//*****************************************************************************

//*****************************************************************************
//根据指定位置移动光标
extern void MoveCursor(unchar cAddr);

//*****************************************************************************
//清屏
extern void ClearLCM(void);

//*****************************************************************************
//打开LCM的光标显示
extern void OpenCursor(void);

//*****************************************************************************
//关闭LCM的光标显示
extern void CloseCursor(void);

//*****************************************************************************
//在指定位置显示整数
extern void Display_Int(unsigned int intnum,unsigned char addr);

//*****************************************************************************
//在指定位置显示小数
extern void Display_Float(float ddata, unsigned char n,unsigned char addr);

//****************************************************************************
//启动LCD
extern void LCD_Init(void);

//8M晶振,毫秒延时,如用12M晶振,则nCount=(2667*8)/12;
void Delay_ms(unsigned long unTime)
{
  unsigned long nCount;
  int i;
  unsigned long j;
  nCount=2667;
  for(i=unTime;i>0;i--)
  {
    for(j=nCount;j>0;j--);
  }
  return;
}


//微秒延时
void Delay_us(unsigned long unTime)
{
  int nCount;
  unsigned long i;
  int j;
  nCount=3;
  for(i=unTime;i>0;i--)
  {
    for(j=nCount;j>0;j--);
  }
  return;
}

//*****************************************************************************
//发送数据
//模块输入:向LCM发送八位数据
//模块输出:无
//功能说明:把传入的数据发送给LCM,使用P1.0,P1.1
void SendByte(unsigned char cByte)
{
  unchar ns = 0;
  unchar LCM_SDA;
  
  P6DIR = 0;
  P6SEL = 0;
  P6DIR |= BIT0;
  P6DIR |= BIT1;
 
  while(ns++ <8)
  {
    //移位,发送一个bit
    LCM_SDA = cByte & 0x80 ;
    if(LCM_SDA ==0) P6OUT &= ~BIT1;
    else P6OUT |= BIT1;
    cByte  = cByte<<1;
    P6OUT &= ~BIT0 ;
   // Delay_us(LCM_DELAY_TIME);
    P6OUT |= BIT0 ;

  }
  return ;
}
//*****************************************************************************

//*****************************************************************************
//写入指令或者数据
//模块输入:cData 要写入LCM的数据?????不能超过3字节?
//			bType 数据的种类:0 为 指令,1 为数据
/*                    注:这里bType虽是unsigned char内型,但只能取两个值:0,1*/
//模块输出;无
//模块说明:发送一字节的数据或指令(物理实现上是发送的三字节)
//			第一字节是让LCM识别是指令还是数据0xF8 为指令(1111 1000)
//                               0xFA 为数据(1111 1010)
//			第二字节为所发送指令或数据的高4位+0000
// 			第三字节为所发送指令或数据的低4位+0000
void WriteData(unsigned char cData, unsigned char bType)
{
	unchar cSendByte ;
	//发送第一字节
	if(bType == 0)
		cSendByte = 0xF8 ;    	        //发送指令
	else
		cSendByte = 0xFA ;		//发送数据
	SendByte(cSendByte);
	Delay_us(LCM_DELAY_TIME);

	//发送第二字节
	cSendByte = cData & 0xF0 ;
	SendByte(cSendByte);
	Delay_us(LCM_DELAY_TIME);

	//发送第三字节
	cSendByte = cData << 4 ;
	SendByte(cSendByte);
	Delay_us(LCM_DELAY_TIME);
}
//*****************************************************************************

//*****************************************************************************
//液晶模块初始化
void InitLCM(void)
{
	Delay_us(DELAY1) ;
	WriteData(0x30,0);
	Delay_us(LCM_DELAY_TIME) ;

	WriteData(0x0C,0);
	Delay_us(LCM_DELAY_TIME) ;

	WriteData(0x01,0);
	Delay_us(LCM_DELAY_TIME) ;

	WriteData(0x06,0);
}
//*****************************************************************************

//*****************************************************************************
//显示模块
//模块输入:pBuf  指向所需显示字符串的指针
//	        cNum  所需显示字符的个数,一个中文字符按两个算
//		cAddr 字符串在LCM显示的初始地址,如果为 0 表示不改变当前位置
//模块输出: 无
//功能说明: 将输入的字符串显示在LCM的指定位置
void Display_Array(unchar * pBuf,unchar cNum,unchar cAddr)
{
	unchar n ;
	//判断是否改变当前位置
	if(cAddr!=0)
	{
		//如果cAddr不为零,则改变按cAddr改变当前位置
		WriteData(cAddr,0);
	}

	for(n=0;n<cNum;n++)
	{
		WriteData(pBuf[n],1);
	}
}
//*****************************************************************************

//*****************************************************************************
//移动LCM的光标
//模块输入: 光标将要移动到的位置
//模块输出: 无
//模块说明: 将LCM光标移动到指定位置
void MoveCursor(unchar cAddr)
{
	unchar n;
	//将光标移动到LCM起始地址
 	WriteData(0x02,0);
	n = cAddr - 0x80 ;
    while(n--)
	{ 
		WriteData(0x14,0);
	}
}


//*****************************************************************************
//清屏
//模块输入: 无
//模块输出: 无
//模块说明: 调用此函数清除LCM上所有显示,并且光标回到起始位置
void ClearLCM(void)
{
	WriteData(0x01,0);
}

//*****************************************************************************
//打开LCM的光标显示
//模块输入: 无
//模块输出: 无
//模块说明: 打开LCM的光标
void OpenCursor(void)
{
	WriteData(0x0F,0);
}

//*****************************************************************************
//关闭LCM的光标显示
//模块输入: 无
//模块输出: 无
//模块说明: 关闭LCM的光标
void CloseCursor(void)
{
	WriteData(0x0C,0);
}


//*****************************************************************************
//在addr处 显示整数 intnum
void  Display_Int(unsigned int intnum,unsigned char addr)
{

    unsigned char i=0,n;
    unsigned char  temp[12],temp1[12];
    unsigned long data1 = intnum;
    unsigned int odd;
    if(data1==0)
    {
        temp[0] = 0x30;
        i++;
    }
    while(data1>0)
    {
        temp[i]=data1%10 + 0x30;
        data1 /= 10;
        i++;
    }

      n = i;
    for(i = 0;i < n;i++)
      temp1[11 - i] = temp[i];
    for(i = 0;i < n;i++)
      temp[i] = temp1[12 - n + i];
    odd = (n%2);
    if(odd == 0)
      Display_Array(temp,n,addr);
    if(odd == 1)
    {
      temp[n] = 0x20;
      Display_Array(temp,n + 1,addr);
    }
}

//*****************************************************************************
//在addr处 显示小数 ddata 有效数字n位
void Display_Float(float ddata, unsigned char n,unsigned char addr)
{
   
    unsigned char i=0,intlength;
    unsigned char temp[12],temp1[12];
    unsigned int intpart;
    float fracpart;

    intpart=(int)ddata;fracpart=ddata-intpart;
    while(intpart>0)
    {
        temp[i]=intpart%10+48;
        intpart/=10;
        i++;
    }
    intlength=i;
    temp[i]='.';i++;

    fracpart*=10;
    for(;i<=n;i++)
    {
        temp[i]=(int)fracpart+48;
        fracpart-=(int)fracpart;
        fracpart*=10;
    }

    for(i=0;i<intlength;i++)
      temp1[11-i]=temp[i];
    for(i=0;i<intlength;i++)
      temp[i]=temp1[12-intlength+i];
    Display_Array(temp,n,addr);
}

void LCD_Init(void)
{
  InitLCM();
  ClearLCM();
  Delay_us(16000);  
  //光标关闭
  CloseCursor();
}

#endif

⌨️ 快捷键说明

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