显示器与按键(LCD 1602 + button)

一、实验目的:

(1)学习lcd 1602的编程与使用、

(2)机械式复位开关button软件消抖的方法。

二、实验内容:

1、必做:先显示开机画面,:在1602显示器上,分两行分别居中显示字符" AHAU CHINA " 和 " I LOVE YOU "。然后从右向左移动直至消失。其中1602的rs、rw、en引脚分别使用单片机的P1.0、P1.1、P1.2引脚,数据引脚接单片机的P0口。

要求:(1)将两行字符存储在数组中。

(2)将lcd1602的基本操作都写到一个头文件中,供主函数文件调用。在主函数文件中,只处理与显示内容有关的业务。

提高版:两行逐个显示,两行字符全部出现后整体静态显示1秒左右,然后闪烁3次,最后从右向左移动直至消失。

2、接上1题(必做,按键button与lcd1602):当两行字符左移消失以后,在lcd1602的第一行居中显示:"a:?",其中?为a的值,随按键变化。

其中无符号字节型变量a初值为0,其值实时显示在lcd 1602上。当复位开关S1(设置)按下时,a的值闪烁显示;S2(增加)每按一次,a增1;直至a增为 9,再按一次S2,a 归 0;S3(减少)按键每按一次,a 自减 1; 如此反复,并将 a 的值实时送至lcd 1602以闪烁的形式显示出来"a:?",其中?为a的值,并闪烁显示。当按下S4(确认)时,a的值确定并不再闪烁。

其中S1、S2、S3、S4均为复位开关(button),即轻按接通、释放后自动复位断开。S1、S2、S3、S4与单片机的接口请遵照学习板电路的设置(见学习板电路原理图)。

要求:

(1)使用开关需要进行软件消抖(软件消抖方法在教材5.6.1和5.6.2中有介绍);

(2)注意lcd 1602基本操作的时序。

main.c

cpp 复制代码
#include "lcd1602.h"
#include "Delay.h"

unsigned char code date[]="  AHAU  CHINA " ;
unsigned char code time[]="  I   LOVE   YOU  ";

void char_writer()									// 写入两行待显示字符数组
{
	uchar i,j;
	for(i=0;i<16;i++)									// 写入第一行待显示字符数组
	{
		write_data(date[i]);
	}
	
	write_command(0x80+0x40);					// 更改地址到第二行
	
	for(j=0;j<16;j++)									// 写入第二行待显示字符数组
	{
		write_data(time[j]);
	}
}

void main()
{
	lcd_initial();										// 1602初始化
	char_writer();										// 写入两行待显示字符数组
	while(1)											
	{
		write_command(0x18);						// 字符左移消失0001 1000
		Delay(50);
	}	
}

Delay.c

cpp 复制代码
#include "Delay.h"

void delay(unsigned int j)									// 延时函数,此处使用晶振为11.0592MHz
{
	unsigned char i = 250;
	for(;j>0;j--)
	{
		while(--i);
		i = 249;
		while(--i);
		i = 250;
	}
}

Delay.h

cpp 复制代码
#ifndef __DELAY_H
#define __DELAY_H

#include <reg51.h>
#include <intrins.h>

void Delay(unsigned int j);
#endif

lcd1602.h

cpp 复制代码
#ifndef __LCD1602_H
#define __LCD1602_H

#include <reg51.h>
#include <intrins.h>

#define out P0										//数据到LCD

typedef unsigned int uint;
typedef unsigned char uchar;

sbit RS=P1^0;
sbit RW=P1^1;
sbit E=P1^2;

void check_busy();
void write_command( uchar com );
void write_data(uchar dat);
void lcd_initial();
void string(uchar ad, uchar *s);

#endif

lcd1602.c

cpp 复制代码
#include "lcd1602.h"
#include "Delay.h"

void check_busy()										//检查忙标志位
{
	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()									//液晶显示器初始化函数
{
	write_command(0x38);
	write_command(0x0C);
	write_command(0x05);
	write_command(0x01);
	Delay(1);
}

void string(uchar ad, uchar *s)			//输出显示字符串的函数
{
	write_command(ad);
	while(*s > 0)
	{
		write_data(*s++);
		Delay(100);
	}
}
相关推荐
llilian_162 小时前
小切口解决大问题:时序校准场景下的标准时间间隔脉冲信号发生器应用方案
功能测试·单片机·嵌入式硬件·51单片机
l1t2 小时前
用superpi、tinypi、tpi等工具计算圆周率的比较
c语言·算法
llilian_162 小时前
时间统一系统 高精度时统设备选购避坑指南 授时系统
大数据·网络·人工智能·功能测试·单片机·嵌入式硬件·51单片机
llilian_163 小时前
标准时间间隔发生器应用解决方案 脉冲发生器 时间测量仪
大数据·网络·人工智能·功能测试·单片机·嵌入式硬件·51单片机
HRTOS4 小时前
HRTOS 4.0 DEBUG:面向 8051 实时系统运行状态的轻量级调试组件
单片机·嵌入式硬件·51单片机
零依赖极客4 小时前
Day 8·1 自注意力机制:Q·K^T/softmax/V的在线计算
c语言·arm开发·人工智能·llama
水饺编程6 小时前
第5章,[Win32 章节] :在平面直角坐标系中描点
c语言·c++·windows·visual studio
linx2956 小时前
单元九 · 零基础路线图-第 7–9 周·类与 RAII
c语言·开发语言·数据结构·c++·嵌入式硬件·算法
无忧.芙桃6 小时前
嵌入式(一):嵌入式历史与计算机基础:从 ENIAC 到 MCU 四大技术方向
c语言·单片机·嵌入式硬件·计算机
一只旭宝6 小时前
Python 与 C/C++ 内存模型对比总结
c语言·c++·python