单片机 LCD1602显示实验

电路图如下:
在这里插入图片描述

1、请描述液晶显示器的显示原理,及其与数码管相比的技术特点。

显示原理:

液晶显示器是利用偏光板这个特性来完成的,利用上下两片栏栅之间相互垂直的偏光板之间充满了液晶,

再利用电场控制液晶分支的旋转,来改变光的行进方向。

与数码管相比:数码管是元件,显示器是器件。

数码管在单片机中,一般仅做数字显示,而LCD可以显示数字、字符、汉字和图形。

还有LCD显示器体积小,厚度薄,重量轻、耗能少、工作电压低(1.5到6V)且无辐射,无闪烁并能直接与CMOS集成电路匹配。

2、
定义uchar变量data,要求在LCD1602上实现数字0~99的循环显示。
代码如下:

#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define out P0
/***********端口定义***************************************/
sbit rs=P2^0;
sbit rw=P2^1;
sbit e=P2^2;
/***********函数申明******************************************/
void check_busy(void);
void write_command(uchar com);
void write_data(uchar dat);
void LCD_initial(void);
void string(uchar ad ,uchar *s);
void lcd_test(void);
void delay(uint);
/***********主程序*********************************/
void main(void)
{
	LCD_initial();			     //LCD1602 初始化
	while(1)
	{ 
	    unsigned int i;
	    unsigned char m,n;
	    delay(10);
		for(i=0;i<=99;i++){
		if(i<10){
		n=i+'0';
        dis_char(0x08,n);//显示字符
		string(0x48,"wxh");//显示我的名字
	  	}
 	    else if(i<100){
		m=i/10+'0';
		n=i%10+'0';
        dis_char(0x08,m);//显示字符
		dis_char(0x09,n);
        string(0x48,"wxh");//显示我的名字
		}
		delay(100); 
		write_command(0x01);     //清屏
		delay(100);		
		}
			
	}
}
//输出字符(数字)
void dis_char(unsigned char ad, unsigned char input)

{

	write_command(ad+0x80);

	write_data(input);

	delay(10);

}
//1ms延时程序
void delay(uint j)
{
	uchar i=250;
	for(;j>0;j--)
	{
		while(--i);
		i=249;
		while(--i);
		i=250;
	}
}	
//查忙程序
void check_busy(void)
{
	uchar dt;
	do
	{
		dt=0xff;
		e=0;
		rs=0;	
		rw=1;
		e=1;
		dt=out;
	}while(dt&0x80);
	e=0;
}	
//写控制指令
void write_command(uchar com)
{
	check_busy();
	e=0;
	rs=0;
	rw=0;
	out=com;
	e=1;
	_nop_();
	e=0;
	delay(1);
}
//写数据指令
void write_data(uchar dat)
{
	check_busy();
	e=0;
	rs=1;
	rw=0;
	out=dat;
	e=1;
	_nop_();
	e=0;
	delay(1);	
}
//液晶屏初始化
void LCD_initial(void)
{
	write_command(0x38);//8位总线,双行显示,5X7的点阵字符
	write_command(0x0C);//开整体显示,光标关,无黑块
	write_command(0x06);//光标右移
	write_command(0x01);//清屏
	delay(1);
}
//输出字符串
void string(uchar ad,uchar *s)
{
	write_command(ad+0x80); //ad是显示位置信息
	while(*s>0)
	{
		write_data(*s++);
		delay(100);
	}
}

3、在int0引脚上,利用按键实现中断触发,并在LCD1602上显示的触发次数。
代码如下:

#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define out P0
/***********端口定义***************************************/
sbit rs=P2^0;
sbit rw=P2^1;
sbit e=P2^2;
/***********函数申明******************************************/
void check_busy(void);
void write_command(uchar com);
void write_data(uchar dat);
void LCD_initial(void);
void string(uchar ad ,uchar *s);
void lcd_test(void);
void delay(uint);
/***********全局变量定义************************/
  unsigned int i=0;
/***********主程序*********************************/
void main(void)
{
	LCD_initial();			     //LCD1602 初始化
	IT0=1;//设置P3.2引脚负跳变触发中断
	EA=1;//打开中断总开关
	EX0=1;//允许外部中断0引脚的中断
              PX0=1;//将外部中断0的优先权设置为高级中断		
	while(1)
	{ 
	    unsigned char m,n;
	    delay(10);
		if(i==0){
        string(0x00,"Hi! Teacher Chen");
		}
		else if(i<10){
		n=i+'0';
        dis_char(0x08,n);//显示字符
		string(0x48,"wxh");//显示我的名字
	  	}
 	    else if(i<100){
		m=i/10+'0';
		n=i%10+'0';
        dis_char(0x08,m);//显示字符
		dis_char(0x09,n);
        string(0x48,"wxh");//显示我的名字
		}
		delay(100);
		write_command(0x01);     //清屏
		delay(100);
	}
}
//INT0中断程序
void inter_0(void) interrupt 0{
    i++;
	if(i==99) i=0;
}
//输出字符(数字)
void dis_char(unsigned char ad, unsigned char input)

{

	write_command(ad+0x80);

	write_data(input);

	delay(10);

}
//1ms延时程序
void delay(uint j)
{
	uchar i=250;
	for(;j>0;j--)
	{
		while(--i);
		i=249;
		while(--i);
		i=250;
	}
}	
//查忙程序
void check_busy(void)
{
	uchar dt;
	do
	{
		dt=0xff;
		e=0;
		rs=0;	
		rw=1;
		e=1;
		dt=out;
	}while(dt&0x80);
	e=0;
}	
//写控制指令
void write_command(uchar com)
{
	check_busy();
	e=0;
	rs=0;
	rw=0;
	out=com;
	e=1;
	_nop_();
	e=0;
	delay(1);
}
//写数据指令
void write_data(uchar dat)
{
	check_busy();
	e=0;
	rs=1;
	rw=0;
	out=dat;
	e=1;
	_nop_();
	e=0;
	delay(1);	
}
//液晶屏初始化
void LCD_initial(void)
{
	write_command(0x38);//8位总线,双行显示,5X7的点阵字符
	write_command(0x0C);//开整体显示,光标关,无黑块
	write_command(0x06);//光标右移
	write_command(0x01);//清屏
	delay(1);
}
//输出字符串
void string(uchar ad,uchar *s)
{
	write_command(ad+0x80); //ad是显示位置信息
	while(*s>0)
	{
		write_data(*s++);
		delay(100);
	}
}

4、利用LCD1602显示出时分秒(时钟)
代码如下:

#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define out P0
/***********端口定义***************************************/
sbit rs=P2^0;
sbit rw=P2^1;
sbit e=P2^2;
/***********函数申明******************************************/
void check_busy(void);
void write_command(uchar com);
void write_data(uchar dat);
void LCD_initial(void);
void string(uchar ad ,uchar *s);
void lcd_test(void);
void delay(uint);
/***********全局变量定义******************************************/
 unsigned int hour=0;//时
 unsigned int min=0;//分
 unsigned int sec=0;//秒
 unsigned int counter=0;//软件计数
/***********主程序*********************************/
void main(void)
{	
unsigned char period_number;
            LCD_initial();//LCD1602 初始化
	string(0x43,"Good night!");//晚安
	period_number=200;
	TMOD=0x02;//方式2
	TL0=0-period_number;//装初值
                TH0=0-period_number; 
	TR0=1;//启动
	EA=1;//打开中断总开关
	ET0=1;//允许T0引脚的中断
	while(1)
	{ 
	    unsigned char h1,h2,m1,m2,s1,s2;
		h1=hour/10+'0';
		h2=hour%10+'0';
		m1=min/10+'0';
		m2=min%10+'0';
		s1=sec/10+'0';
		s2=sec%10+'0';
		dis_char(0x04,h1);//显示时
		dis_char(0x05,h2);
		dis_char(0x06,':');
                                dis_char(0x07,m1);//显示分
		dis_char(0x08,m2);
		dis_char(0x09,':');
                                dis_char(0x0a,s1);//显示秒
		dis_char(0x0b,s2);
	}
}
//T0中断程序
void inter_1(void) interrupt 1{
    counter++;
	if(counter>=5000){
	counter=0;
    sec++;
	}
	if(sec>=60) {
	min++;
	sec=0;
	}
	if(min>=60){ 
	hour++;
	min=0;
	}
	if(hour==24) hour=0;
}
//输出字符(数字)
void dis_char(unsigned char ad, unsigned char input)

{

	write_command(ad+0x80);

	write_data(input);

	delay(10);

}
//1ms延时程序
void delay(uint j)
{
	uchar i=250;
	for(;j>0;j--)
	{
		while(--i);
		i=249;
		while(--i);
		i=250;
	}
}	
//查忙程序
void check_busy(void)
{
	uchar dt;
	do
	{
		dt=0xff;
		e=0;
		rs=0;	
		rw=1;
		e=1;
		dt=out;
	}while(dt&0x80);
	e=0;
}	
//写控制指令
void write_command(uchar com)
{
	check_busy();
	e=0;
	rs=0;
	rw=0;
	out=com;
	e=1;
	_nop_();
	e=0;
	delay(1);
}
//写数据指令
void write_data(uchar dat)
{
	check_busy();
	e=0;
	rs=1;
	rw=0;
	out=dat;
	e=1;
	_nop_();
	e=0;
	delay(1);	
}
//液晶屏初始化
void LCD_initial(void)
{
	write_command(0x38);//8位总线,双行显示,5X7的点阵字符
	write_command(0x0C);//开整体显示,光标关,无黑块
	write_command(0x06);//光标右移
	write_command(0x01);//清屏
	delay(1);
}
//输出字符串
void string(uchar ad,uchar *s)
{
	write_command(ad+0x80); //ad是显示位置信息
	while(*s>0)
	{
		write_data(*s++);
		delay(100);
	}
}
  • 6
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值