📄 selcd.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 + -