51单片机实验 2017年12月13日

 
 
2017年12月15日
1602液晶显示程序
 
 
 
 
1602液晶屏内部常用的命令定义:
1、0x38:设置16*2显示;5*7点阵;8位数据口连接
2、0x01:清屏
3、0x0f:开显示,显示光标,光标不闪烁
4、0x08:只开显示
5、0x0e:开显示不显示光标
6、0x06:地址加一,当写入数据时光标右移
7、0x02:地址计数器AC=0(此时地址为0x80)光标归原点但DDRAM中断内容不变
8、0x18:光标和显示一起向左移动
 
 
 
 
 
 
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcden=P3^2;//位定义1602液晶使能脚
sbit rs=P3^0;  //位定义1602液晶数据/命令(H/L)引脚
sbit rw=P3^1;	//位定义1602液晶读/写(H/L)引脚
sbit dula=P2^6;//数码管段选
sbit wela=P2^7;//数码管位选
uchar table1[]="HELLO QX-MCS51";//第一行要显示的字符
uchar table2[]="  QQ:7651719  ";//第二行要显示的字符
void delay(uint x)//延时函数,单位us
{
	uint a,b;
	for(a=x;a>0;a--)
		for(b=10;b>0;b--); 
}

void delay1(uint x)//延时函数,单位ms
{
	uint a,b;
	for(a=x;a>0;a--)
		for(b=100;b>0;b--); 
}

void write_com(uchar com)//	向D0~D7输入指令
{
	P2=com;	  //将8条串口数据线赋给com
	rs=0;	//指令
	lcden=0; //使能端初始化
	delay(10);	 //延时10us
	lcden=1;	//使能端由高电平转向低电平时输入指令
	delay(10);	   //延时10us
	lcden=0;
	
}

void write_date(uchar date)	//向D0~D7输入数据
{
	P2=date;
	rs=1;	  //数据
	lcden=0;	 //使能端初始化
	delay(10); //延时10us
	lcden=1;	 //在en使能端由高电平转向低电平之间的时间里向1602输入数据或命令
	delay(10); //延时10us
	lcden=0;
	
}

void init()		//液晶初始化
{
	rw=0;		//写
	dula=0;		//关闭段选和位选
	wela=0;
	write_com(0x38);//设置16乘2显示,5乘7点阵,8位数据口连接   
	delay(20);
	write_com(0x0f); //开显示,显示光标,光标不闪烁  
	delay(20);
	write_com(0x06);//地址加1,当写入数据时向右移  
	delay(20);
	write_com(0x01); //清屏 
	delay(20);	
}

void main()
{
	uchar a;
	init();//液晶初始化函数

	write_com(0x80+17);	//0x80为液晶显示第一行初始地址
	delay(20);		   //延时20us
	for(a=0;a<14;a++)  //a代表table1字符显示的字符数量
	{
	write_date(table1[a]);//向1602中输入字符
	delay(20);	//等待20us	
	}

	write_com(0xc0+17);//液晶第二行初始地址
	delay(50);		   //延时50us
	/*for(a=0;a<14;a++)	
	{
	write_date(table2[a]);//a代表table2中的字符
	delay(40);			  //等待40us
	}*/	

	for(a=0;a<16;a++)	//右移16个字符
	{
		write_com(0x18); 	//光标和显示一起向左移
		delay1(200);	  //延时200ms   
	}

	while(1); //循环
}

猜你喜欢

转载自blog.csdn.net/a1995_1995/article/details/78796792