#include "iostm8s208mb.h"
#include "LCD12864.h"
#define uchar unsigned char
#define uint unsigned int
//======串口模式=======
#define LCD12864_CS PE_ODR_ODR0 //片选信号输入
#define LCD12864_STD PC_ODR_ODR6 //串行数据输入
#define LCD12864_SCLK PC_ODR_ODR5 //串行移位脉冲输入
//#define LCD12864_PSB PC_ODR_ODR3 //串并模式选择 0:串口,1:并口
#define comm 0 //命令
#define dat 1 //数据
void DelayMs(uint i)
{
int j,k;
for(j=0;j<i;j++)
{for(k=0;k<1100;k++);}
}
/******************************************************************
名称:void LCD12864_Wbyte(uchar byte)
功能:向12864写入8位数据
指令:
调用:无
返回:无
******************************************************************/
void LCD12864_Wbyte(uchar byte)
{
uchar i;
for(i=0;i<8;i++)
{
if (byte & 0x80)
LCD12864_STD = 1;
else
LCD12864_STD = 0;
LCD12864_SCLK = 0;
byte <<= 1; //左移待写入数据,
LCD12864_SCLK = 1;
LCD12864_SCLK = 0;
}
}
/******************************************************************
名称:void LCD12864_W(bit dat_com,uchar byte)
功能:dat_com=0写指令,dat_com=1写数据
指令:
调用:LCD12864_Wbyte();LCD12864_busy();
返回:无
******************************************************************/
void LCD12864_W (uchar dat_com,uchar byte)
{
uchar temp;
if(dat_com == 0) //为零,写入指令
temp = LCD12864_W_COM; //11111,RS(0),RW(0),0
else //否则,写入数据
temp = LCD12864_W_DAT; //11111,RS(1),RW(0),0
LCD12864_CS = 1; //片选使能
LCD12864_Wbyte(temp); //写入模式选择,指令还是数据
LCD12864_Wbyte(byte&0xf0); //写入字节
LCD12864_Wbyte((byte<<4)&0xf0); //写入字节
LCD12864_CS = 0; //片选关闭
}
/******************************************************************
名称:void LCD12864_Init(void)
功能:LCD12864初始化
指令:
调用:LCD12864_W();
返回:无
******************************************************************/
void LCD12864_Init(void)
{
//LCD12864_PSB = 0; //选择串口模式
LCD12864_W(LCD12864_COM,LCD12864_COM_BASIC); //基本指令功能.
LCD12864_W(LCD12864_COM,LCD12864_PLACE_ROLL); //允许输入卷动位址
LCD12864_W(LCD12864_COM,LCD12864_REST_OFF); //脱离随眠状态,显示打开,关光标,反白关.
LCD12864_W(LCD12864_COM,LCD12864_CLEAR); //清屏指令.
LCD12864_W(LCD12864_COM,LCD12864_CURSOR_RRF); //AC自动加一,光标右移,整体显示不移动
}
/******************************************************************
名称:void LCD12864_Clear(void)
功能:LCD12864清屏
指令:
调用:LCD12864_W();
返回:无
******************************************************************/
void LCD12864_Clear(void)
{
LCD12864_W(LCD12864_COM,LCD12864_COM_BASIC);//基本指令功能.
LCD12864_W(LCD12864_COM,LCD12864_CLEAR); //清屏指令.
}
/******************************************************************
名称:void LCD12864_Wbmp(uchar *puts)
功能:LCD12864绘图
指令:
调用:LCD12864_W();
返回:无
******************************************************************/
void LCD12864_Wbmp(const uchar *puts)
{
uint x = 0;
uchar i,j;
LCD12864_W(LCD12864_COM,LCD12864_COM_PLOT_OFF); //扩展指令集动作,绘图显示OFF
for(i=0;i<32;i++)
{
LCD12864_W(LCD12864_COM,0x80|i); //列32行,双屏结构中上半屏
LCD12864_W(LCD12864_COM,0x80); //X地址坐标,自动加1.
for(j=0;j<16;j++) //16*8=256
LCD12864_W(LCD12864_DAT,puts[x++]);
}
for(i=0;i<32;i++)
{
LCD12864_W(LCD12864_COM,0x80|i);
LCD12864_W(LCD12864_COM,0x88); //下半屏
for(j=0;j<16;j++)
LCD12864_W(LCD12864_DAT,puts[x++]);
}
LCD12864_W(LCD12864_COM,LCD12864_COM_PLOT_ON); //扩展指令集动作,绘图显示ON
}
/******************************************************************
名称:void LCD12864_BMP_Clear( void )
功能:LCD12864清图像
指令:
调用:LCD12864_W();
返回:无
******************************************************************/
void LCD12864_BMP_Clear( void )
{
uchar i,j;
LCD12864_W(LCD12864_COM,LCD12864_COM_PLOT_OFF); //扩展指令集动作,绘图显示OFF
for(i=0;i<32;i++) //12864实际为256x32
{
LCD12864_W (LCD12864_COM,0x80|i); //行位置
LCD12864_W (LCD12864_COM,0x80); //列位置
for (j=0;j<32;j++) //256/8=32 byte
LCD12864_W(LCD12864_DAT,0); //全部写入0即清除图像
}
LCD12864_W(LCD12864_COM,LCD12864_COM_PLOT_ON); //扩展指令集动作,绘图显示ON
}
/******************************************************************
名称:void LCD12864_WPoss(uchar x,uchar y,uchar *buff)
功能:LCD12864字符位置自定义显示
指令:
调用:LCD12864_W();
返回:无
******************************************************************/
void LCD12864_WPoss(uchar x,uchar y,const uchar *buff)
{
uchar addr,i=0;
switch (x)
{
case 0:addr=0x80;break;
case 1:addr=0x90;break;
case 2:addr=0x88;break;
case 3:addr=0x98;break;
}
addr=addr+y;
LCD12864_W(LCD12864_COM,LCD12864_COM_BASIC); //8BitMCU,基本指令集合
LCD12864_W(LCD12864_COM,addr); //显示在自定义位置
while(buff[i]!='\0')
{
LCD12864_W(LCD12864_DAT,buff[i++]);
if(++y==16)
{
y=0;
if(++x==4) x=0;
switch (x)
{
case 0:addr=0x80;break;
case 1:addr=0x90;break;
case 2:addr=0x88;break;
case 3:addr=0x98;break;
}
addr=addr+y;
LCD12864_W(LCD12864_COM,addr);
}
}
}
void Lcd_pst(uchar xx,uchar yy) //设置显示坐标
{
uint line;
switch(yy)
{
case 0:line=0x00;break;
case 1:line=0x10;break;
case 2:line=0x08;break;
case 3:line=0x18;break;
default :break;
}
LCD12864_W(comm,0x80+line+xx);
}
//=============================================
//自定义汉字函数:CGRAM自定义显示字符
//地址 显示编码
//0x40 0x0000
//0x50 0x0002
//0x60 0x0004
////0x70 0x0006
//共可显示四个自定义字符!
//显示自定义字符前,先要设定显示的位置,否则会乱码
//==============================================*/
void write_char(uchar x,uchar y,uchar z,uchar *s)
{
uchar i;
switch(z)
{
case 1: z=0x40;
Lcd_pst(x,y);
LCD12864_W(dat,0x00);
LCD12864_W(dat,0x00);
break;
case 2: z=0x50;
Lcd_pst(x,y);
LCD12864_W(dat,0x00);
LCD12864_W(dat,0x02);
break;
case 3: z=0x60;
Lcd_pst(x,y);
LCD12864_W(dat,0x00);
LCD12864_W(dat,0x04);
break;
case 4: z=0x70;
Lcd_pst(x,y);
LCD12864_W(dat,0x00);
LCD12864_W(dat,0x06);
break;
default:break;
}
LCD12864_W(comm,0x30);
DelayMs(2);
LCD12864_W(comm,0x02);
DelayMs(2);
LCD12864_W(comm,z);
DelayMs(2);
for(i=0;i<16;i++)
{
LCD12864_W(dat,*s++);
LCD12864_W(dat,*s++);
}
}
/*------------------------------------
清除GDRAM
------------------------------------*/
void LCD_ClearGDRAM()
{
uchar i,j;
LCD12864_W(comm,0x30); //一般指令
LCD12864_W(comm,0x0C); //开启显示
LCD12864_W(comm,0x06); //AC++
LCD12864_W(comm,0x01); //清DDRAM
LCD12864_W(comm,0x36); //开启绘图
//LCD_InitGDRAM();
DelayMs(10);
LCD12864_W(comm,0x36); //显示绘图
for(i=0;i<32;i++) //在DGRAM里写满0,表示清除GDRAM
{
LCD12864_W(comm,0x80+i);
LCD12864_W(comm,0x80);
for(j=0;j<16;j++)
{
LCD12864_W(dat,0x00);
LCD12864_W(dat,0x00);
}
}
LCD12864_W(comm,0x36); //绘图完毕,开启显示
}
/******************************************************************
名称:void LCD12864_TXT_Clear( void )
功能:LCD12864清文本
指令:
调用:LCD12864_W();
返回:无
******************************************************************/
void LCD12864_TXT_Clear( void )
{
uchar i;
LCD12864_W(LCD12864_COM,LCD12864_COM_BASIC); //8BitMCU,基本指令集合
LCD12864_W(LCD12864