/************************************************************************/
/********* LCD_12864.C *************/
/********** Written By Thonelyne---20180329 *************/
/********** Version 1.92 ***************/
/************************************************************************/
#include "STC15.H"
#include "DataForm_STC15.H"
#include "LCD_12864.H"
#include <intrins.H>
//-----------------------------------------------------------------------
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//-----------------------------------------------------------------------
//----------------------函数说明-----------------------------------------
/* */
//-----------------------------------------------------------------------
//=======================================================================
//-----------------------------------------------------------------------
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//-----------------------------------------------------------------------
//----------------------数据变量定义-------------------------------------
//-----------------------------------------------------------------------
//=======================================================================
uint8 dis[4]; //显示数字(-511至512)的字符数组 可更改
//-----------------------------------------------------------------------
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//-----------------------------------------------------------------------
//----------------------具体函数实现-------------------------------------
//-----------------------------------------------------------------------
//=======================================================================
/*******************************************************************************
* 函 数 名 : LCD12864_Init
* 函数功能 : 初始化LCD12864
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void LCD12864_Init()
{
// LCD12864_PSB = 1; //选择并行输入
// LCD12864_RST = 1; //复位
P0M0&=~0XFF;
P0M1&=~0XFF;
P2M0&=~0XE0;
P2M1&=~0XE0;
LCD12864_WriteCmd(0x30); //选择基本指令操作
LCD12864_WriteCmd(0x0c); //显示开,关光标
LCD12864_WriteCmd(0x01); //清除LCD12864的显示内容
}
/*******************************************************************************
* 函 数 名 : LCD12864_Delay1ms
* 函数功能 : 延时1MS
* 输 入 : c
* 输 出 : 无
*******************************************************************************/
//void LCD12864_Delay1ms(uint8 c)
//{
// uint8 a,b;
// for(; c>0; c--)
// {
// for(b=199; b>0; b--)
// {
// for(a=1; a>0; a--);
// }
// }
//}
void LCD12864_Delay1ms(uint8 c)
{
unsigned char i, j;
while(c--)
{
_nop_();
_nop_();
i = 11;
j = 52;
do
{
while (--j);
} while (--i);
}
}
/*******************************************************************************
* 函 数 名 : LCD12864_DisplayString
* 函数功能 : 延时1MS
* 输 入 : c
* 输 出 : 无
*******************************************************************************/
void LCD12864_DisplayString(uint8 x, uint8 y, uint8 *DData, uint8 L)
{
uint8 StringLength = 0;
x &= 0x03;
y &= 0x0F;
LCD12864_SetWindow(x,y);
while(L--)
{
LCD12864_WriteData(DData[StringLength]);
StringLength++;
}
}
/*******************************************************************************
* 函 数 名 : LCD12864_DisplayNum
* 函数功能 :
* 输 入 : c
* 输 出 : 无
*******************************************************************************/
//void LCD12864_DisplayNum(uint8 x, uint8 y, uint8 num)
//{
// uint8 i = 0;
// uint8 temp = 0;
// uint8 nums[4];
// x &= 0x03; //数值清洗
// y &= 0x0F;
// while(num)
// {
// temp =temp *10 + num % 10;
// num /= 10;
// }
// LCD12864_SetWindow(x,y);
// while(temp)
// {
// nums[i] = temp % 10;
// temp /= 10;
// LCD12864_WriteData(nums[i]);
// i++;
// }
//
//}
//=============================================================================
void lcd_printf(uint8 *s, int32 temp_data)
{
if (temp_data < 0)
{
temp_data = -temp_data;
*s = '-';
}
else *s = ' ';
// *++s = temp_data / 10000 +0x30;
// temp_data = temp_data % 10000;
// *++s = temp_data / 1000 +0x30;
// temp_data = temp_data % 1000;
*++s = temp_data / 100 + 0x30;
temp_data = temp_data % 100; //????
*++s = temp_data / 10 + 0x30;
temp_data = temp_data % 10; //????
*++s = temp_data + 0x30;
}
void Display10BitData(int32 value, uint8 x, uint8 y) //?????????,value?????
{
lcd_printf(dis, value); //??????
LCD12864_DisplayString(x, y, dis, 4);
}
void LCD12864_ClearScreen(void)
{
LCD12864_WriteCmd(0x01);
}
/*******************************************************************************
* 函 数 名 : LCD12864_WriteData
* 函数功能 : 写数据
* 输 入 : dat
* 输 出 : 无
*******************************************************************************/
void LCD12864_WriteData(uint8 dat)
{
uint8 i;
i = 0;
while( LCD12864_Busy() == 0)
{
LCD12864_Delay1ms(1);
i++;
if( i>100)
{
return; //超过等待退出
}
}
LCD12864_RS = 1; //选择数据
LCD12864_RW = 0; //选择写入
LCD12864_EN = 0; //初始化使能端
LCD12864_DATAPORT = dat; //放置数据
LCD12864_EN = 1; //写时序
LCD12864_Delay1ms(5);
LCD12864_EN = 0;
}
/*******************************************************************************
* 函 数 名 : LCD12864_SetWindow
* 函数功能 : 设置在基本指令模式下设置显示坐标。注意:x是设置行,y是设置列
* 输 入 : x, y
* 输 出 : 无
*******************************************************************************/
void LCD12864_SetWindow(uint8 x, uint8 y)
{
uint8 pos;
if(x == 0) // 第一行的地址是80H
{
x = 0x80;
}
else if(x == 1) //第二行的地址是90H
{
x = 0x90;
}
else if(x == 2) //第三行的地址是88H
{
x = 0x88;
}
else if(x == 3)
{
x = 0x98;
}
pos = x + y;
LCD12864_WriteCmd(pos);
}
/*******************************************************************************
* 函 数 名 : LCD12864_Busy
* 函数功能 : 检测LCD是否忙
* 输 入 : 无
* 输 出 : 1或0(1表示不忙,0表示忙)
*******************************************************************************/
uint8 LCD12864_Busy(void)
{
uint8 i = 0;
LCD12864_RS = 0; //选择命令
LCD12864_RW = 1; //选择读取
LCD12864_EN = 1;
LCD12864_Delay1ms(1);
while((LCD12864_DATAPORT & 0x80) == 0x80) //检测读取到的值
{
i++;
if(i > 100)
{
LCD12864_EN = 0;
return 0; //超过等待时间返回0表示失败
}
}
LCD12864_EN = 0;
return 1;
}
/*******************************************************************************
* 函 数 名 : LCD12864_WriteCmd
* 函数功能 : 写命令
* 输 入 : cmd
* 输 出 : 无
*******************************************************************************/
void LCD12864_WriteCmd(uint8 cmd)
{
uint8 i;
i = 0;
while( LCD12864_Busy() == 0)
{
LCD12864_Delay1ms(1);
i++;
if( i>100)
{
return; //超过等待退出
}
}
LCD12864_RS = 0; //选择命令
LCD12864_RW = 0; //选择写入
LCD12864_EN = 0; //初始化使能端
LCD12864_DATAPORT = cmd; //放置数据
LCD12864_EN = 1; //写时序
LCD12864_Delay1ms(5);
LCD12864_EN = 0;
}
/*******************************************************************************
* 函 数 名 : LCD12864_ReadData
* 函数功能 : 读