基于51单片机+LCD1602显示

LCD1602介绍

在这里插入图片描述
LCD1602相关引脚
在这里插入图片描述
LCD1602写命令、写数据相关操作图
在这里插入图片描述

根据上面时序图和时序参数图我们可以写出 写命令代码 和写数据代码

写命令 代码
写命令
void write_com(char command)
{
	RS = 0; 
	RW = 0; //高读低写
	LCD = command;
	delay5ms(); //这里延时最低要30纳秒 我们直接给5ms
	E = 1;//使能拉高 
	delay5ms(); //最低要求延迟150纳秒 我们直接给5ms
	E = 0;
}
写数据 代码
写数据
void write_data(char data)
{
	RS = 1;
	RW = 0;
	LCD = data;
	delay5ms(); //这里延时最低要30纳秒 我们直接给5ms
	E = 1;//使能拉高 
	delay5ms(); //最低要求延迟150纳秒 我们直接给5ms
	E = 0;
}

LCD1602显示程序步骤及如何初始化

1. 初始化
2. 写命令(RS=0)
3. 写数据(RS=1)

具体需要初始化什么?

1.显示开关控制指令(功能:控制显示器开/关 光标显示/关闭 是否闪烁)

2.进入模式设置指令(功能:每写入一位数据后光标的移动 左/右 显示屏不移动/整体右移 )

3.功能设定指令(功能:设定数据总线的位数 显示的行数 字型 )

4.清屏指令(功能:清屏显示空白 光标归位 地址计数器(AC)的值为05.显示位置设置(功能:指定在1602上哪个位置上显示数据)

具体指令相关介绍:

1.显示开关控制指令
在这里插入图片描述

write_com(0x0c);  //开显示功能 无光标 不闪烁

2.进入模式设置指令
在这里插入图片描述

write_com(0x06); //写入数据后光标自动右移 整屏不移动。

3.功能设定指令
在这里插入图片描述

	write_com(0x38); //数据总线8位 16X2显示 5*7点阵

4.清屏指令

write_com(0x01); //清屏 0000 0001

5.显示位置设置
在这里插入图片描述
如果想在1602屏幕上第一行第一个开始显示 就是0x80
如果想在1602屏幕上第二行第一个开始显示 就是0xc0

我这里就设置在第一行第三个开始显示hello word

write_com(0x83); //在1602第一行第3个开始显示
初始化代码
void init_lcd()
{	
	write_com(0x0c); //开显示功能 无光标 不闪烁
	write_com(0x06); //写入数据后光标自动右移 整屏不移动
	write_com(0x38); //数据总线8位 16X2显示 5*7点阵
	write_com(0x01); //清屏 0000 0001
	write_com(0x83); //在1602第一行第3个开始显示
}

原理图及显示程序

在这里插入图片描述
在这里插入图片描述
引脚定义

//引脚定义
#define LCD P0
sbit E = P2^7;
sbit RS = P2^6;
sbit RW = P2^5;

lcd1602.h

void write_com(unsigned char command);	//写命令函数
void write_data(unsigned char dat);		//写数据函数
void init_lcd();  //初始化LCD1602函数
void delay5ms();  //延时5ms函数	

lcd1602.c

#include <reg52.h>
#include "lcd1602.h"

#define LCD P0
sbit E = P2^7;  //使能
sbit RS = P2^6; //数据/命令(H/L)
sbit RW = P2^5; //读写(H/L)

/******延迟5毫秒函数********/
void delay5ms()   //误差 -0.000000000001us
{
    unsigned char a,b;
    for(b=15;b>0;b--)
        for(a=152;a>0;a--);
}


/******LCD1602写命令函数********/
void write_com(unsigned char command)
{
	RS = 0; 
	RW = 0; 	//高读低写
	LCD = command;
	delay5ms(); //这里延时最低要30纳秒 我们直接给5ms
	E = 1;		//使能拉高 
	delay5ms(); //最低要求延迟150纳秒 我们直接给5ms
	E = 0;
}

/******LCD1602写数据函数********/
void write_data(unsigned char dat)
{
	RS = 1;
	RW = 0;
	LCD = dat;
	delay5ms(); //这里延时最低要30纳秒 我们直接给5ms
	E = 1;		//使能拉高 
	delay5ms(); //最低要求延迟150纳秒 我们直接给5ms
	E = 0;
}
/******初始化LCD1602********/
void init_lcd()
{	
	write_com(0x06); //写入数据后光标自动右移 整屏不移动。
	write_com(0x0c); //开显示功能 无光标 不闪烁
	write_com(0x38); //数据总线8位 16X2显示 5*7点阵
	write_com(0x01); //清屏 0000 0001
	write_com(0x83); //在1602第一行第3个开始显示
}

main.c

#include <reg52.h>
#include "lcd1602.h"

unsigned char array[] = {"hello word"};
unsigned char i = 0;


void main()
{
	//1.初始化lcd1602
	init_lcd();
	//2.写数据(hello word)到LCD1602显示
	while(array[i] != '\0')
	{	
		write_data(array[i]);
		i++;
	}	
	while(1);
}

最终项目展示

在这里插入图片描述

  • 17
    点赞
  • 118
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
智能计算器软件源码: ```c #include <reg51.h> #include <intrins.h> #define uint unsigned int #define uchar unsigned char sbit k0 = P3^2; sbit k1 = P3^3; sbit k2 = P3^4; sbit k3 = P3^5; sbit beep = P2^3; uchar code table[] = { '0','1','2','3','+', '4','5','6','-', 0, '7','8','9','*', 0, '.','=','C','/', 0 }; void delay(uint z){ uint x,y; for(x=z;x>0;x--){ for(y=110;y>0;y--); } } void key_scan(){ uchar temp,i; P0 = 0xf0; temp = P0; temp &= 0xf0; if(temp != 0xf0){ delay(5); temp = P0; temp &= 0xf0; if(temp != 0xf0){ temp >>= 4; switch(temp){ case 0x0e: P2 = 0xfe; for(i=0;i<20;i++){ if(!k0) break; delay(10); } if(i == 20){ beep = 0; } break; case 0x0d: P2 = 0xfd; for(i=0;i<20;i++){ if(!k1) break; delay(10); } if(i == 20){ beep = 0; } break; case 0x0b: P2 = 0xfb; for(i=0;i<20;i++){ if(!k2) break; delay(10); } if(i == 20){ beep = 0; } break; case 0x07: P2 = 0xf7; for(i=0;i<20;i++){ if(!k3) break; delay(10); } if(i == 20){ beep = 0; } break; default: break; } P2 = 0xff; } } } void write_com(uchar com){ P2 = 0; P0 = com; _nop_(); P2 = 0x40; delay(2); P2 = 0; } void write_data(uchar date){ P2 = 0x80; P0 = date; _nop_(); P2 = 0xc0; delay(2); P2 = 0; } void init(){ write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); } void main(){ uchar n=0,s=0,c=0; init(); while(1){ key_scan(); if(!k0){ beep = 0; write_data(table[n]); delay(500); beep = 1; n++; n %= 20; } if(!k1){ beep = 0; write_data(table[s]); delay(500); beep = 1; s++; s %= 20; } if(!k2){ beep = 0; write_com(0x18); c++; if(c > 15){ c = 0; write_com(0x18); } beep = 1; } if(!k3){ beep = 0; write_com(0x01); n = 0; s = 0; c = 0; beep = 1; } } } ``` 这是基于51单片机,使用按键键盘和LCD1602显示屏设计的智能计算器软件源码。其使用了4个按键进行控制,按键K0~K3分别对应数字和运算符的输入、切换显示内容、清空屏幕和清零操作。源码实现通过按键输入数字和运算符,将输入内容显示LCD1602上。同时还实现了蜂鸣器功能,以便在按下按键时发出提示音。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皮卡丘吉尔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值