当前位置: 首页 > news >正文

显示器与按键(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

#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 1000Delay(50);}	
}

Delay.c

#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

#ifndef __DELAY_H
#define __DELAY_H#include <reg51.h>
#include <intrins.h>void Delay(unsigned int j);
#endif

lcd1602.h

#ifndef __LCD1602_H
#define __LCD1602_H#include <reg51.h>
#include <intrins.h>#define out P0										//数据到LCDtypedef 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

#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);}
}

http://www.lryc.cn/news/269660.html

相关文章:

  • 2020年认证杯SPSSPRO杯数学建模B题(第一阶段)分布式无线广播全过程文档及程序
  • 【CISSP学习笔记】7. 安全评估与测试
  • Gateway集成方法以及拦截器和过滤器的使用
  • 第G2周:人脸图像生成(DCGAN)
  • 【Web】Ctfshow Thinkphp5 非强制路由RCE漏洞
  • python3遇到Can‘t connect to HTTPS URL because the SSL module is not available.
  • QSPI Flash xip取指同时program过程中概率性出现usb播歌时断音
  • MySQL聚簇索引和非聚簇索引的区别
  • 【C#】蜗牛爬井问题C#控制台实现
  • IP地址的四大类型:动态IP、固定IP、实体IP、虚拟IP的区别与应用
  • Linux Debian12安装和使用ImageMagick图像处理工具 常见图片png、jpg格式转webp格式
  • JavaScript二
  • JavaScript系列——正则表达式
  • 命令行创建Vue项目
  • 01.PostgreSQL基本SELECT语句
  • UDP信号多个电脑的信息传输测试、配置指南
  • 先序+中序还原二叉树【数据结构】
  • 【全网首发】洛谷P2678 [NOIP2015 提高组] 跳石头
  • Gpt指引ubuntu安装java8/11
  • 【MCAL】TC397+EB-tresos之MCU配置实战 - 芯片时钟
  • 最新AI系统ChatGPT网站H5系统源码,支持AI绘画,GPT语音对话+ChatFile文档对话总结+DALL-E3文生图
  • 如何在MAC OS中的XCODE下添加 <bits/stdc++.h>
  • Maven项目提示Ignored pom.xml问题
  • SQL学习汇总
  • 单片机MCU堆栈概念与区别
  • C#中使用is关键字检查对象是否与给定类型兼容
  • AI时代下,如何看待“算法利维坦”?
  • Linux上管理不同版本的 JDK
  • 直方图与均衡化
  • Java——猫猫图鉴微信小程序(前后端分离版)