矩阵键盘控制LCD1602显示屏显示数字

这篇具有很好参考价值的文章主要介绍了矩阵键盘控制LCD1602显示屏显示数字。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 主函数部分,其中的LCD1602.h的头文件是在哔哩哔哩江科大自化协的博主的视频资料

#include <REGX51.H>
#include"LCD1602.h"

void Delay(int time)
unsigned char test(void);
unsigned char keynumber;
//int keynumber;

void main(void)
{
	keynumber = 0;
	LCD_Init();
	LCD_ShowString(1,1,"Hello,World!");
	while(1)
	{
		keynumber = test();//获取按下的按键数字
		if(keynumber)
		{
			LCD_ShowNum(2,1,keynumber,2);
		}
	}
}
void Delay(int time)		//延时函数(单位 毫秒)1 秒 = 1 毫秒
{
	unsigned char i, j;

	time = 2;//偷懒,就不需要一个一个的将20改为2了
	i = 2;
	j = 199;
	while(time--)
	{
	do
	{
		while (--j);
	} while (--i);
  }
	
}

unsigned char test(void)
{
	//while(1)
	{
	unsigned char Keynumber;
	Keynumber = 0;
	P0 = 0xFF;
	P0_4 = 0;//第一列置0
	//检测行
	if(P0_0 == 0)
	{
		Delay(1);//消抖
		while(P0_0 == 0)//检测按键是否还是按下状态
		{
			
		}//松手后跳出
		Delay(1);//再次消抖
		Keynumber = 1;
	}
		//return Keynumber;
		if(P0_1 == 0)
	{
		Delay(1);//消抖
		while(P0_0 == 0)//检测按键是否还是按下状态
		{
			
		}//松手后跳出
		Delay(1);//再次消抖
		Keynumber = 5;
	}
	if(P0_2 == 0)
	{
		Delay(1);//消抖
		while(P0_0 == 0)//检测按键是否还是按下状态
		{
			
		}//松手后跳出
		Delay(1);//再次消抖
		Keynumber = 9;
	}
	if(P0_3 == 0)
	{
		Delay(1);//消抖
		while(P0_0 == 0)//检测按键是否还是按下状态
		{
			
		}//松手后跳出
		Delay(1);//再次消抖
		Keynumber = 13;
	}
	//第一列检测完成
	
	//检测第二列
	P0 = 0xFF;
	P0_5 = 0;//第二列置0
	//检测行
	if(P0_0 == 0)
	{
		Delay(1);//消抖
		while(P0_0 == 0)//检测按键是否还是按下状态
		{
			
		}//松手后跳出
		Delay(1);//再次消抖
		Keynumber = 2;
	}
	if(P0_1 == 0)
	{
		Delay(20);//消抖
		while(P0_0 == 0)//检测按键是否还是按下状态
		{
			
		}//松手后跳出
		Delay(20);//再次消抖
		Keynumber = 6;
	}
	if(P0_2 == 0)
	{
		Delay(20);//消抖
		while(P0_0 == 0)//检测按键是否还是按下状态
		{
			
		}//松手后跳出
		Delay(20);//再次消抖
		Keynumber = 10;
	}
	if(P0_3 == 0)
	{
		Delay(20);//消抖
		while(P0_0 == 0)//检测按键是否还是按下状态
		{
			
		}//松手后跳出
		Delay(20);//再次消抖
		Keynumber = 14;
	}
	//第二列检测完成
	//检测第三列
	P0 = 0xFF;
	P0_6 = 0;//第三列置0
	//检测行
	if(P0_0 == 0)
	{
		Delay(20);//消抖
		while(P0_0 == 0)//检测按键是否还是按下状态
		{
			
		}//松手后跳出
		Delay(20);//再次消抖
		Keynumber = 3;
	}
	if(P0_1 == 0)
	{
		Delay(20);//消抖
		while(P0_0 == 0)//检测按键是否还是按下状态
		{
			
		}//松手后跳出
		Delay(20);//再次消抖
		Keynumber = 7;
	}
	if(P0_2 == 0)
	{
		Delay(20);//消抖
		while(P0_0 == 0)//检测按键是否还是按下状态
		{
			
		}//松手后跳出
		Delay(20);//再次消抖
		Keynumber = 11;
	}
	if(P0_3 == 0)
	{
		Delay(20);//消抖
		while(P0_0 == 0)//检测按键是否还是按下状态
		{
			
		}//松手后跳出
		Delay(20);//再次消抖
		Keynumber = 15;
	}
	//第三列检测完成
	//检测第四列
	P0 = 0xFF;
	P0_7 = 0;//第四列置0
	//检测行
	if(P0_0 == 0)
	{
		Delay(20);//消抖
		while(P0_0 == 0)//检测按键是否还是按下状态
		{
			
		}//松手后跳出
		Delay(20);//再次消抖
		Keynumber = 4;
	}
	if(P0_1 == 0)
	{
		Delay(20);//消抖
		while(P0_0 == 0)//检测按键是否还是按下状态
		{
			
		}//松手后跳出
		Delay(20);//再次消抖
		Keynumber = 8;
	}
	if(P0_2 == 0)
	{
		Delay(20);//消抖
		while(P0_0 == 0)//检测按键是否还是按下状态
		{
			
		}//松手后跳出
		Delay(20);//再次消抖
		Keynumber = 12;
	}
	if(P0_3 == 0)
	{
		Delay(20);//消抖
		while(P0_0 == 0)//检测按键是否还是按下状态
		{
			
		}//松手后跳出
		Delay(20);//再次消抖
		Keynumber = 16;
	}
		return Keynumber;
  }
}

总结:

    首先是我学习时遇到的问题:

在我一开始运行的时候出现的问题就是,一开始在给主函数的keynumber赋值的时候,等号的左值是叫做Matrixkey的函数,当我按下1按键时显示屏显示01,但是当我按下其他按键时,显示屏没有任何反应,一开始我也不明白是哪里错了,然后我重新创建了一个新的函数test,目的是将Matrixkey函数分成小部分,即按照一个按键的一个按键的逐一搬运到test函数,搬运第一个按键的时候就直接烧录,然后测试是哪一部分出的问题,我先搬运的是1和2,都没问题,于是我直接搬运了一整行,发现仍然没问题,直到我开始搬运第二行,有问题了,就是按下第一个,然后很快的就按下第二行的某个按键的时候,第二个数字没有马上显示,而是间隔了一段相对长的时间,当时想的是没出错就行,于是就继续做cv的工作,全部搬运完开始运行时,出现第二个问题,乱码,我当时想到的是延时的问题,于是就把延时的次数改成了time = 2,因此我的主函数虽然还是20,但是因为我偷懒,还是直接在Delay的内部给time赋值为2,然后问题就解决了,所以大概率是因为,按下第一个按键,再按下第二个按键后,第一个按键显示还没结束,就显示了第二个

    其次是我后面通过矩阵扫面明白的一个问题:

就是为什么这里在扫描时是将全部io口置1,然后在将要扫描的行置0,而不是前者置0后者置1,当然两种方法在做简单的程序的时候都是可行的,但是第一种更准确,51单片机的io口是双向输出输入的模式,采用的是若上拉输出(当输出的是高电平时,能够输出的电流很小,很容易被别的强下拉拉低),假设下列情况:

矩阵键盘控制LCD1602显示屏显示数字

 

情况一:

将所有io口置0,然后将要检测行置1,若按下按键1,有可能被置1的行会被拉低为0,所有的io口又变为了0,那就检测不到了,这是我个人的看法

情况二:

将所有io口置1,然后将要检测行置0,若按下按键1,也不易改变输出电平,检测更为准确文章来源地址https://www.toymoban.com/news/detail-513820.html

到了这里,关于矩阵键盘控制LCD1602显示屏显示数字的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32-基本知识梳理10-FSMC控制ST7789V-LCD液晶显示屏

    一、ST7789V-LCD液晶显示 1,一种计算机的I/O设备,即输入输出设备; 2,数据传递结构,光线的传递通过偏光片进行调整,最终传递到滤光片上,进而不同RGB数据点,即像素点; 3, LCD显示器的关键参数 ①像素:显示器的像素指它成像最小的点 ②分辨率:像素点的个数的乘积

    2024年02月12日
    浏览(37)
  • 51单片机矩阵键盘——LCD1602显示

    本次的实验需要用到LCD1602液晶屏,需要用到LCD1602.c 与LCD1602.h文件链接: https://download.csdn.net/download/YLG_lin/86404949 使用矩阵键盘随意按下按键,LCD1602第二行前两位就会显示对应按键按下的数字。 在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式 采用

    2023年04月09日
    浏览(34)
  • FPGA实现LCD显示屏显示彩条

    目录 总体设计  读显示屏ID  读显示屏ID代码 时钟分频  时钟分频代码  LCD显示 lcd显示模块 LCD驱动模块 lcd驱动代码 顶层模块 顶层模块代码 系统总体分为五个模块,分别是:rd_id(读显示屏ID模块),clk_div(时钟分频模块),lcd_display(lcd屏显示模块),lcd_driver(lcd屏驱动模块),和顶

    2024年02月16日
    浏览(33)
  • LCD拼接屏、LED显示屏和OLED显示屏的主要区别

    我们在生活或工作中经常看到大大小小的显示屏,但很多人却分不清楚这些屏到底属于哪一类,今天sostron与大家一起来分享下关于:LCD拼接屏、LED显示屏、OLED透明屏三者的区别。 LCD拼接屏、LED显示屏和OLED显示屏是不同类型的显示技术,它们在构成、工作原理和特点上存在明

    2024年02月17日
    浏览(37)
  • STM32—LCD液晶显示屏

    目录 LCD液晶显示屏介绍 液晶的组成  物理特性 液晶显示屏内部构造  颜色深度 点亮LCD显示屏 查看原理图 图片显示 保存到工程用户代码的Inc目录下 参数为数组名 字符显示  汉字显示 某些物质在熔融状态或被溶剂溶解之后,尽管失去固态物质的刚性,却获得了液体的易流动

    2024年02月04日
    浏览(39)
  • 【STM32篇】驱动LCD显示屏

    本次使用的硬件设备为野火的霸道V2开发板,显示器控制芯片型号为ILI9341,实际型号为ST7789V。在编写代码时参考的是ILI9341数据手册,二者差别不大,都是240*320分辨率。         ILI9341是一个用于TFT液晶显示的单芯片控制驱动器,具有262144色的240RGB x 320像素显示解决方案。

    2024年02月12日
    浏览(36)
  • LCD12864显示屏原理及使用教程

            LCD12864液晶显示模块是 128×64点阵的汉字图形型液晶显示模块,可显示汉字及图形,内置 8192个中文汉字(16X16 点阵)(需带有字库的型号才能显示中文)、128 个字符(8X16 点阵)及 64X256 点阵显示 RAM(GDRAM)。可与 CPU 直接接口,提供两种界面来连接微处理机:8

    2024年01月19日
    浏览(33)
  • STM32F103系列 Proteus仿真 4*4矩阵键盘 串口+LCD1602显示

            最近一直在肝STM32系列芯片,这里我想要检验一下自己的初步学习成果,简单的运用一下IO口的配置,代码使用正点的库函数模板写的,仿真软件是Proteus 8.13,代码编写编译软件是Keil MDK5,仿真芯片是STM32F103R6小容量芯片。 目录 一、硬件设计  二、软件设计 1、L

    2024年02月03日
    浏览(39)
  • FPGA学习笔记03——RGB LCD显示屏

    LCD屏与FPGA芯片接口如下,其中LCD_R0—R7,G0—G7,B0—B7为RGB888信号, LCD_BL:背光板使能,为高时背光板才亮 LCD_DE:RGB数据使能,为高时RGB数据有效 LCD_VSYNC:竖直(列)扫描有效 LCD_HSYNC:水平(行)扫描有效 LCD_CLK:显示器时钟 //在控制RGB LCD屏时,即可使用DE使能,也能用VSY

    2024年02月03日
    浏览(29)
  • STM32 使用LCD12864显示屏(串行方式)

    12864LCD液晶显示模块是一款4位/8位并行、2线或3线接口方式,内部含有国际一级、二级简体中文字库的图形点阵液晶模块。显示分辨率为128 64,内置8198个16 16点汉字,和128个16*8点ASCII字符集。 CS片选信号 (如果只有一款屏,可以将CS直接接到VCC上,实现两线通讯。) SID数据传

    2024年02月05日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包