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