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

📄 selcd.c

📁 让模拟示波器显示任意字符和图片 采用MSP430系列单片机开发
💻 C
字号:
/******************************************************************************
*                              files name SELCD.c
*说明:基于430端口的 串口128*64LCD驱动程序C文件
*FOR FYD128-64 LCD series mode
******************************************************************************/
#include <msp430x16x.h>
#include "SELCD.h"
#include "delay.h"


/***********************************************************************
** 函数名称: 	Selcd_Scl_Set_High
** 功能描述: 	串口LCD时钟线置1
** 输 入: 	无     
** 输 出:      无
** 全局变量:	无
** 调用模块: 	无
***********************************************************************/
void Selcd_Scl_Set_High(void)
{
  P6OUT |= LCDSCL;
}



/***********************************************************************
** 函数名称: 	Selcd_Scl_Set_Low
** 功能描述: 	串口时钟线置0
** 输 入: 	无     
** 输 出:      无
** 全局变量:	无
** 调用模块: 	无
***********************************************************************/
void Selcd_Scl_Set_Low(void)
{
  P6OUT &= ~LCDSCL;
}



/***********************************************************************
** 函数名称: 	Selcd_Sda_Set_High
** 功能描述: 	串口数据线置1
** 输 入: 	无     
** 输 出:      无
** 全局变量:	无
** 调用模块: 	无
***********************************************************************/
void Selcd_Sda_Set_High(void)
{
  P6OUT |= LCDSDA;
}


/***********************************************************************
** 函数名称: 	Selcd_Sda_Set_Low
** 功能描述: 	串口数据线置0
** 输 入: 	无     
** 输 出:      无
** 全局变量:	无
** 调用模块: 	无
***********************************************************************/
void Selcd_Sda_Set_Low(void)
{
  P6OUT &= ~LCDSDA;
}


/***********************************************************************
** 函数名称: 	SendByte
** 功能描述: 	向LCD发送一字节数据
** 输 入: 	unsigned char cByte  :发送的数据   
** 输 出:      无
** 全局变量:	无
** 调用模块: 	Selcd_Scl_Set_High Selcd_Scl_Set_Low
**              Selcd_Sda_Set_High Selcd_Sda_Set_Low
***********************************************************************/
void SendByte(unsigned char cByte)
{
  unsigned char ns = 0;
  unsigned char LCM_SDA;
  
  P6DIR = 0;
  P6SEL = 0;
  P6DIR |= LCDSCL;
  P6DIR |= LCDSDA;
 
  while(ns++ <8)
  {
    LCM_SDA = cByte & 0x80 ;    //移位,发送一个bit
    if(LCM_SDA ==0) 
      Selcd_Sda_Set_Low();
    else 
      Selcd_Sda_Set_High();
    cByte  = cByte<<1;
    Selcd_Scl_Set_Low();
    Selcd_Scl_Set_High() ;
  }
}


/***********************************************************************
** 函数名称: 	WriteData
** 功能描述: 	写入LCD一字节显示数据或指令
** 输 入: 	unsigned char cData : 写入数据
**              unsigned char bType : 1:写入显示数据 0:写入指令 
** 输 出:      无
** 全局变量:	无
** 调用模块: 	SendByte Delay_Us
***********************************************************************/
void WriteData(unsigned char cData, unsigned char bType)
{
	unsigned char 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);
}


/***********************************************************************
** 函数名称: 	InitLCM
** 功能描述: 	LCD启动初始化
** 输 入: 	无
** 输 出:      无
** 全局变量:	无
** 调用模块: 	Delay_Us WriteData
***********************************************************************/
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);
}


/***********************************************************************
** 函数名称: 	Display_Array
** 功能描述: 	显示一串数组数据
** 输 入: 	unsigned char * pBuf  指向显示数据的指针
**              unsigned char cNum    显示数据的字节数
**              unsigned char cAddr   显示地址
**              显示地址说明:128*64 FYD-LCD
**              第一行: 0x80--0x87
**              第二行: 0x90--0x97
**              第三行: 0x88--0x8F
**              第四行: 0x98--0x9F
** 输 出:      无
** 全局变量:	无
** 调用模块: 	WriteData
***********************************************************************/
void Display_Array(unsigned char * pBuf,unsigned char cNum,unsigned char cAddr)
{
	unsigned char n ;
	//判断是否改变当前位置
	if(cAddr!=0)
	{
		//如果cAddr不为零,则改变按cAddr改变当前位置
		WriteData(cAddr,0);
	}

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

/***********************************************************************
** 函数名称: 	MoveCursor
** 功能描述: 	移动光标
** 输 入: 	unsigned char cAddr 光标移动的目标地址
** 输 出:      无
** 全局变量:	无
** 调用模块: 	WriteData
***********************************************************************/
void MoveCursor(unsigned char cAddr)
{
	unsigned char n;
	//将光标移动到LCM起始地址
 	WriteData(0x02,0);
	n = cAddr - 0x80 ;
    while(n--)
	{ 
		WriteData(0x14,0);
	}
}


/***********************************************************************
** 函数名称: 	ClearLCD
** 功能描述: 	LCD清屏
** 输 入: 	无
** 输 出:      无
** 全局变量:	无
** 调用模块: 	WriteData
***********************************************************************/
void ClearLCD(void)
{
	WriteData(0x01,0);
}


/***********************************************************************
** 函数名称: 	OpenCursor
** 功能描述: 	打开显示光标
** 输 入: 	无
** 输 出:      无
** 全局变量:	无
** 调用模块: 	WriteData
***********************************************************************/
void OpenCursor(void)
{
	WriteData(0x0F,0);
}


/***********************************************************************
** 函数名称: 	CloseCursor
** 功能描述: 	关闭显示光标
** 输 入: 	无
** 输 出:      无
** 全局变量:	无
** 调用模块: 	WriteData
***********************************************************************/
void CloseCursor(void)
{
	WriteData(0x0C,0);
}

/***********************************************************************
** 函数名称: 	Display_Int
** 功能描述: 	在指定位置显示一个十进制数
** 输 入: 	unsigned int intnum   显示的十进制数
**              unsigned char cAddr   显示地址
** 输 出:      无
** 全局变量:	无
** 调用模块: 	Display_Array
***********************************************************************/
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);
    }
}

/***********************************************************************
** 函数名称: 	Display_Float
** 功能描述: 	在指定位置显示一个小数
** 输 入: 	float ddata   显示的小数 
**              unsinged char n 显示的小数有效数字 + 1
**              unsigned char cAddr   显示地址
** 输 出:      无
** 全局变量:	无
** 调用模块: 	Display_Array
***********************************************************************/
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);
}


/***********************************************************************
** 函数名称: 	LCD_Init
** 功能描述: 	LCD初始化
** 输 入: 	无
** 输 出:      无
** 全局变量:	无
** 调用模块: 	InitLCM ClearLCM Delay_Us CloseCursor
***********************************************************************/
void LCD_Init(void)
{
  InitLCM();
  ClearLCD();
  Delay_Us(16000);  
  //光标关闭
  CloseCursor();
}

⌨️ 快捷键说明

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