以下是LCD1602的显示程序,能够显示字符,但是显示不出串口获取的数据,求指正!
时间:10-02
整理:3721RD
点击:
- // GY-MCU90615
- // 使用单片机:STC89C52
- // 晶振: 11.0592 M(一定是11.0592m的)
- // 注意:需要先用串口助手或者软件修改 GY-MCU90615串口波特率为9600
- // 接线
- //GY-MCU90615 51MCU
- // VCC-------5V
- // GND-------GND
- // TX--------RX(P3.0 PIN10)
- // RX--------TX(P3.1 PIN11)
- // LCD1602引脚请根据下面定义修改
- // 功能:GY-MCU90615跟89c52 串口通信,lcd1602显示
- #include<REG52.H>
- #include<math.h> //Keil library
- #include<stdio.h> //Keil library
- #include<INTRINS.H>
- #define uchar unsigned char
- #define uint unsigned int
- // LCD1602引脚请根据下面定义修改
- #define DataPort P0 //LCD1602 数据端口
- sbit LCM_RS=P2^6; //LCD1602 控制端口
- sbit LCM_RW=P2^5; //LCD1602 控制端口
- sbit LCM_EN=P2^7; //LCD1602 控制端口
-
- //********定义函数*****************************
- void delay(unsigned int k);
- void InitLcd();
- void WriteDataLCM(uchar dataW);
- void WriteCommandLCM(uchar CMD,uchar Attribc);
- void DisplayOneChar(uchar X,uchar Y,uchar DData);
- void SeriPushSend(uchar send_data);
- //********定义变量*****************************
- uchar BUF[15]; //数据缓存区
- uchar cnt; //接收数据的累计值
- uchar sign=0;
- int YPR[3];
- //********定义函数*****************************
- void delay(unsigned int k);
- void SeriPushSend(uchar send_data);
- void display(void);
- //*********************************************
- //串口中断
- void serial_serve(void) interrupt 4
- {
- //ES=0;
- if(RI==1)
- { //中断标志
- RI=0;
- BUF[cnt]=SBUF;
- cnt++; //接收计数
- if(cnt==9) //
- {
- cnt=0; //
- sign=1;
- }
- RI=0;
- }
- //ES=1;
- }
- //*********************************************
- //串口初始化
- //9600 bps @ 11.059 MHz
- void init_uart()
- {
- TMOD=0x21;
- TH1=0xfd;
- TL1=0xfd;
- SCON=0x50;
- PS=1; //串口中断设为高优先级别
- TR0=1; //启动定时器
- TR1=1;
- ET0=1; //打开定时器0中断
- ES=1;
- // SCON = 0x50; //8位数据,可变波特率
- // AUXR |= 0x40; //定时器1时钟为Fosc,即1T
- // AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
- // TMOD &= 0x0F; //设定定时器1为16位自动重装方式
- // TL1 = 0xE0; //设定定时初值
- // TH1 = 0xFE; //设定定时初值
- // ET1 = 0; //禁止定时器1中断
- // TR1 = 1; //启动定时器1
-
- }
- //**********延时函数***************
- void delay(unsigned int k)
- {
- unsigned int i,j;
- for(i=0;i<k;i++)
- {
- for(j=0;j<121;j++)
- {;}
- }
- }
- //*********串口数据发送******************
- void SeriPushSend(uchar send_data)
- {
- SBUF=send_data;
- while(!TI); //等待发送结束
- TI=0; //软件清零
- }
- //*********LCD1602初始化**********************
- void InitLcd()
- {
- WriteCommandLCM(0x38,1);
- WriteCommandLCM(0x08,1);
- WriteCommandLCM(0x01,1);
- WriteCommandLCM(0x06,1);
- WriteCommandLCM(0x0c,1); //大板
-
-
- // WriteCommandLCM(0x38,1); //打开,5*8,8位数据
- // WriteCommandLCM(0x0c,1);
- // WriteCommandLCM(0x06,1);
- // WriteCommandLCM(0x01,1); //清屏
- }
- //**********检测忙信号************************
- void WaitForEnable(void)
- {
- // unsigned char sta;
- DataPort=0xff;
- LCM_RS=0;LCM_RW=1;_nop_();
- LCM_EN=1;_nop_();_nop_();
- while(DataPort&0x80);
- LCM_EN=0;
- }
- //**********写命令至LCD***********************
- void WriteCommandLCM(uchar CMD,uchar Attribc)
- {
- if(Attribc)WaitForEnable();
- LCM_RS=0;LCM_RW=0;LCM_EN=0;_nop_();
- DataPort=CMD;_nop_();
- LCM_EN=1;_nop_();_nop_();LCM_EN=0;
- }
- //**********写数据至LCD************************
- void WriteDataLCM(uchar dataW)
- {
- WaitForEnable();
- LCM_RS=1;LCM_RW=0;LCM_EN=0;_nop_();
- DataPort=dataW;_nop_();
- LCM_EN=1;_nop_();_nop_();LCM_EN=0;
- }
- //*********写一个字符数据到指定的目标***********
- void DisplayOneChar(uchar X,uchar Y,uchar DData)
- {
- Y&=1;
- X&=15;
- if(Y)X|=0x40;
- X|=0x80;
- WriteCommandLCM(X,0);
- WriteDataLCM(DData);
-
- }
-
- //******************************************************
- //*************************************
- void dis_play(uchar A,uchar B,int num)
- {
- if(num<0)
- {
- num=-num;
- DisplayOneChar(A,B,('-')); //显示负号
- }
- else
- DisplayOneChar(A,B,('+')); //显示正号
- DisplayOneChar(++A,B,(0x30|(num/10000)));
- DisplayOneChar(++A,B,(0x30|(num%10000/1000)));
- DisplayOneChar(++A,B,(0x30|(num%1000/100)));
- DisplayOneChar(++A,B,(0x2e));
- DisplayOneChar(++A,B,(0x30|(num%100/10)));
- DisplayOneChar(++A,B,(0x30|(num%10))); //小数点后2位
- }
- //*******************数据接收并显示**********************
- void display(void)
- {
- int YPR[3];
- if(sign)
- {
- sign=0;
-
- if(BUF[0]==0X5A&&BUF[1]==0X5A) //帧头判断
- {
-
- YPR[0]=(BUF[4]<<8|BUF[5]);
- YPR[1]=(BUF[6]<<8|BUF[7]);
-
-
- dis_play(2,1,YPR[0]);
- dis_play(2,0,YPR[1]);
- }
- }
- }
- //*******************数据接收并显示**********************
-
- //***************************************
- //主程序
- void main()
- {
- delay(1000); //延时
- InitLcd(); //初始化LCD
- init_uart(); //初始化串口
- EA=1; //开总中断
- cnt=0;
-
- DisplayOneChar(0,0,('A'));
- DisplayOneChar(1,0,(':'));
- DisplayOneChar(0,1,('O'));
- DisplayOneChar(1,1,(':'));
- SeriPushSend(0XA5);
- SeriPushSend(0X45);
- SeriPushSend(0XEA); //发送1帧读取命令。 连续发送数据
- // SeriPushSend(0XA5);
- // SeriPushSend(0X15);
- // SeriPushSend(0XBA); //发送1帧读取命令。查询数据
-
- while(1)
- { //循环
- display();
- } //end while
- }
已退回1积分