上位机串口发送至单片机1602液晶
/*******************************************************************/
/* */
/*写显示数据到LCD */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */
/* */
/*******************************************************************/
void lcd_wdat(uchar dat)
{
// while(lcd_busy());
LCD_RS = 1;
LCD_WR = 0;
LCD_EN = 0;
P0 = dat;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/*******************************************************************/
/* */
/* LCD初始化设定 */
/* */
/*******************************************************************/
void lcd_init()
{
delay1(15);
lcd_wcmd(0x01); //清除LCD的显示内容
lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据
delay1(5);
lcd_wcmd(0x38);
delay1(5);
lcd_wcmd(0x38);
delay1(5);
lcd_wcmd(0x0c); //开显示,显示光标,光标闪烁
delay1(5);
lcd_wcmd(0x01); //清除LCD的显示内容
delay1(5);
}
/*******************************************************************/
/* */
/* 设定显示位置 */
/* */
/*******************************************************************/
void lcd_pos(uchar pos)
{
lcd_wcmd(pos| 0x80); //数据指针=80+地址变量
}
/*********************************************************
发送数据函数
*********************************************************/
void senddata(uchar dat)
{
SBUF =dat;
while(!TI);
TI = 0;
}
/*********************************************************
串行中断服务函数
*********************************************************/
void serial() interrupt 4
{
ES = 0; //关闭串行中断
RI = 0; //清除串行接受标志位
buf = SBUF; //从串口缓冲区取得数据
switch(buf)
{
case 0x31: senddata(T);break; //接受到1,发送字符T给计算机
case 0x32: senddata(X);break; //接受到2,发送字符X给计算机
case 0x33: senddata(-);break; //接受到3,发送字符-给计算机
case 0x34: senddata(M);break; //接受到4,发送字符M给计算机
case 0x35: senddata(C);break; //接受到5,发送字符C给计算机
case 0x36: senddata(U);break; //接受到5,发送字符U给计算机
default: senddata(buf);break; //接受到其它数据,将其发送给计算机
}
if(buf!=0x0D)
{
if(buf!=0x0A)
{
temp =buf;
if(count<16)
{
RXDdata[count]=temp;
count++;
if(count==16)
playflag=1;
}
}
}
ES = 1; //允许串口中断
}
/*********************************************************
数据显示函数
*********************************************************/
void play()
{
if(playflag)
{
lcd_pos(0x40); //设置位置为第二行
for(m=0;m<16;m++)
{
lcd_wdat(cdis2[m]); //清LCD1602第二行
delay1(5);
}
lcd_pos(0x40); //设置位置为第二行
for(m=0;m<16;m++)
{
// lcd_pos(0x40+m); //设置显示位置为第二行
lcd_wdat(RXDdata[m]); //显示字符
delay1(5);
}
playflag=0;
count=0x00;
for(m=0;m<16;m++)
{
RXDdata[m]=0x20; //清显存单元
delay1(5);
}
}
}
/*********************************************************
主函数
*********************************************************/
void main(void)
{
P0 = 0xff;
P2 = 0xff;
SCON=0x50; //设定串口工作方式
PCON=0x00; //波特率不倍增
TMOD=0x20; //定时器1工作于8位自动重载模式, 用于产生波特率
EA=1;
ES = 1; //允许串口中断
TL1=0xfd;
TH1=0xfd; //波特率9600
TR1=1;
lcd_init();
lcd_pos(0x00); //设置显示位置为第一行
for(m=0;m<16;m++)
{
lcd_wdat(cdis1[m]); //显示字符
delay1(5);
}
lcd_pos(0x40); //设置显示位置为第二行
for(m=0;m<16;m++)
{
lcd_wdat(cdis2[m]); //显示字符
delay1(5);
}
while(1)
{
play();
}
}
/*********************************************************/
评论