单片机C语言实例:32、实用密码锁

程序实例1:延时函数

#ifndef __DELAY_H__
#define __DELAY_H__
/*------------------------------------------------uS延时函数,含有输入参数 unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下 T=tx2+5 uS 
------------------------------------------------*/
void DelayUs2x(unsigned char t);
/*------------------------------------------------mS延时函数,含有输入参数 unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t);#endif

 

#include "delay.h"
/*------------------------------------------------uS延时函数,含有输入参数 unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下 T=tx2+5 uS 
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{   while(--t);
}
/*------------------------------------------------mS延时函数,含有输入参数 unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t)
{while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}
}

程序实例2:1602驱动

#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include<intrins.h>#ifndef __1602_H__
#define __1602_H__bit LCD_Check_Busy(void) ;void LCD_Write_Com(unsigned char com) ;void LCD_Write_Data(unsigned char Data) ;void LCD_Clear(void) ;void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) ;void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) ;void LCD_Init(void) ;#endif
#include "1602.h"
#include "delay.h"#define CHECK_BUSYsbit RS = P2^4;   //定义端口 
sbit RW = P2^5;
sbit EN = P2^6;#define RS_CLR RS=0 
#define RS_SET RS=1#define RW_CLR RW=0 
#define RW_SET RW=1 #define EN_CLR EN=0
#define EN_SET EN=1#define DataPort P0/*------------------------------------------------判忙函数
------------------------------------------------*/
bit LCD_Check_Busy(void) 
{ 
#ifdef CHECK_BUSYDataPort= 0xFF; RS_CLR; RW_SET; EN_CLR; _nop_(); EN_SET;return (bit)(DataPort & 0x80);
#elsereturn 0;
#endif
}/*------------------------------------------------写入命令函数
------------------------------------------------*/
void LCD_Write_Com(unsigned char com) 
{  while(LCD_Check_Busy()); //忙则等待RS_CLR; RW_CLR; EN_SET; DataPort= com; _nop_(); EN_CLR;
}
/*------------------------------------------------写入数据函数
------------------------------------------------*/
void LCD_Write_Data(unsigned char Data) 
{ while(LCD_Check_Busy()); //忙则等待RS_SET; RW_CLR; EN_SET; DataPort= Data; _nop_();EN_CLR;
}/*------------------------------------------------清屏函数
------------------------------------------------*/
void LCD_Clear(void) 
{ LCD_Write_Com(0x01); DelayMs(5);
}/*------------------------------------------------写入字符串函数
------------------------------------------------*/
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) 
{           while (*s) {     LCD_Write_Char(x,y,*s);     s ++;  x++;   }}/*------------------------------------------------写入字符函数
------------------------------------------------*/
void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) 
{     if (y == 0) {     LCD_Write_Com(0x80 + x);     }    else {     LCD_Write_Com(0xC0 + x);     }        LCD_Write_Data( Data);  
}/*------------------------------------------------初始化函数
------------------------------------------------*/
void LCD_Init(void) 
{LCD_Write_Com(0x38);    /*显示模式设置*/ DelayMs(5); LCD_Write_Com(0x38); DelayMs(5); LCD_Write_Com(0x38); DelayMs(5); LCD_Write_Com(0x38);  LCD_Write_Com(0x08);    /*显示关闭*/ LCD_Write_Com(0x01);    /*显示清屏*/ LCD_Write_Com(0x06);    /*显示光标移动设置*/ DelayMs(5); LCD_Write_Com(0x0C);    /*显示开及光标设置*/
}

程序实例3:按键驱动

#ifndef __KEYBOARD_H__
#define __KEYBOARD_H__/*------------------------------------------------
按键扫描函数,返回扫描键值
------------------------------------------------*/
unsigned char KeyScan(void);  //键盘扫描函数,使用行列反转扫描法/*------------------------------------------------
按键值处理函数,返回扫键值
------------------------------------------------*/
unsigned char KeyPro(void);#endif
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include"keyboard.h"
#include"delay.h"#define KeyPort P3/*------------------------------------------------
按键扫描函数,返回扫描键值
------------------------------------------------*/
unsigned char KeyScan(void)  //键盘扫描函数,使用行列反转扫描法
{unsigned char cord_h,cord_l;//行列值中间变量KeyPort=0x0f;            //行线输出全为0cord_h=KeyPort&0x0f;     //读入列线值if(cord_h!=0x0f)    //先检测有无按键按下{DelayMs(10);        //去抖if((KeyPort&0x0f)!=0x0f){cord_h=KeyPort&0x0f;  //读入列线值KeyPort=cord_h|0xf0;  //输出当前列线值cord_l=KeyPort&0xf0;  //读入行线值while((KeyPort&0xf0)!=0xf0);//等待松开并输出return(cord_h+cord_l);//键盘最后组合码值}}return(0xff);     //返回该值
}/*------------------------------------------------
按键值处理函数,返回扫键值
------------------------------------------------*/
unsigned char KeyPro(void)
{switch(KeyScan()){case 0x7e:return 0;break;//0 按下相应的键显示相对应的码值case 0x7d:return 1;break;//1case 0x7b:return 2;break;//2case 0x77:return 3;break;//3case 0xbe:return 4;break;//4case 0xbd:return 5;break;//5case 0xbb:return 6;break;//6case 0xb7:return 7;break;//7case 0xde:return 8;break;//8case 0xdd:return 9;break;//9case 0xdb:return 10;break;//acase 0xd7:return 11;break;//bcase 0xee:return 12;break;//ccase 0xed:return 13;break;//dcase 0xeb:return 14;break;//ecase 0xe7:return 15;break;//fdefault:return 0xff;break;}
}

程序实例4:main文件

#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include<stdio.h>
#include"1602.h"
#include"delay.h"
#include"keyboard.h"unsigned char code password[]={1,2,3,4,5,6,7,8};//可以更改此密码做多组测试
//定义密码,实际上密码需要存在eeprom中,可以通过程序更改。请用户自行添加/*------------------------------------------------主程序
------------------------------------------------*/
main()
{unsigned char num,i,j;                  unsigned char passwordtemp[16];        //最大输入16个unsigned char inputtimes;              //密码输入错误次数unsigned char passwordlength,PLEN;     //输入密码长度,实际密码长度bit Flag;PLEN=sizeof(password)/sizeof(password[0]);//用于计算出实际密码长度LCD_Init();         //初始化液晶屏DelayMs(10);        //延时用于稳定,可以去掉LCD_Clear();        //清屏LCD_Write_String(0,0,"  Welcome! ");    //写入第一行信息,主循环中不再更改此信息,所以在while之前写入LCD_Write_String(0,1,"Input password!");    //写入第二行信息,提示输入密码while (1)         //主循环{num=KeyPro();  //扫描键盘if(num!=0xff)  //如果扫描是按键有效值则进行处理{ if(i==0)    //输入是第一个字符的时候需要把改行清空,方便观看密码LCD_Write_String(0,1,"                ");//清除该行if(i<16){passwordtemp[i]=num;LCD_Write_Char(i,1,'*');//输入的密码用"*"代替}i++;   //输入数值累加if((15==num)|| (i==16))//输入按键值15或者密码输入到最大值16,表示输入结束,需要进行比对{passwordlength=i-1;  //计算输入密码长度i=0;  //计数器复位if(passwordlength==PLEN)//长度相等则比较,否则直接输出错误{Flag=1;//先把比较位置1for(j=0;j<PLEN;j++)//循环比较8个数值,如果有一个不等 则最终Flag值为0Flag=Flag&&(passwordtemp[j]==password[j]);//比较输入值和已有密码}if(Flag)//如果比较全部相同,标志位置1{LCD_Write_String(0,1,"                ");//清除该行LCD_Write_String(0,1,"Right Open!>>>>");//密码正确显示的信息inputtimes=0;//输入正确则次数清零,重新计数Flag=0;      //清除正确标志}else {LCD_Write_String(0,1,"                ");//清除该行LCD_Write_String(0,1,"Wrong! Retry!");//密码错误,提示重新输入inputtimes++;//连续输入错误,则次数累加if(inputtimes==3){LCD_Write_String(0,1,"                ");//清除该行LCD_Write_String(0,1,"Wrong 3 times!");//密码错误,提示重新输入while(1);//停止该位置,重启电源后才能输入,实际实用中则需要等到一定时间后才能再次输入。}}}}	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/79853.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python stomp 发送消息无法显示文本

我们向消息服务器通过 stomp 发送的是文本消息。 当消息服务器发送成功后&#xff0c;消息服务器上的文本没有显示&#xff0c;显示的是 2 进制的数据。 如上图&#xff0c;消息没有作为文本来显示。 问题和解决 消息服务器是如何判断发送的小时是文本还是二进制的。 根据官…

go-GC垃圾回收

GC GC是自动化内存管理回收机制 虚拟内存函数栈的数据是会根据函数返回而自动销毁的&#xff0c;而堆上的数据是不会随着函数自动销毁的&#xff0c;堆内数据会随着程序运行而逐渐变大&#xff0c;从而导致内存OOM&#xff0c;Go语言就用了GC来清理堆上的内存数据。 如何区分…

【剑指Offer】57.和为s的两个数字

题目 输入一个递增排序的数组和一个数字s&#xff0c;在数组中查找两个数&#xff0c;使得它们的和正好是s。如果有多对数字的和等于s&#xff0c;则输出任意一对即可。 示例 1&#xff1a; 输入&#xff1a;nums [2,7,11,15], target 9 输出&#xff1a;[2,7] 或者 [7,2]…

tomcat架构概览

https://blog.csdn.net/ldw201510803006/article/details/119880100 前言 Tomcat 要实现 2 个核心功能&#xff1a; 处理 Socket 连接&#xff0c;负责网络字节流与 Request 和 Response 对象的转化。加载和管理 Servlet&#xff0c;以及具体处理 Request 请求。 因此 Tomc…

CSS盒子模型

盒子模型的组成 CSS会把所有的HTML元素都看成一个盒子&#xff0c;所有的样式也都是基于这个盒子 content&#xff08;内容&#xff09;&#xff1a;盒子的内容padding&#xff08;内边距&#xff09;&#xff1a;用于控制元素内部与边框之间的距离border&#xff08;边框&…

让NPU跑起来迅为RK3588开发板设置交叉编译器

让NPU跑起来迅为RK3588开发板设置交叉编译器 编译器下载地址是网盘资料“iTOP-3588 开发板\02_【iTOP-RK3588 开发板】开发资料 \12_NPU 使用配套资料\03_编译所需工具\Linux”。 拷贝 gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.gz 到 Ubuntu 的/opt/tool_ch…

分类预测 | MATLAB实现PCA-GRU(主成分门控循环单元)分类预测

分类预测 | MATLAB实现PCA-GRU(主成分门控循环单元)分类预测 目录 分类预测 | MATLAB实现PCA-GRU(主成分门控循环单元)分类预测预测效果基本介绍程序设计参考资料致谢 预测效果 基本介绍 Matlab实现基于PCA-GRU主成分分析-门控循环单元多输入分类预测&#xff08;完整程序和数据…

八股文学习三(jvm+线程池+锁)

1. jvm (1)概念 JVM是可运行 Java 代码的假想计算机 &#xff0c;包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收&#xff0c;堆 和 一个存储方法域。JVM 是运行在操作系统之上的&#xff0c;它与硬件没有直接的交互。 java运行过程&#xff1a; 我们都知道 Java…

Git在已有的项目中引入Submodule子模块管理:添加、更新、删除(实战示例代码)

前言 在进行Git版本控制的过程中&#xff0c;有时候我们需要在已有的项目中引入子模块&#xff0c;以便复用其他独立的Git存储库的代码或文件。本文将详细介绍如何在已有项目下添加、更新和删除Git的Submodule子模块&#xff0c;并提供相关的示例代码。 实战场景 假设我们已…

git简单命令

简易的命令行入门教程: Git 全局设置: git config --global user.name “yyyyjinying” git config --global user.email “12343343qq.com” 创建 git 仓库: mkdir wx-project cd wx-project git init touch README.md git add README.md git commit -m “first commit” …

C#,数值计算——Hashfn1的计算方法与源程序

1 文本格式 using System; using System.Collections; using System.Collections.Generic; namespace Legalsoft.Truffer { public class Hashfn1 { private Ranhash hasher { get; set; } new Ranhash(); private int n { get; set; } public Hash…

C语言volatile关键字

在C语言中&#xff0c;volatile是一个类型修饰符&#xff0c;用于告诉编译器对象的值可能会在编译器无法检测到的情况下被改变。这通常发生在以下两种情况&#xff1a; 硬件的输入/输出操作&#xff0c;例如一个设备寄存器的读取或写入。共享内存的并行程序&#xff0c;其中一…

php出现SSL certificate problem: unable to get local issuer certificate的解决办法

当在本地使用curl或者一些其它封装好的http类库或组件&#xff08;如php界 知名的 http客户端 Guzzle&#xff09;需要访问https时&#xff0c;如果本地没有配置证书&#xff0c;会出现SSL certificate problem: unable to get local issuer certificate的报错信息。 解决办法一…

自动控制原理

控制论一词Cybernetics&#xff0c;来自希腊语&#xff0c;原意为掌舵术&#xff0c;包含了调节、操纵、管理、指挥、监督等多方面的涵义。因此“控制”这一概念本身即反映了人们对征服自然与外在的渴望&#xff0c;控制理论与技术也自然而然地在人们认识自然与改造自然的历史中…

TCP IP网络编程(六) 基于UDP的服务器端、客户端

文章目录 一、理解UDP1.UDP套接字的特点2.UDP内部工作原理3.UDP的高效使用 二、实现基于UDP的服务器端、客户端1.UDP中的服务端和客户端没有连接2.UDP服务器端和客户端均只需要一个套接字3.基于UDP的数据I/O函数4.基于UDP的回声服务器端、客户端5.UDP客户端套接字的地址分配 三…

IDEA中创建Java Web项目1

一、File-> New -> Project... 1. 项目类型中选择 Java Enterprise 项目 2. Name&#xff1a;填写自己的项目名称 3. Project template&#xff1a;选择项目的模板&#xff0c;Web application。支持JSP和Servlet的项目 4. Application server&#xff1a;选择应用服务…

【C++11保姆级教程】列表初始化(Literal types)和委派构造函数(delegating))

文章目录 前言一、列表初始化 (List Initialization)1.1数组初始化1.2结构体初始化1.3容器初始化1.4列表初始化的优势 二、委派构造函数 (Delegating Constructors)2.1委派构造函数是什么&#xff1f;2.2委派构造函数示例代码2.3调用顺序2.3委派构造函数优势 总结 前言 C11引入…

MySQL基础运维知识点大全

一. MySQL基本知识 1. 目录的功能 通用 Unix/Linux 二进制包的 MySQL 安装下目录的相关功能 目录目录目录binMySQLd服务器&#xff0c;客户端和实用程序docs信息格式的 MySQL 手册manUnix 手册页include包括&#xff08;头&#xff09;文件lib图书馆share用于数据库安装的错…

数据结构-leetcode-数组形式的整数加法

解题图解&#xff1a; 下面是代码&#xff1a; /*** Note: The returned array must be malloced, assume caller calls free().*/ int* addToArrayForm(int* num, int numSize, int k, int* returnSize){int k_tem k;int klen0;while(k_tem){//看看k有几位k_tem /10;klen;}i…

激活函数总结(三十五):激活函数补充(KAF、Siren)

激活函数总结&#xff08;三十五&#xff09;&#xff1a;激活函数补充 1 引言2 激活函数2.1 KAF激活函数2.2 Siren激活函数 3. 总结 1 引言 在前面的文章中已经介绍了介绍了一系列激活函数 (Sigmoid、Tanh、ReLU、Leaky ReLU、PReLU、Swish、ELU、SELU、GELU、Softmax、Softp…