⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 51

📁 51单片机应用系统典型模块开发大全
💻
字号:
#include <reg51.h>

#define uint  unsigned int
#define uchar unsigned char
//#define x1    0x80  //第一行坐标
#define x2    0x88	//第三行坐标
#define x3    0x90	//第二行坐标
//#define x4    0x98	//第四行坐标

#define comm  0		//指令标志
#define dat   1		//数据标志

sbit cs   = P0^0;	//高电平为数据,低电平为指令
sbit std  = P0^1;	//数据输出位
sbit sclk = P0^2;	//时钟
sbit psb  = P0^3;   //H=并口; L=串口;
sbit rst  = P0^4;   //Reset Signal 低电平有效


uchar code tab[]={
"计算机发送数据:"
};
uchar code num[]={
"0123456789ABCDEF"
};
uchar buffer[6];	//接收数据缓冲区
uchar display[12];	//显示数据缓冲器
uchar k=0;

void wr_lcd (uchar dat_comm,uchar content);	// 串行传输数据
void delay (uint us);						// 延时
void init_lcd(void);    					//初始化lcd
void init_serial(void);						// 初始化串行中断
void chn_disp(uchar code *chn,uchar j);		//显示汉字或字符
void convert(uchar *point);					// 数据转换
void chn_disp1(void);						// 显示串口送入数据
void clrram(void);							// 清DDRAM


/******************主程序******************/
void main()
{
	SP=0x5f;
	init_serial();      //初始化串口
	init_lcd();			//初始化LCD
	clrram();			//清屏
	chn_disp(tab,0);  	//显示第1行"计算机发送数据:"
	while(1)
	{
		if(k==6)		//6个数据已接收到
		{
			k=0;
			convert(buffer);//转换接收数据缓冲区数据
			chn_disp1();	//显示6个接收数据
		}	
	}
}

/****************初始化lcd****************/
void init_lcd(void)
{
	rst=1;				 //液晶复位端无效
	psb=0;				 //串行输出
	wr_lcd (comm,0x30);  //基本指令动作   
	wr_lcd (comm,0x01);  //清屏,地址指针指向00H
	delay (100);
	wr_lcd (comm,0x06);  //光标的移动方向
	wr_lcd (comm,0x0c);  //开显示,关游标
}
/****************初始化串行中断****************/
void init_serial(void)
{
	SCON = 0x50;		//8位串行口模式1,允许接收,REN=1
	TMOD|= 0x20;		//定时器1工作在模式2
	TH1 = 0xfd;			//波特率位9600,晶振频率位11.0592MHz
	TL1 = 0xfd;
	ES = 1;             //使能串行口中断
	EA = 1;				//使能全局中断
	TR1 = 1;			//启动定时器1
}
/****************串口中断服务程序****************/
void serial_IT(void) interrupt 4
{
	if(RI==1)
	{
		RI=0;
		buffer[k++]=SBUF;//将串口接收数据送入接收数据缓冲区
	}
}

/**************显示汉字或字符**************/
void chn_disp(uchar code *chn,uchar j)
{
	uchar i;
	wr_lcd (comm,0x30);  //基本指令动作  
	wr_lcd (comm,0x80);	 //设定DDRAM地址至00H
	for (i=0;i<16;i++)
		wr_lcd (dat,chn[j*16+i]);//显示第j行字符
}

/******************数据转换*******************/
void convert(uchar *point)
{
	uchar i,j1,j2;
	for(i=0;i<6;i++)			//将接收数据缓冲区数据变为10进制数并存入显示数据缓冲区
	{
		j1=point[i]/16;	 		//高4位
		j2=point[i]%16;  		//低4位
		display[2*i]=num[j1];	//换算成显示码
		display[2*i+1]=num[j2];
	}
}

/**************显示串口送入数据**************/
void chn_disp1(void)
{
	uchar i;
	wr_lcd(comm,0x30);			   //基本指令动作 
	wr_lcd(comm,x3);			   //设定DDRAM地址至10H
	for(i=0;i<3;i++)
	{
		wr_lcd(dat,display[2*i]);  //将显示码送入第二行显示
		wr_lcd(dat,display[2*i+1]);
		wr_lcd(comm,x3+2*i+2);
	}
	wr_lcd(comm,x2);			   //设定DDRAM地址至08H
	for(i=0;i<3;i++)
	{
		wr_lcd(dat,display[2*i+6]);//将显示码送入第三行显示
		wr_lcd(dat,display[2*i+7]);
		wr_lcd(comm,x2+2*i+2);
	}
}

/******************清DDRAM******************/
void clrram(void)
{
	wr_lcd (comm,0x30);			   //基本指令动作 
	wr_lcd (comm,0x01);			   //清除显示,并将DDRAM清零 
	delay (180);
}

/******************       ******************/
void wr_lcd(uchar dat_comm,uchar content)
{
	uchar a,i,j;
	delay(50);
	a=content;			//指令码或数据码
	cs=1;				//发送数据
	sclk=0;				
	std=1;				//发送5个"1",作为数据起始位
	for(i=0;i<5;i++)
	{
		sclk=1;
		sclk=0;
	}
	std=0;				//发送第6位,R/W=0,写数据
	sclk=1;		
	sclk=0;
	if(dat_comm)		//发送第7位RS
		std=1;			//若为高电平,发送数据
	else				
		std=0;			//若为低电平,发送指令
	sclk=1;
	sclk=0;
	std=0;				//发送第8位"0"
	sclk=1;
	sclk=0;
	for(j=0;j<2;j++)    //将数据位分两个字节发送
	{
		for(i=0;i<4;i++)//发送数据高4位或低4位
		{
			a=a<<1;
			std=CY;
			sclk=1;
			sclk=0;
		}
		std=0;
		for(i=0;i<4;i++)//发送4位"0"
		{
			sclk=1;
			sclk=0;
		}
	}
}

/******************延时******************/
void delay(uint us)   //delay time
{
	while(us--);
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -