/*
**********************************************************************
* 头文件包含
**********************************************************************
*/
#include "lcd12864.h"
/*
**********************************************************************
* 本地全局变量
**********************************************************************
*/
sbit gLcd12864_E = P2^7; // LCD12864控制总线的使能信号
sbit gLcd12864_RW = P2^6; // LCD12864控制总线的读写选择信号,串行数据口
sbit gLcd12864_RS = P2^5; // LCD12864控制总线的数据/命令选择信号
//sbit gLcd12864_PSB= P1^0; // PSB=1为并口,PSB=0为串口
/*
**********************************************************************
* 内部函数原型声明
**********************************************************************
*/
static void delay_1ms(u16 x);
//static void delay500ms(void);
/*********************************************************************
* 函 数 名 : delay_1ms
* 函数功能 : 延时
* 参数列表 : x——设定延时时间
* 函数输出 : 无
*********************************************************************/
static void delay_1ms(u16 x)
{
u16 i,j;
for(j=0;j<x;j++)
for(i=0;i<110;i++);
}
/*********************************************************************
* 函 数 名 : delay500ms
* 函数功能 : 单片机小精灵V1.3生成的延时500ms的精确延时函数
* 参数列表 : 无
* 函数输出 : 无
*********************************************************************/
static void delay500ms(void) //误差 0us
{
unsigned char a,b,c;
for(c=23;c>0;c--)
for(b=152;b>0;b--)
for(a=70;a>0;a--);
}
/*********************************************************************
* 函 数 名 : sendbyte
* 函数功能 : 读一个字节
* 参数列表 : zdata
* 函数输出 : 无
*********************************************************************/
static void sendbyte(u8 zdata)
{
u8 i;
for(i=0; i<8; i++)
{
if((zdata << i) & 0x80) //一个字节与上10000000(0x80),如果字节最高位为1则数据线发1,反之发0
{
gLcd12864_RW = 1;
}
else
{
gLcd12864_RW = 0;
}
gLcd12864_E = 0;
_nop_(); //一个正脉冲(可要可不要)
gLcd12864_E = 1;
}
}
/*********************************************************************
* 函 数 名 : Lcd12864WriteCmd
* 函数功能 : 按照LCD12864低层时序向LCD内部写入8位命令字
* 参数列表 : cmd - 待写入的8位命令字
* 函数输出 : 无
*********************************************************************/
static void Lcd12864WriteCmd(u8 cmd)
{
gLcd12864_RS=1;
gLcd12864_E=0;
sendbyte(0xf8); //第一个字节11111000——0xf8-写指令
sendbyte(cmd & 0xf0);
sendbyte((cmd << 4) & 0xf0);
gLcd12864_RS=0; // 禁止LCD
delay_1ms(1);
}
/*********************************************************************
* 函 数 名 : Lcd12864WriteData
* 函数功能 : 按照LCD12864低层时序向LCD内部写入8位数据
* 参数列表 : dat - 待写入的8位命令字
* 函数输出 : 无
*********************************************************************/
static void Lcd12864WriteData(u8 dat)
{
gLcd12864_RS=1;
gLcd12864_E=0;
sendbyte(0xfa); //第一个字节11111000——0xf8-写指令
sendbyte(dat & 0xf0);
sendbyte((dat << 4) & 0xf0);
gLcd12864_RS=0; // 禁止LCD
delay_1ms(1);
}
/************* 上面是底层时序函数,下面是高层时序函数 ***************/
/*********************************************************************
* 函 数 名 : Lcd12864Init
* 函数功能 : 按照LCD12864低层时序进行初始化序列
* 参数列表 : 无
* 函数输出 : 无
*********************************************************************/
void Lcd12864Init(void)
{
//gLcd12864_PSB = 1; // 选定8位并行模式
// 发送初始化序列
Lcd12864WriteCmd(0x30); // 0x30为基本指令集
Lcd12864WriteCmd(0x02);
Lcd12864WriteCmd(0x0c); // 整体显示、游标关闭
Lcd12864WriteCmd(0x01); // 0x01为清屏指令
Lcd12864WriteCmd(0x80); // 地址自动加1
}
/*********************************************************************
* 函 数 名 : Lcd12864ShowStr
* 函数功能 : 从坐标(x, y)开始显示字符串str,注意这个函数不能跨行
* 显示,因为显存地址是不连续的。
* 参数列表 : x - 横向坐标,范围是0-7
* y - 纵向坐标,范围是0-3
* pStr - 指向待显示的字符串的指针
* 函数输出 : 无
*********************************************************************/
void Lcd12864ShowStr(u8 x, u8 y, u8 *pStr) //显示字符串
{
switch (y)
{
case 0:
x |= 0x80; break; // 第一行
case 1:
x |= 0x90; break; // 第二行
case 2:
x |= 0x88; break; // 第三行
case 3:
x |= 0x98; break; // 第四行
default:
break;
}
Lcd12864WriteCmd(x); // 发送地址码
while (*pStr != '\0') // 若到达字串尾则退出
{
Lcd12864WriteData(*pStr); //
pStr++;
delay_1ms(5);
}
}
/*********************************************************************
* 函 数 名 : Lcd12864sleep
* 函数功能 : 使液晶睡眠
* 参数列表 :
* 函数输出 : 无
*********************************************************************/
void Lcd12864sleep(u8 x)
{
if(x==0)
{ Lcd12864WriteCmd(0x08);} //进入睡眠
if(x==1)
{ Lcd12864WriteCmd(0x0c);} //退出睡眠
}
/*********************************************************************
* 函 数 名 : Lcd12864ClearScreen
* 函数功能 : 清屏,即清除屏幕整个显示内容
* 参数列表 : 无
* 函数输出 : 无
*********************************************************************/
void Lcd12864ClearScreen(void)
{
// 发送初始化序列
Lcd12864WriteCmd(0x01); // 0x01为清屏指令
// Lcd12864WriteCmd(0x34); // 0x34为扩充指令集
// Lcd12864WriteCmd(0x30); // 0x30为基本指令集
}
/*********************************************************************
* 函 数 名 : Lcd12864FlashScreen3
* 函数功能 : 屏幕闪烁3次
* 参数列表 : 无
* 函数输出 : 无
*********************************************************************/
void Lcd12864FlashScreen3(void)
{
u8 time = 0;
for (time=0; time<3; time++)
{
Lcd12864WriteCmd(0x08);
delay500ms();
Lcd12864WriteCmd(0x0c);
delay500ms();
}
}
/*********************************************************************
* 函 数 名 : Lcd12864ShowImage
* 函数功能 : 显示图片
* 参数列表 : *pData
* 函数输出 : 无
*********************************************************************/
void Lcd12864ShowImage(u8 *pData)
{
u8 x = 0, y = 0, i = 0;
for(i=0;i<9;i=i+8)
for(y=0;y<32;y++)
{
for(x=0;x<8;x++)
{
Lcd12864WriteCmd(0x36);
Lcd12864WriteCmd(0x80+y);
Lcd12864WriteCmd(0x80+x+i);
Lcd12864WriteData(*pData++);
Lcd12864WriteData(*pData++);
Lcd12864WriteCmd(0x30);
}
}
}
/*********************************************************************
* 函 数 名 : Lcd12864tiao
* 函数功能 : 显示图片
* 参数列表 : *pData
* 函数输出 : 无
*********************************************************************/
void Lcd12864tiao()
{
u8 x = 0, y = 0, i = 0;
for(i=0;i<9;i=i+8)
for(y=0;y<32;y++)
{
for(x=0;x<8;x++)
{
Lcd12864WriteCmd(0x36);
Lcd12864WriteCmd(0x80+y);
Lcd12864WriteCmd(0x80+x+i);
Lcd12864WriteData(0x3c);
Lcd12864WriteData(0x3c);
Lcd12864WriteCmd(0x30);
}
}
}
/*********************************************************************
* 函 数 名 : Lcd12864heng()
* 函数功能 : 显示图片
* 参数列表 : *pData
* 函数输出 : 无
*********************************************************************/
void Lcd12864heng()
{
u8 x = 0, y = 0, i = 0,k;
for(i=0;i<9;i=i+8)
for(y=0;y<32;y++)
{
if((y%8)==1)k=0xff;
else k=0;
for(x=0;x<8;x++)
{
Lcd12864WriteCmd(0x36);
Lcd12864WriteCmd(0x80+y);
Lcd12864WriteCmd(0x80+x+i);
Lcd12864WriteData(k);
Lcd12864WriteData(k);
Lcd12864WriteCmd(0x30);
}
}
}
|