#include<W78E365.h>
#include<math.h>
#include<string.h>
#include<absacc.h>
#include<INTRINS.H>
#include<lcd.h>
#include<util.h>
/********常用命令及参数定义********/
#define DISPON 0x3f
#define DISPOFF 0x3e
#define DISPFIRST 0xc0
#define SETX 0x40
#define SETY 0xb8
#define LCDBUZY 0x80
#define L 0x00
#define R 0x40
#define LIMIT 0x80
/**********引脚定义*********/
sbit addr_lcd_c = P2^2;//锁存信号
sbit addr_lcd_d = P2^7;//锁存信号
/**********全局变量************/
unsigned char cbyte;
unsigned char statu;
//bit simple;
extern unsigned char code char_Table[95][16];
//***********初始化LCD*******************/
void Lcminit (void)
{
cbyte=DISPOFF;
WrL(cbyte);
WrR(cbyte);
cbyte=DISPON;
WrL(cbyte);
WrR(cbyte);
cbyte=DISPFIRST;
WrL(cbyte);
WrR(cbyte);
Lcmcls();
Locatexy(0,0);
}
/***************LCD清屏********************/
void Lcmcls(void)
{
unsigned char i,j;
for(i=0;i<8;i++)
{
//delay(6);
for(j=0;j<LIMIT;j++)
{
//delay(6);
Wrdata(0x0,i,j);
}
}
}
/**************写左区**************/
void WrL(unsigned char x)
{
P0=0xFF; //P0口送FF,准备读
addr_lcd_d=1;
addr_lcd_d = 0;
P0 = 0x19; //ELCD=1(使能),R/W=1(读),D/I=0(指令),CSB=0(左半屏),CSA=1(右半屏),0有效
addr_lcd_c=1;
addr_lcd_c = 0;
delay(5); //while(P0 & LCDBUZY);//最高位为1,表示忙,则循环
P0 = 0x03;
addr_lcd_c = 1;
addr_lcd_c = 0;
P0=x; //P0口送FF,准备读
addr_lcd_d=1;
addr_lcd_d = 0;
P0 = 0x11;
addr_lcd_c = 1;
addr_lcd_c = 0;
P0 = 0x03;
addr_lcd_c = 1;
addr_lcd_c = 0;
}
/**************写右区**************/
void WrR(unsigned char data x)
{
P0=0xFF; //P0口送FF,准备读
addr_lcd_d=1;
addr_lcd_d = 0;
P0 = 0x1a;
addr_lcd_c=1;
addr_lcd_c = 0;
delay(5); //while(P0 & LCDBUZY);//最高位为1,表示忙,则循环
P0 = 0x03;
addr_lcd_c = 1;
addr_lcd_c = 0;
P0=x; //P0口送FF,准备读
addr_lcd_d=1;
addr_lcd_d = 0;
P0 = 0x12;
addr_lcd_c = 1;
addr_lcd_c = 0;
P0 = 0x03;
addr_lcd_c = 1;
addr_lcd_c = 0;
}
/*************定位*****************/
void Locatexy(unsigned char row,unsigned char col)
{
unsigned char x, y, right;
switch(col&0xc0)
{
case 0:
{
P0=0xFF; //P0口送FF,准备读
addr_lcd_d=1;
addr_lcd_d = 0;
P0 = 0x1a;
addr_lcd_c=1;
addr_lcd_c = 0;
delay(5); //while(P0 & LCDBUZY);//最高位为1,表示忙,则循环
P0 = 0x03;
addr_lcd_c = 1;
addr_lcd_c = 0;
right = 1; //置右半屏标志
break;
}
case 0x40:
{
P0=0xFF; //P0口送FF,准备读
addr_lcd_d=1;
addr_lcd_d = 0;
P0 = 0x19;
addr_lcd_c=1;
addr_lcd_c = 0;
delay(5); //while(P0 & LCDBUZY);//最高位为1,表示忙,则循环
P0 = 0x03;
addr_lcd_c = 1;
addr_lcd_c = 0;
right = 0;
break;
}
}
x=col&0x3f|SETX; //把列数据变成行命令
y=row&0x07|SETY; //把行数据变成行命令
/**********************************/
P0=0xFF;
addr_lcd_d=1;
addr_lcd_d=0;
if(right)
P0 = 0x1a;
else
P0 = 0x19;
addr_lcd_c = 1;
addr_lcd_c = 0;
delay(5); //while(P0 & LCDBUZY);//最高位为1,表示忙,则循环
P0 = 0x03;
addr_lcd_c = 1;
addr_lcd_c = 0;
/*********以上为判断忙标志********/
P0 = y;
addr_lcd_d=1;
addr_lcd_d=0;
if(right)
P0 = 0x12;
else
P0 = 0x11;
addr_lcd_c = 1;
addr_lcd_c = 0;
P0 = 0x03;
addr_lcd_c = 1;
addr_lcd_c = 0;
/**********以上为送行命令***********/
P0=0xFF;
addr_lcd_d=1;
addr_lcd_d=0;
if(right)
P0 = 0x1a;
else
P0 = 0x19;
addr_lcd_c = 1;
addr_lcd_c = 0;
delay(5); //while(P0 & LCDBUZY);//最高位为1,表示忙,则循环
P0 = 0x03;
addr_lcd_c = 1;
addr_lcd_c = 0;
/*********以上为判断忙标志********/
P0 = x;
addr_lcd_d=1;
addr_lcd_d=0;
if(right)
P0 = 0x12;
else
P0 = 0x11;
addr_lcd_c = 1;
addr_lcd_c = 0;
P0 = 0x03;
addr_lcd_c = 1;
addr_lcd_c = 0;
/**********以上为送列命令***********/
if(right) //置左右半区全局变量标志
statu = 1;
else
statu = 0;
}
/**************数据写输出***************/
void Wrdata(unsigned char x,unsigned char row,unsigned char col)
{
Locatexy(row,col); //定位显示位置
if(statu)
P0 = 0x06;
else
P0 = 0x05;
addr_lcd_c = 1;
addr_lcd_c = 0;
P0 = x;
addr_lcd_d=1;
addr_lcd_d=0;
if(statu)
P0 = 0x16;
else
P0 = 0x15;
addr_lcd_c = 1;
addr_lcd_c = 0;
P0 = 0x03;
addr_lcd_c = 1;
addr_lcd_c = 0;
}
/****************图形输出******************/
void Putpicture(unsigned char *picture)
{
unsigned char i,j,row, col ;
unsigned int x;
row = 0;
col=0;
for(j=0;j<128;j++)
{
x=j*0x08;
for(i=0;i<8;i++)
{
cbyte=picture[x++];
Wrdata(cbyte,row,col);
row++;
}
row=0;
col++;
}
}
/***************半角数据点阵输出*******************/
void Puthalf(unsigned char *strch,unsigned char row,unsigned char col)
{
unsigned char i,bakerx;
bakerx = row;
for(i=0;i<16;i++)//上半字输出
{
cbyte=strch[i];
Wrdata(cbyte,bakerx,col);
cbyte=strch[i+1];
Wrdata(cbyte,bakerx+1,col);
col++;
i++;
}
}
/***********************字符型点阵行--》列转换*******************/
void VtoH8x16change(unsigned char *hzbuf)
{
unsigned char i,j,k,cash[16];
unsigned char newbyte, savebit[8];
for(k=0;k<16;k++)
{
newbyte = 0;
for(i=0;i<8;i++)
{
savebit[i]=hzbuf[i] & 0x80;
}
for(j=0;j<8;j++)
{
savebit[j] = savebit[j] >> (7-j);
newbyte = newbyte | savebit[j];
}
cash[k] = newbyte;
newbyte = 0;
for(i=8;i<16;i++)
{
savebit[i-8]=hzbuf[i] & 0x80;
}
for(j=0;j<8;j++)
{
savebit[j] = savebit[j] >> (7-j);
newbyte = newbyte |savebit[j];
}
cash[k+1] = newbyte;
for(j=0;j<16;j++)
{
hzbuf[j] = hzbuf[j] <<1;
}
k++;
}
for(i=0;i<16;i++)
hzbuf[i] = cash[i];
}
/************************显示英文和符号字符*******************/
void vWrite8x16Character(unsigned char *ch,unsigned char row,unsigned char col,bit flag)
{
unsigned char ucXArray[16],i;
if(flag)
{
for(i = 0; i < 16; i++)
ucXArray[i] = ~ch[i]; // 反白显示英文
}
else
{
for(i = 0; i < 16; i++)
ucXArray[i] = ch[i];
}
VtoH8x16change(ucXArray);
Puthalf(ucXArray,row,col);
}
/*************************显示中英文字符串*********************/
void vWrite8x16String(unsigned char *str,unsigned char row, unsigned char col, bit flag)
{
unsigned char i, j,thiscol;
j = strlen(str);
for(i = 0; i < j; i++)
{
thiscol = (i % 16) * 8 + col;//计算列地址
vWrite8x16Character(&char_Table[str[i]-0x20][0],row,thiscol,flag);
if(i>15)
{
row++;
col=0;
}
}
}