📄 lcd.c
字号:
/**********************************************************************************
Copyright(C)桂林电子科技大学电子工程系科技协会
All right reserved
文 件 名:lcd.c
**********************************************************************************/
#include "lcd.h"
//////////////////////////////////////////////////////////////////////////////////
//本文件的私有函数,外部不可调用
bool LCDisBusy();
bool SendToLCD(uchar dataType,uchar val) ;
uchar LCDInfo();
void SendByteToLCD(uchar data1);
uchar GetByteFromLCD();
/////////////////////////////////////////////////////////////////////////////////
//初始化TS12864A液晶
void InitLCD()
{
SendToLCD(FUNCTION, CMD);
SendToLCD(DISPLAY_ON_OFF, CMD);
SendToLCD(ENTRY_MODE, CMD);
EraseLCD();
}
/*********************************************************************
函数名称: EraseLCD()
函数功能: 清屏
输入参数: 无
输出参数: 无
返回值: 无
*********************************************************************/
void EraseLCD()
{
uint timeout = 0x0aff;
SendToLCD(0x01, CMD);
while (timeout--);
}
/*********************************************************************
函数名称: SendByteToLCD()
函数功能: 把一字节发送到LCD
输入参数: data: 要发送的字节
输出参数: 无
返回值: 无
*********************************************************************/
void SendByteToLCD(uchar data1)
{
uchar i;
LCD_CS=1;//
for (i = 0; i < 8; i++)//从高到低传送8位数据
{
if (data1 & 0x80)
{
LCD_SDA=1;
}
else
{
LCD_SDA=0;
}
LCD_CLK=1;
LCD_CLK=0;
data1 <<= 1;
}
LCD_CS=0;
}
/*********************************************************************
函数名称: SendToLCD()
函数功能: 把数据或命令发送到LCM
输入参数: val 要发送的数据或命令
flag 1:发送数据;0:发送命令
输出参数: 无
返回值: 0:发送失败;1:发送成功
*********************************************************************/
bool SendToLCD(uchar dataType,uchar val)
{
uint timeout = 0x0366;
//if (!timeout)
//{
// return 0;
//}
while (timeout--);
SendByteToLCD(val); // 发送写数据命令,1111,E,RW,RS,0
SendByteToLCD(dataType & 0xf0); // 发送数据高4位,再发4个0
SendByteToLCD((dataType&0x0f) << 4); // 发送数据低4位,再发4个0
return 1;
}
//////////////////////////////////////////////////////////////////////////////////
//在当前位置显示字符串
void DispStr(const uchar *str)
{
while(*str != '\0')
{
SendToLCD(*str++, DAT);
}
}
////////////////////////////////////////////////////////////////////////////////
//在特定地址显示字符串
#if (DISP_STR_AT_ENB)
void DispStrAt(const uchar *str, uchar x, uchar y)
{
GotoXY(x, y);
DispStr(str);
}
#endif
///////////////////////////////////////////////////////////////////////////////
//在当前位置显示数字
#if (DISP_NUM_ENB || DISP_NUM_AT_ENB)
void DispNum(ulong num)
{
uchar i = 9;
uchar vec[10];
vec[i] = 0;
do
{
vec[--i] = num%10 + '0';
num /= 10;
}
while (num!=0);
DispStr( vec + i);
}
#endif
////////////////////////////////////////////////////////////////////////////////////
//在特定地址显示数字
#if (DISP_NUM_AT_ENB)
void DispNumAt(ulong num, uchar x, uchar y)
{
GotoXY(x, y);
DispNum(num);
}
#endif
/////////////////////////////////////////////////////////////////////////////////////
//在当前位置显示长度为len的数字(数字向右对齐,左边有空位则补空格)
#if ( DISP_NUM_SPACE_ENB || DISP_NUM_SPACE_AT_ENB)
void DispNumSpace(ulong num, uchar len)
{
uchar i = 9;
uchar vec[10] = {' ', ' ', ' ', ' ', ' ', ' ', ' ',' ', ' ', ' '};
vec[9] = '\0';
do
{
vec[--i] = num%10 + '0';
num /= 10;
}
while(num);
len = 9-len;
DispStr(vec + len);
}
#endif
////////////////////////////////////////////////////////////////////////////////////
//在指定位置显示长度为len的数字(数字向右对齐,左边有空位则补空格)
#if (DISP_NUM_SPACE_AT_ENB)
void DispNumSpaceAt(ulong num, uchar x, uchar y, uchar len)
{
GotoXY(x, y);
DispNumSpace(num, len);
}
#endif
////////////////////////////////////////////////////////////////////////////////////
//在当前位置显示带小数点的数字,数字向左对齐
#if (DISP_NUM_SHIFT_ENB || DISP_NUM_SHIFT_AT_ENB)
void DispNumShift(ulong num, uchar dotPos)
{
uchar i = 9;
uchar vec[10];
vec[9] = '\0';
do
{
if ( i == 9 - dotPos && dotPos)
{
vec[--i] = '.';
}
vec[--i] = num%10 + '0';
num /= 10;
}
while(num);
while(dotPos >= 9-i)
{
if (dotPos == 9 - i)
{
vec[--i] = '.';
}
vec[--i] = '0';
}
DispStr(vec + i);
}
#endif
/*********************************************************************
函数名称: DispNumShiftAt()
函数功能: 在指定位置显示带小数点的数字
输入参数: num: 要显示的数据
x: 水平方向坐标(0 <= x <= 7)
y: 垂直方向坐标(0 <= y <= 3)
dotPos: 小数点所在的位置
输出参数: 无
返回值: 无
*********************************************************************/
#if (DISP_NUM_SHIFT_AT_ENB)
void DispNumShiftAt(ulong num, uchar x, uchar y, uchar dotPos)
{
GotoXY(x, y);
DispNumShift(num, dotPos);
}
#endif
/*********************************************************************
函数名称: GotoXY()
函数功能: 设置当前地址
输入参数: x: 水平方向坐标(0 <= x <= 7)
y: 垂直方向坐标(0 <= y <= 3)
输出参数: 无
返回值: 无
*********************************************************************/
void GotoXY(uchar x, uchar y)
{
uchar addr;
if (y < 2)
{
addr = 0x80 + x + y*16;
}
else
{
addr = 0x88 + x + (y-2)*16;
}
SendToLCD(addr, CMD);
}
/************************************************************************
* End of file
************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -