//---------------------------------------
//名称: 主函数
//---------------------------------------
voidmain(void) //主函数,单片机开机后就是从这个函数开始运行
{
TRISB=0B11000111; //初始化RB7-RB0的输入输出方向
TRISC=0B11111111; //初始化RC7-RC0的输入输出方向
TRISD=0B00000000; //初始化RD7-RD0的输入输出方向
PORTB=0B00000000; //初始化RB7-RB0的数值
PORTD=0B00000000; //初始化RD7-RD0的数值
LCD1602_init(); //调用1602液晶初始化函数
//*****USART串口初始化*****
SPBRG=25; //设置波特率为9600,误差0.16%
BRGH=1; //设置高速波特率
SYNC=0; //SYNC=0为异步模式,SYNC=1为同步模式
SPEN=1; //允许串口操作
CREN=1; //CREN=0禁止连续接收,CREN=1允许连续接收
TXIE=0; //禁止发送中断
RCIE=0; //禁止接收中断
TX9=0; //TX9=0为8位发送,TX9=1为9位发送
RX9=0; //RX9=0为8位接收,RX9=1为9位接收
TXEN=1; //TXEN=0为禁止发送,TXEN=1为允许发送
//**************************
LCD1602_Disp(0,0,'R'); //在坐标(0,0)处写入R
LCD1602_Disp(1,0,'E'); //在坐标(1,0)处写入e
LCD1602_Disp(2,0,'C'); //在坐标(2,0)处写入c
LCD1602_Disp(3,0,'E'); //在坐标(3,0)处写入e
LCD1602_Disp(4,0,'I'); //在坐标(4,0)处写入i
LCD1602_Disp(5,0,'V'); //在坐标(5,0)处写入v
LCD1602_Disp(6,0,'E'); //在坐标(6,0)处写入e
LCD1602_Disp(8,0,'A'); //在坐标(8,0)处写入a
LCD1602_Disp(10,0,'B'); //在坐标(10,0)处写入b
LCD1602_Disp(11,0,'Y'); //在坐标(11,0)处写入y
LCD1602_Disp(12,0,'T'); //在坐标(12,0)处写入t
LCD1602_Disp(13,0,'E'); //在坐标(13,0)处写入e
LCD1602_Disp(0,1,'B'); //在坐标(0,1)处写入B
LCD1602_Disp(1,1,'A'); //在坐标(1,1)处写入a
LCD1602_Disp(2,1,'U'); //在坐标(2,1)处写入u
LCD1602_Disp(3,1,'D'); //在坐标(3,1)处写入d
LCD1602_Disp(5,1,'R'); //在坐标(5,1)处写入r
LCD1602_Disp(6,1,'A'); //在坐标(6,1)处写入a
LCD1602_Disp(7,1,'T'); //在坐标(7,1)处写入t
LCD1602_Disp(8,1,'E'); //在坐标(8,1)处写入e
LCD1602_Disp(9,1,':'); //在坐标(9,1)处写入:
LCD1602_Disp(10,1,'9'); //在坐标(10,1)处写入9
LCD1602_Disp(11,1,'6'); //在坐标(11,1)处写入6
LCD1602_Disp(12,1,'0'); //在坐标(12,1)处写入0
LCD1602_Disp(13,1,'0'); //在坐标(13,1)处写入0
clrbit=1; //置清屏标志位
while(1)
{
//****查询式串口接收程序****
if(RCIF==1) //如果接收标志位为1,说明有数据接收完毕
{ //RCIF在寄存器被读出后自动清零
USARTbuf=RCREG; //将接收缓冲区内容转至USARTbuf寄存器中
if(OERR==1); //如果有溢出错误
{
CREN=0; //清零CREN位可将OERR位清零
CREN=1; //再次将CREN置一,以允许继续接收
}
TXREG=USARTbuf+1; //将接收到的内容+1后发送出去
while(TRMT==0); //一直等到数据发送完毕,即TRMT=1
if(clrbit) //如果为第一次收到数据启动清屏操作
{
clrbit=0;
LCD1602_init();//调用1602液晶初始化函数,目的清屏
}
LCD1602_Disp(0,0,'R'); //在坐标(0,0)处写入R
LCD1602_Disp(1,0,'E'); //在坐标(1,0)处写入e
LCD1602_Disp(2,0,'C'); //在坐标(2,0)处写入c
LCD1602_Disp(3,0,'E'); //在坐标(3,0)处写入e
LCD1602_Disp(4,0,':'); //在坐标(4,0)处写入:
LCD1602_Disp(6,0,'0'); //在坐标(6,0)处写入0
LCD1602_Disp(7,0,'X'); //在坐标(7,0)处写入x
j=USARTbuf>>4; //把要显示内容的高4位移到低4位上
if(j<10) //0-F在ASCII码中并不连续,所以要分开处理
{
j+='0'; //0-9的数据以0为基点进行偏移即可
}
else
{
j-=10;
j+='A'; //A-F的数据以A为基点进行偏移即可
}
LCD1602_Disp(8,0,j); //在坐标(8,0)处写入该数据
j=USARTbuf&0x0f; //把要显示内容的高4位移到低4位上
if(j<10) //0-F在ASCII码中并不连续,所以要分开处理
{
j+='0'; //0-9的数据以0为基点进行偏移即可
}
else
{
j-=10;
j+='A'; //A-F的数据以A为基点进行偏移即可
}
LCD1602_Disp(9,0,j); //在坐标(9,0)处写入该数据
USARTbuf+=1; //做一次加一动作
LCD1602_Disp(0,1,'S'); //在坐标(0,1)处写入S
LCD1602_Disp(1,1,'E'); //在坐标(1,1)处写入e
LCD1602_Disp(2,1,'N'); //在坐标(2,1)处写入n
LCD1602_Disp(3,1,'D'); //在坐标(3,1)处写入d
LCD1602_Disp(4,1,':'); //在坐标(4,1)处写入:
LCD1602_Disp(6,1,'0'); //在坐标(6,1)处写入0
LCD1602_Disp(7,1,'X'); //在坐标(7,1)处写入x
j=USARTbuf>>4; //发送的数据高4位放入BUF
if(j<10) //0-F在ASCII码中并不连续,所以要分开处理
{
j+='0'; //0-9的数据以0为基点进行偏移即可
}
else
{
j-=10;
j+='A'; //A-F的数据以A为基点进行偏移即可
}
LCD1602_Disp(8,1,j); //在坐标(8,1)处写入该数据
j=USARTbuf&0x0f; //发送的数据低4位放入BUF
if(j<10) //0-F在ASCII码中并不连续,所以要分开处理
{
j+='0'; //0-9的数据以0为基点进行偏移即可
}
else
{
j-=10;
j+='A'; //A-F的数据以A为基点进行偏移即可
}
LCD1602_Disp(9,1,j); //在坐标(9,1)处写入该数据
}
}
}
|