第一个STC89C52项目(密码锁)

本文介绍了如何使用C语言和KeiluVision5编译工具开发一个简单的单片机密码锁系统,涉及延迟函数、LCD1602显示模块和矩阵键盘功能的实现。作者分享了关键函数代码,并详细解释了主函数的工作流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

工具:

这里可以用的语言有C,C++还有汇编,我用的是对于初学者比较友好的C语言。

编译软件我用的是Keil uVision5,烧录用的是STC—ISP。

本博客只提供了部分代码,如果需要完整代码请前往钦某/51project - 码云 - 开源中国 (gitee.com)

函数及模块:

1.延迟函数Delay

可以直接从STC—ISP上的软件延时计算器上拷贝

但是我这里用的Delay是根据b站上的up主修改过的,可以随意定义要延迟的时间,非常好用!

void Delay(unsigned int xms)
{
	unsigned char i, j;
  while(xms--)
	{	
		i = 2;
		j = 239;
		do
		{
				while (--j);
		} while (--i);
	}
}

2.液晶屏(LCD1602)显示模块

这个模块定义了许多函数,我们可以使用这些函数让屏幕上显示我们所需要的参数,这让我们在调试程序的时候更加方便直观。非常好用!

#ifndef __LCD1602_H__
#define __LCD1602_H__

//用户调用函数:
void LCD_Init();
void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char);
void LCD_ShowString(unsigned char Line,unsigned char Column,char *String);
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length);
void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);

#endif

3.矩阵键盘函数(MatrixKey)

将这个函数放入while(1)循环里就可以不断对矩阵键盘的8个I/O口进行扫描,如过按下某个键,此函数将会返回所对应的数值。非常好用!

#include <REGX52.H>
#include "Delay.h"
unsigned char MatrixKey()
{
	unsigned char KeyNumber=0;
	
	P1=0xFF;
	P1_3=0;
	if(P1_7==0){Delay(100);while(P1_7==0);Delay(100);KeyNumber=1;}
	if(P1_6==0){Delay(100);while(P1_7==0);Delay(100);KeyNumber=5;}
	if(P1_5==0){Delay(100);while(P1_7==0);Delay(100);KeyNumber=9;}
	if(P1_4==0){Delay(100);while(P1_7==0);Delay(100);KeyNumber=13;}
	
	P1=0xFF;
	P1_2=0;
	if(P1_7==0){Delay(100);while(P1_7==0);Delay(100);KeyNumber=2;}
	if(P1_6==0){Delay(100);while(P1_7==0);Delay(100);KeyNumber=6;}
	if(P1_5==0){Delay(100);while(P1_7==0);Delay(100);KeyNumber=10;}
	if(P1_4==0){Delay(100);while(P1_7==0);Delay(100);KeyNumber=14;}

	P1=0xFF;
	P1_1=0;
	if(P1_7==0){Delay(100);while(P1_7==0);Delay(100);KeyNumber=3;}
	if(P1_6==0){Delay(100);while(P1_7==0);Delay(100);KeyNumber=7;}
	if(P1_5==0){Delay(100);while(P1_7==0);Delay(100);KeyNumber=11;}
	if(P1_4==0){Delay(100);while(P1_7==0);Delay(100);KeyNumber=15;}

	P1=0xFF;
	P1_0=0;
	if(P1_7==0){Delay(100);while(P1_7==0);Delay(100);KeyNumber=4;}
	if(P1_6==0){Delay(100);while(P1_7==0);Delay(100);KeyNumber=8;}
	if(P1_5==0){Delay(100);while(P1_7==0);Delay(100);KeyNumber=12;}
	if(P1_4==0){Delay(100);while(P1_7==0);Delay(100);KeyNumber=16;}

	return KeyNumber;
}

声明:此函数是作者跟着江协科技up主写的,可能还有其它实现办法,但是相对来说这可能是最浅显易懂的一种方法。

主函数:

#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "MatrixKey.h"
#define password 2345 //初始密码

unsigned char KeyNum;
unsigned int Password,count;

void main()
{
	LCD_Init();
	LCD_ShowString(1,1,"Password:");
	while(1)
	{
		KeyNum=MatrixKey();
		if(KeyNum)
		{
			if(KeyNum<=10&&count<4)//s1—s10对等1 2 3 4 5 6 7 8 9 0
			{
					Password*=10;	//CSDN回文对称  http://t.csdnimg.cn/4cN6e
					Password+=KeyNum%10;//获取密码		
					count++;	
					LCD_ShowNum(2,1,Password,4);					//计次加一
			}
			if(KeyNum==11) //将s11设置成确认键
			{
				if(Password==password)
				{
					LCD_ShowString(1,11,"True ");
					Password = 0;         //清零
					count = 0;            //清零
					LCD_ShowNum(2,1,Password,4);	
				}
				else
				{
					LCD_ShowString(1,11,"False");
					Password = 0;         //清零
					count = 0;     				//清零
					LCD_ShowNum(2,1,Password,4);				
				}
			}
			if(KeyNum==12) //将s12设置为取消键
			{
				Password = 0;	          //清零
				count = 0;	            //清零
				LCD_ShowNum(2,1,Password,4);	
			}
		}
	}
}

Ⅰ.首先在主函数前面要包含一系列的头文件。

因为我们在做的是一个密码锁,那么就要有正确的密码,这里我把密码设置成4位,直接宏定义password方便修改。

Ⅱ.然后我们来到main函数里面。

LCD_Init();对LCD1602进行初始化,LCD_ShowString(1,1,"Password:");让Password:显示在屏幕的第一排第一列

Ⅲ.之后是我们的重头戏循环,我们要不间断的对键盘进行扫描:while(1)。定义一个KeyNum来接收MatrixKey()返回来的值并进行判断,如果KeyNum非0,进入到第一个if里面。

Ⅳ.我们将s1到s9设置为所对应的数字,s10设置为数字0,s11为确认,s12为取消。

第二个if判断了反回来的KeyNum范围在10以内,由于只有4位密码,为了防止多输入,我们再在外面定义一个计数器count默认值位0。并在第二个if同时判断count。在第二个if里面的代码在作者往期的博客里面有类似的,这里就不解释了。(详情:CSDN回文对称 http://t.csdnimg.cn/4cN6e)

Ⅴ.第三个if语句里面对按键s11进行了定义。

判断输入的密码是否和定义的密码相等,如果相等在LCD上显示“真” LCD_ShowString(1,11,"True ")否则显示“假” LCD_ShowString(1,11,"False")。(注意这里True比False少一个字母,应该在True后面加一个空格才能保证能把False全部覆盖掉。)之后将Password和count归零。

声明:这里除了让屏幕显示真假,还可以写一些函数代码让外部电机转动以此来实现物理上的开关

Ⅵ.第五个if语句定义了按键s12

当KeyNum等于12时将Password和count归零。

总结:

这个项目需要我们对单片机的各个外设有一定的认识并懂得使用,总的来说代码较为简单,逻辑比较复杂。随着对C语言和单片机学习的不断深入,我对计算机的底层逻辑的认识越来越清晰,

如果有什么错误,欢迎指出,如果有帮助,点个赞,谢谢。

<think>嗯,用户想了解Excel中的VLOOKUP函数的用法和参数含义。首先,我需要回忆一下VLOOKUP的基本结构。VLOOKUP是垂直查找函数,用于在表格的首列查找指定的值,然后返回该行中指定列的数据。它的四个参数分别是查找值、表格范围、列索引号和匹配模式。 接下来,我得确认每个参数的具体作用。第一个参数是lookup_value,也就是用户要查找的值,比如产品ID或者姓名。第二个参数是table_array,即查找的范围,这里要注意的是,查找值必须位于这个范围的第一列,否则函数无法正确工作。第三个参数是col_index_num,也就是用户想要返回的数据在表格范围中的第几列,这个列数是从表格范围的第一列开始算起的,不是整个工作表的列。第四个参数是range_lookup,决定是精确匹配还是近似匹配,通常用FALSE或0来指定精确匹配,避免错误。 然后,用户可能需要一个具体的例子来理解如何使用。比如,假设有一个产品价格表,用户想根据产品ID查找对应的价格。这时候,VLOOKUP就可以在ID列查找,然后返回价格列的数据。同时,要提醒用户注意表格范围最好使用绝对引用,比如$A$2:$C$100,这样在拖动公式时范围不会变化。 可能遇到的问题也需要考虑。比如,如果查找值不在表格的第一列,或者列索引号超过了表格的列数,函数会返回错误。此外,数据格式不一致也可能导致问题,比如查找值是数字,而表格中是文本格式的数字,这时候需要统一格式。还有,当出现#N/A错误时,可能是查找值不存在,或者匹配模式设置不正确,需要检查参数是否正确。 用户可能还会问到如何避免常见的错误,比如部分数据匹配出错的情况。这时候需要检查是否有多余的空格,或者数据格式不一致,或者表格范围没有锁定导致拖动时偏移。此外,XLOOKUP作为VLOOKUP的升级版,可能在某些情况下更方便,比如可以向左查找或者返回多列数据,这也是可以提及的内容。 最后,整理步骤,从基础语法到参数说明,再到具体案例,逐步引导用户理解如何使用VLOOKUP函数。同时,提供常见错误和解决方法,帮助用户在实际应用中避免问题。如果有必要,还可以比较VLOOKUP和其他查找函数的区别,比如HLOOKUP或XLOOKUP,但根据用户的问题,主要集中在VLOOKUP本身即可。</think>### Excel VLOOKUP函数详解 #### 一、基础语法与参数说明 VLOOKUP函数的语法为: $$=VLOOKUP(lookup\_value, table\_array, col\_index\_num, [range\_lookup])$$ 包含4个参数: 1. **lookup_value**(必填):要查找的值(如单元格引用或具体值) 2. **table_array**(必填):包含数据的表格范围(必须包含查找列和返回列) 3. **col_index_num**(必填):返回值所在列的序号(从table_array第一列开始计数) 4. **range_lookup**(可选):匹配类型 - `TRUE`/`1`:近似匹配(默认值,需数据升序排列) - `FALSE`/`0`:精确匹配(常用选项) [^1][^2] #### 二、使用步骤演示(工资表查询案例) 假设需要根据员工编号查询工资: 1. 建立查询单元格(如`B12`) 2. 输入公式: ```excel =VLOOKUP(A12, $A$2:$D$100, 4, 0) ``` - `A12`:待查询的员工编号 - `$A$2:$D$100`:锁定数据区域(绝对引用) - `4`:返回第4列(工资列) - `0`:精确匹配 [^2][^3] #### 三、常见错误与解决方法 | 错误现象 | 原因 | 解决方案 | |---------|------|---------| | #N/A | 查找值不存在 | 检查数据源或改用`IFERROR`容错 | | #REF! | 列序号超出范围 | 确认col_index_num ≤ 表格列数 | | 部分匹配失败 | 数据格式不一致 | 统一数值/文本格式 | | 结果错位 | 表格未锁定 | 使用`$`符号固定区域引用 | [^3][^4] #### 四、进阶技巧 1. **多条件查询**: 使用辅助列合并多个条件字段 ```excel =VLOOKUP(A2&B2, $D$2:$F$100, 3, 0) ``` 2. **通配符匹配**: `"*"`匹配任意字符,`"?"`匹配单个字符 ```excel =VLOOKUP("张*", $A$2:$C$100, 3, 0) ``` 3. **跨表查询**: 引用其他工作表数据 ```excel =VLOOKUP(A2, Sheet2!$A$2:$D$100, 4, 0) ``` [^1][^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

嶔某

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

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

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

打赏作者

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

抵扣说明:

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

余额充值