#include <reg51.h>
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
#define W_D_0832 XBYTE[0xc000]
#define W_C_GLCD XBYTE[0xea00]
#define W_D_GLCD XBYTE[0xea01]
#define R_B_GLCD XBYTE[0xea02]
#define R_D_GLCD XBYTE[0xea03]
char key;
uchar code s0[]={"fangbo "};
uchar code s1[]={"sanjiao "};
uchar code s2[]={"jichibo "};
uchar code s3[]={"zhengxian "};
uchar code tab[]={128,132,137,141,146,150,154,159,163,167,171,176,180,184,188,191,195,
199,203,206,210,213,216,219,222,225,228,231,233,236,238,240,242,244,246,247,249,
250,251,252,253,254,254,255,255,255,255,255,254,254,253,252,251,250,249,247,246,
244,242,240,238,236,233,231,228,225,222,219,216,213,210,206,203,198,195,192,188,
184,180,176,172,167,163,159,155,150,146,141,137,133,128,124,119,115,111,106,102,
97,93,89,85,81,77,73,69,65,61,57,54,50,47,43,40,37,34,31,28,25,23,20,18,16,14,12,
10,9,7,6,5,4,3,2,2,1,1,1,1,1,2,2,3,4,5,6,7,9,10,12,14,16,18,20,23,25,28,30,33,36,
40,43,46,50,53,57,60,64,68,72,76,80,84,88,93,97,101,106,110,114,119,123,128,129};
void delayf();
void delayj();
uchar key_scan(void);
void initial_lcd();
void wr_cmd_lcd(uchar ord);
void chkbusy_lcd();
void wr_data_lcd(uchar dat);
void delay();
void display(uchar *p, uchar linenum);
void main()
{
uchar i;
initial_lcd();
while(1)
{
key_scan();
if(key==1)
{
display(s0,0); //方波
{
P0=255;
delayf();
P0=0;
delayf();
}
}
else if(key==2)
{ display(s1,0);
for (i=0;i<255;i++) //三角波
{
P0= i;
delayj();
}
for (i=0;i<255;i++)
{
P0= 255-i;
delayj();
}
}
else if(key==3)
{display(s2,0);
for (i=0;i<255;i++) //锯齿波
{P0= i;
delayj();
}
}
else if(key==4)
{display(s3,0);
for (i=0;i<182;i++)
{
P0= tab[i]; //正弦
delayj();
}
}
}
}
void delayf(void)
{ uint i;
for (i=0;i<6;i++) ;
}
void delayj(void)
{
unsigned int i;
for(i=0;i<=2;i++);
}
uchar key_scan(void)
{
uchar x,row,line;
P0=0x0f;
if(P0!=0x0f)
{
delayj();
if(P0!=0x0f)
{
line=P0;
P0=0xf0;
row=P0;
x = line|row;
switch ( x )
{
case 0xde: key=4; break;
case 0xbe: key=1; break;
case 0xbd: key=2; break;
case 0xbb: key=3;break;
}
while(P0!=0xf0)
{
P0=0xf0;
}
delayj();
}
}
return key;
}
void display(uchar *p, uchar linenum)
{
uchar temp,i,j;
switch(linenum)
{
case 0:
temp=0x00;
break;
case 1:
temp=0x10;
break;
case 2:
temp=0x08;
break;
case 3:
temp=0x18;
break;
}
wr_cmd_lcd(temp|0x80);
i=0;
for(j=0;j<8;j++)
{
wr_data_lcd(*(p+i));
i++;
wr_data_lcd(*(p+i));
i++;
}
}
//LCD初始化
void initial_lcd()
{
wr_cmd_lcd(0x30);
delay();
wr_cmd_lcd(0x30);
wr_cmd_lcd(0x30);
delay();
wr_cmd_lcd(0x06);
delay();
wr_cmd_lcd(0x01);
delay();
wr_cmd_lcd(0x0c);
delay();
}
//写命令到GLCD
void wr_cmd_lcd(uchar ord)
{
chkbusy_lcd();
W_C_GLCD=ord;
}
//检查LCD忙标志
void chkbusy_lcd()
{
do{ACC=R_B_GLCD;}
while(ACC&0x80);
}
//写数据到GLCD
void wr_data_lcd(uchar dat)
{
chkbusy_lcd();
W_D_GLCD=dat;
}
void delay(void)
{
uchar i;
for(i=0;i<25;i++);
}