串口(用1602显示,缺少部分代码)

#include <reg52.h>
#include "delay.h"
#include "1602.h"

void uart_init(void)
{
	SCON = 0x50;//设置工作方式为方式1,允许串口接收

	TMOD |= 0X20;//定时器1工作于方式1

	TH1 = 0XFD;//波特率为9600
	TR1 = 1;

	EA = 1;
	//ES = 1;
}


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

void uart_send_str(unsigned char *s)
{
	while(*s)
	{
		uart_send_byte(*s);
		s++;
	}
}

unsigned char recvbuf[50] = '\0';
void uart_recv_str()
{
	unsigned char temp;
	unsigned char num = 0;
	while(1)
	{
		if(RI)
		{
			RI = 0;
			temp = SBUF;
			if(temp == ';')
			{
				recvbuf[num] = '\0';
				break; 
			}
			else
			{
				recvbuf[num] = temp;
				num++;
				if(num == 50)
					num = 0;
			}
		}
		
	}
}

void main(void)
{
	uart_init();

	LCD_Clear();
	LCD_Init();

	while(1)
	{
		uart_recv_str();
		uart_send_str("get string:");
		uart_send_str(recvbuf);
		uart_send_str("\r\n");
	}
}

/*void uart_isr(void) interrupt 4
{
	unsigned char temp;
	static unsigned char i;
	if(RI)
	{
		temp = SBUF;
		display[i++] = temp;
		SBUF = temp;
		RI = 0;
	}
	else if(display[i-1])
	{
		display[i] = '\0';

		i++;

		LCD_Clear();

		LCD_Write_String(0,0,display);
	}
	if(TI)
		TI = 0;	
}*/

#include "1602.h"
#include "delay.h"


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


#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


/*------------------------------------------------
              判忙函数
------------------------------------------------*/
 /*bit LCD_Check_Busy(void) 
 { 
 DataPort= 0xFF; 
 RS_CLR; 
 RW_SET; 
 EN_CLR; 
 _nop_(); 
 EN_SET;
 return (bit)(DataPort & 0x80);
 }*/
/*------------------------------------------------
              写入命令函数
------------------------------------------------*/
void LCD_Write_Com(unsigned char com) 
{  
// while(LCD_Check_Busy()); //忙则等待
 DelayMs(5);
 RS_CLR; 
 RW_CLR; 
 EN_SET; 
 DataPort= com; 
 _nop_(); 
 EN_CLR;
}
/*------------------------------------------------
              写入数据函数
------------------------------------------------*/
void LCD_Write_Data(unsigned char Data) 

 //while(LCD_Check_Busy()); //忙则等待
 DelayMs(5);
 RS_SET; 
 RW_CLR; 
 EN_SET; 
 DataPort= Data; 
 _nop_();
 EN_CLR;
}


/*------------------------------------------------
                清屏函数
------------------------------------------------*/
 void LCD_Clear(void) 
 { 
 LCD_Write_Com(0x01); 
 DelayMs(5);
 }
/*------------------------------------------------
              写入字符串函数
------------------------------------------------*/
 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_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_Init(void) 
 {
   LCD_Write_Com(0x38);    /*显示模式设置*/ 
   DelayMs(5); 
   LCD_Write_Com(0x38); 
   DelayMs(5); 
   LCD_Write_Com(0x38); 
   DelayMs(5); 
   LCD_Write_Com(0x38);  
   LCD_Write_Com(0x08);    /*显示关闭*/ 
   LCD_Write_Com(0x01);    /*显示清屏*/ 
   LCD_Write_Com(0x06);    /*显示光标移动设置*/ 
   DelayMs(5); 
   LCD_Write_Com(0x0C);    /*显示开及光标设置*/

   }

#include "delay.h"


void DelayUs2x(unsigned char t) //2t+7
{
while(--t);
}


void DelayMs(unsigned char t)
{
while(t--)
{
DelayUs2x(200);
DelayUs2x(254);
}


}


void DelayS(unsigned char t)
{
unsigned char i;


for(i = 0; i < t; i++)
{
DelayMs(200);
DelayMs(200);
DelayMs(200);
DelayMs(200);
DelayMs(200);
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值