串口通信

#include <intrins.h>
#include <string.h>
#include "./delay/delay.h"

unsigned char recvbuf[10];
unsigned char count = 0;

sbit RS = P2^6;   //定义端口 
sbit RW = P2^5;
sbit EN = P2^7;

#define RS_CLR RS=0 
#define RS_SET RS=1

#define RW_CLR RW=0 
#define RW_SET RW=1 

#define EN_CLR EN=0
#define EN_SET EN=1

#define DataPort P0

void uart_init()
{
    SCON = 0x50;  //设置出啊口工作方式,打开接收允许
    //SM0 = 0; SM1 = 1; SM2 = 0;REN = 1;
    TMOD |= 0x20;  //设置定时器1为工作方式2

    TH1 = 0xfd;  //波特率为9600bits/s
    //ET1 = 1;  //打开定时器1中断允许
    ES = 1; //使能串口中断
    TR1 = 1;  //开始计数
    EA = 1; 
}

void uart_send_byte(unsigned char byte)
{
    SBUF = byte;
    //TI位自动置1,手动清0;
    while(!TI);  //while(TI != 1);
    TI = 0;     
}

void uart_send_string(char *buf)
{
    while(*buf != '\0')
    {
        uart_send_byte(*buf);
        buf++;
    }   
}

/*void uart_send_(char *recvbuf)
{
    //char recvbuf[1024];
    //memset(&recvbuf,0,sizeof(recvbuf));
    while(RI)
    {
        *recvbuf = SBUF;
        recvbuf++;  
    }
    uart_send_string(recvbuf);
}*/

void LCD_Write_Com(unsigned char com) 
 {  
// while(LCD_Check_Busy()); //忙则等待
 delay_ms(5);
 RS_CLR; 
 RW_CLR; 
 EN_SET; 
 DataPort= com; 
 _nop_(); 
 EN_CLR;
 }
/*------------------------------------------------
              写入数据函数
------------------------------------------------*/
 void LCD_Write_Data(unsigned char Data) 
 { 
 //while(LCD_Check_Busy()); //忙则等待
 delay_ms(5);
 RS_SET; 
 RW_CLR; 
 EN_SET; 
 DataPort= Data; 
 _nop_();
 EN_CLR;
 }

/*------------------------------------------------
                清屏函数
------------------------------------------------*/
 void LCD_Clear(void) 
 { 
 LCD_Write_Com(0x01); 
 delay_ms(5);
 }
/*------------------------------------------------
              写入字符函数
------------------------------------------------*/
void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) 
 {     
 if (y == 0) 
    {     
    LCD_Write_Com(0x80 + x);     
    }    
 else 
    {     
    LCD_Write_Com(0xC0 + x);     
    }        
 LCD_Write_Data( Data);  
 }

/*------------------------------------------------
              写入字符串函数
------------------------------------------------*/
 void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) 
 {     
 if (y == 0) 
    {     
     LCD_Write_Com(0x80 + x);     
    }
 else 
    {     
    LCD_Write_Com(0xC0 + x);     
    }        
 while (*s) 
    {     
 LCD_Write_Data( *s);     
 s ++;     
    }
 }

void LCD_Init(void) 
 {
   LCD_Write_Com(0x38);    /*显示模式设置*/ 
   delay_ms(5); 
   LCD_Write_Com(0x38); 
   delay_ms(5); 
   LCD_Write_Com(0x38); 
   delay_ms(5); 
   LCD_Write_Com(0x38);  
   LCD_Write_Com(0x08);    /*显示关闭*/ 
   LCD_Write_Com(0x01);    /*显示清屏*/ 
   LCD_Write_Com(0x06);    /*显示光标移动设置*/ 
   delay_ms(5); 
   LCD_Write_Com(0x0C);    /*显示开及光标设置*/
 }

void main()
{
    unsigned char i;
    uart_init();
    LCD_Init(); 

    //memset(&recvbuf,0,sizeof(recvbuf));
    while(1)
    {
        //uart_send_byte(0x55);
        //delay_ms(50);
        //memset(&recvbuf,0,sizeof(recvbuf));

        //if(RI)
        {
        //  uart_send_string("I receive is :");
        //  uart_send_string(recvbuf);
        //  uart_send_string("\r\n");

            //RI = 0;   

        }
        LCD_Write_String(0,0,recvbuf);
        //LCD_Write_Char(i,0,recvbuf[i]);
        //LCD_Write_Com(0x01);    /*显示清屏*/
    }


}

void UART_SER (void) interrupt 4 //串行中断服务程序
{
    unsigned char Temp;          //定义临时变量 

   if(RI)                        //判断是接收中断产生
     {
      RI=0;                      //标志位清零
      Temp = SBUF;
      recvbuf[count++] = Temp;
      SBUF = Temp;
     }
   if(TI)                        //如果是发送标志位,清零
     TI=0;
}片
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值