手把手教学51单片机 | 1602液晶

像这种含有芯片的元器件,最重要的是去学习怎样学会看懂这个芯片的引脚功能,而不是去背诵这个芯片的语句,不同厂家的同款元器件还有微小的差异,所以购买这种东西的时候,要向厂家索要一份芯片手册,看着手册设计程序或是电路。

1602液晶

1602:16意思是一行能显示16个字符,02表示一共有两行
只能显示数字和字符

写数据时序图

在这里插入图片描述
在这里插入图片描述
RS 低电平就是选择数据,高电平就是选择指令
RW 高电平就是读,低电平就是写
E是使能信号,发出高低脉冲

按照时序图,先写指令(数据),延迟,给脉冲

写指令(数据)

先选择写指令,然后把P0口赋值,接下来就是按照时序图的指示写程序啦。写数据也是一样的 就不展开了。

void write_com(uchar com)//
{
	lcdrs=0; // set write com
	P0=com; // give value data
	delay(5);
	lcden=1;// Âö³å
	delay(5);
	lcden=0;
}

初始化程序

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里显示的就是每一位矩阵的RAM地址,只显示00-0F,40-4F,在这两行右边的虽然有地址但是不显示,可以用来全屏左移,达到动态效果。

void init()
{
	dula=0;//因为数码管会分压,所以关掉防止电压不够
	wela=0;
	lcden=0;
	write_com(0x38);//初始化5*7矩阵
	
	//0000 1DCB  D显示 C光标 B闪烁 
	write_com(0x0f);
	
	//0000 01NS  
	write_com(0x06);//光标移动,数据不移动
	write_com(0x80);//初始化指针位置,80H就是第一位
}

字符手册

我们可以用矩阵来写数据,根据下表
在这里插入图片描述
若是要直接写的话,用‘’隔开

write_data('A');

若是要写一串字符的话
就用矩阵

uchar code table[]="    I Love U";

但这里的矩阵外不再是{}花括号了,而是双引号

移动

在这里插入图片描述
按照芯片手册的说法此时赋予P0=0x18就是左移一次,光标也会跟着左移

其他设置

在这里插入图片描述
0x01就是清屏 0x02就是回车

代码示例

不包含移动,包涵清屏,另起一页的代码示例

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int 

sbit lcden=P3^4;
sbit lcdrs=P3^5;
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]="    I Love U";
uchar code table1[]="    FOREVER";
uchar code table2[]="Just a joking";

void delay(uint z)
{
	uint x,y;
	for(x=z;x>0;x--)
		for(y=110;y>0;y--);
}	
void write_com(uchar com)//写指令
{
	lcdrs=0; // set writing com
	P0=com; // input value data
	delay(5);
	lcden=1;//给脉冲
	delay(5);
	lcden=0;
}

void write_data(uchar date)//写数据
{
	lcdrs=1; //选择数据
	P0=date; 
	delay(5);
	lcden=1;
	delay(5);
	lcden=0;
}
void init()
{
	dula=0;
	wela=0;
	lcden=0;
	write_com(0x38);
	write_com(0x0f);
	write_com(0x06);
	write_com(0x80);
}

void main()
{
	uint time;
	init();
	for(time=0;time<12;time++)
	{
		write_data(table[time]);
		delay(300);
	}
	
	write_com(0x80+0x40);
	
	for(time=0;time<11;time++)
	{
		write_data(table1[time]);
		delay(300);
	}
	delay(300);
	write_com(1);
	delay(300);
	delay(300);
	delay(300);
	write_com(0x80+0x00);
		for(time=0;time<13;time++)
	{
		write_data(table2[time]);
		delay(300);
	}
	while(1);
}
整屏移动代码
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int 

sbit lcden=P3^4;
sbit lcdrs=P3^5;
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]="I Love U";
uchar code table1[]="FOREVER";
uchar code table2[]="Just a joking";

void delay(uint z)
{
	uint x,y;
	for(x=z;x>0;x--)
		for(y=110;y>0;y--);
}	
void write_com(uchar com)//дÃüÁî
{
	lcdrs=0; // set write com
	P0=com; // give value data
	delay(5);
	lcden=1;// Âö³å
	delay(5);
	lcden=0;
}

void write_data(uchar date)//дÊý¾Ý
{
	lcdrs=1; // set write com
	P0=date; // give value data
	delay(5);
	lcden=1;// Âö³å
	delay(5);
	lcden=0;
}
void init()
{
	dula=0;
	wela=0;
	lcden=0;
	write_com(0x38)write_com(0x0f);
	write_com(0x06);
	write_com(0x80+0x10);

void main()
{
	uint time;
	init();
	for(time=0;time<8;time++)
	{
		write_data(table[time]);
		delay(20);
	}

	write_com(0x80+0x50);//»»ÐÐ

	for(time=0;time<7;time++)
	{
		write_data(table1[time]);
		delay(20);
	}


	for(time=0;time<16;time++)
	{
		write_com(0x18);
		delay(200);
	}
	while(1);
}
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,我无法提供您所需要的详细教程。但是,您可以在网络上寻找相关的教程和资源,以学习和掌握51单片机的红外通信技术。以下是一个简单的红外通信示例程序,仅供参考: ```c #include <reg52.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int sbit IRIN = P3^2; //红外接收器引脚 sbit IRLED = P1^0; //红外发射器引脚 uchar code table[] = {0x02, 0x01, 0x0A, 0x08}; //红外发送数据 void delay(uint t) { while(t--); } void init() { TMOD = 0x01; //定时器0工作方式1 TH0 = 0x3C; //定时器0初值 TL0 = 0xB0; TR0 = 1; //启动定时器0 ET0 = 1; //使能定时器0中断 EA = 1; //使能总中断 } void main() { init(); while(1) { if(IRIN == 0) //检测到红外信号 { delay(200); //延时一段时间,等待信号稳定 if(IRIN == 0) //再次检测红外信号 { IRLED = 1; //红外发射器输出高电平 delay(150); //发射红外信号 IRLED = 0; //红外发射器输出低电平 } while(!IRIN); //等待红外信号结束 } } } void interruptTimer0() interrupt 1 { static uchar i = 0; TH0 = 0x3C; //定时器0初值 TL0 = 0xB0; i++; if(i >= 4) //发送完整个红外码 { i = 0; TR0 = 0; //停止定时器0 } if(table[i] & 0x01) //发送高电平 { IRLED = 1; } else //发送低电平 { IRLED = 0; } table[i] >>= 1; //移位,准备发送下一个数据位 } ``` 以上代码仅供参考,具体的实现方式和硬件电路配置可能因情况而异,需要根据实际情况进行调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值