#include
#define uint unsigned int
#define uchar unsigned char
//#define x1 0x80 //第一行坐标
#define x2 0x88 //第三行坐标
#define x3 0x90 //第二行坐标
//#define x4 0x98 //第四行坐标
#define comm 0 //指令标志
#define dat 1 //数据标志
sbit cs = P0^0; //高电平为数据,低电平为指令
sbit std = P0^1; //数据输出位
sbit sclk = P0^2; //时钟
sbit psb = P0^3; //H=并口; L=串口;
sbit rst = P0^4; //Reset Signal 低电平有效
uchar code tab[]={
"计算机发送数据:"
};
uchar code num[]={
"0123456789ABCDEF"
};
uchar buffer[6]; //接收数据缓冲区
uchar display[12]; //显示数据缓冲器
uchar k=0;
void wr_lcd (uchar dat_comm,uchar content); // 串行传输数据
void delay (uint us); // 延时
void init_lcd(void); //初始化lcd
void init_serial(void); // 初始化串行中断
void chn_disp(uchar code *chn,uchar j); //显示汉字或字符
void convert(uchar *point); // 数据转换
void chn_disp1(void); // 显示串口送入数据
void clrram(void); // 清DDRAM
/******************主程序******************/
void main()
{
SP=0x5f;
init_serial(); //初始化串口
init_lcd(); //初始化LCD
clrram(); //清屏
chn_disp(tab,0); //显示第1行"计算机发送数据:"
while(1)
{
if(k==6) //6个数据已接收到
{
k=0;
convert(buffer);//转换接收数据缓冲区数据
chn_disp1(); //显示6个接收数据
}
}
}
/****************初始化lcd****************/
void init_lcd(void)
{
rst=1; //液晶复位端无效
psb=0; //串行输出
wr_lcd (comm,0x30); //基本指令动作
wr_lcd (comm,0x01); //清屏,地址指针指向00H
delay (100);
wr_lcd (comm,0x06); //光标的移动方向
wr_lcd (comm,0x0c); //开显示,关游标
}
/****************初始化串行中断****************/
void init_serial(void)
{
SCON = 0x50; //8位串行口模式1,允许接收,REN=1
TMOD|= 0x20; //定时器1工作在模式2
TH1 = 0xfd; //波特率位9600,晶振频率位11.0592MHz
TL1 = 0xfd;
ES = 1; //使能串行口中断
EA = 1; //使能全局中断
TR1 = 1; //启动定时器1
}
/****************串口中断服务程序****************/
void serial_IT(void) interrupt 4
{
if(RI==1)
{
RI=0;
buffer[k++]=SBUF;//将串口接收数据送入接收数据缓冲区
}
}
/**************显示汉字或字符**************/
void chn_disp(uchar code *chn,uchar j)
{
uchar i;
wr_lcd (comm,0x30); //基本指令动作
wr_lcd (comm,0x80); //设定DDRAM地址至00H
for (i=0;i<16;i++)
wr_lcd (dat,chn[j*16+i]);//显示第j行字符
}
/******************数据转换*******************/
void convert(uchar *point)
{
uchar i,j1,j2;
for(i=0;i<6;i++) //将接收数据缓冲区数据变为10进制数并存入显示数据缓冲区
{
j1=point[i]/16; //高4位
j2=point[i]%16; //低4位
display[2*i]=num[j1]; //换算成显示码
display[2*i+1]=num[j2];
}
}
/**************显示串口送入数据**************/
void chn_disp1(void)
{
uchar i;
wr_lcd(comm,0x30); //基本指令动作
wr_lcd(comm,x3); //设定DDRAM地址至10H
for(i=0;i<3;i++)
{
wr_lcd(dat,display[2*i]); //将显示码送入第二行显示
wr_lcd(dat,display[2*i+1]);
wr_lcd(comm,x3+2*i+2);
}
wr_lcd(comm,x2); //设定DDRAM地址至08H
for(i=0;i<3;i++)
{
wr_lcd(dat,display[2*i+6]);//将显示码送入第三行显示
wr_lcd(dat,display[2*i+7]);
wr_lcd(comm,x2+2*i+2);
}
}
/******************清DDRAM******************/
void clrram(void)
{
wr_lcd (comm,0x30); //基本指令动作
wr_lcd (comm,0x01); //清除显示,并将DDRAM清零
delay (180);
}
/****************** ******************/
void wr_lcd(uchar dat_comm,uchar content)
{
uchar a,i,j;
delay(50);
a=content; //指令码或数据码
cs=1; //发送数据
sclk=0;
std=1; //发送5个"1",作为数据起始位
for(i=0;i<5;i++)
{
sclk=1;
sclk=0;
}
std=0; //发送第6位,R/W=0,写数据
sclk=1;
sclk=0;
if(dat_comm) //发送第7位RS
std=1; //若为高电平,发送数据
else
std=0; //若为低电平,发送指令
sclk=1;
sclk=0;
std=0; //发送第8位"0"
sclk=1;
sclk=0;
for(j=0;j<2;j++) //将数据位分两个字节发送
{
for(i=0;i<4;i++)//发送数据高4位或低4位
{
a=a<<1;
std=CY;
sclk=1;
sclk=0;
}
std=0;
for(i=0;i<4;i++)//发送4位"0"
{
sclk=1;
sclk=0;
}
}
}
/******************延时******************/
void delay(uint us) //delay time
{
while(us--);
}