1.制作所需材料:stc89c52单片机,普中51实验板,LCD屏幕

2.制作过程

        程序设计

打开Keil uVision5,新建工程文件。

编辑LCD驱动模块(直接使用下方代码即可)

创建一个.c文件,LCD1602.c       

#include <REGX52.H>//引脚配置:
sbit LCD_RS=P2^6;
sbit LCD_RW=P2^5;
sbit LCD_EN=P2^7;
#define LCD_DataPort P0//函数定义:
/*** @brief  LCD1602延时函数,12MHz调用可延时1ms* @param  无* @retval 无*/
void LCD_Delay()
{unsigned char i, j;i = 2;j = 239;do{while (--j);} while (--i);
}/*** @brief  LCD1602写命令* @param  Command 要写入的命令* @retval 无*/
void LCD_WriteCommand(unsigned char Command)
{LCD_RS=0;LCD_RW=0;LCD_DataPort=Command;LCD_EN=1;LCD_Delay();LCD_EN=0;LCD_Delay();
}/*** @brief  LCD1602写数据* @param  Data 要写入的数据* @retval 无*/
void LCD_WriteData(unsigned char Data)
{LCD_RS=1;LCD_RW=0;LCD_DataPort=Data;LCD_EN=1;LCD_Delay();LCD_EN=0;LCD_Delay();
}/*** @brief  LCD1602设置光标位置* @param  Line 行位置,范围:1~2* @param  Column 列位置,范围:1~16* @retval 无*/
void LCD_SetCursor(unsigned char Line,unsigned char Column)
{if(Line==1){LCD_WriteCommand(0x80|(Column-1));}else if(Line==2){LCD_WriteCommand(0x80|(Column-1+0x40));}
}/*** @brief  LCD1602初始化函数* @param  无* @retval 无*/
void LCD_Init()
{LCD_WriteCommand(0x38);//八位数据接口,两行显示,5*7点阵LCD_WriteCommand(0x0c);//显示开,光标关,闪烁关LCD_WriteCommand(0x06);//数据读写操作后,光标自动加一,画面不动LCD_WriteCommand(0x01);//光标复位,清屏
}/*** @brief  在LCD1602指定位置上显示一个字符* @param  Line 行位置,范围:1~2* @param  Column 列位置,范围:1~16* @param  Char 要显示的字符* @retval 无*/
void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char)
{LCD_SetCursor(Line,Column);LCD_WriteData(Char);
}/*** @brief  在LCD1602指定位置开始显示所给字符串* @param  Line 起始行位置,范围:1~2* @param  Column 起始列位置,范围:1~16* @param  String 要显示的字符串* @retval 无*/
void LCD_ShowString(unsigned char Line,unsigned char Column,char *String)
{unsigned char i;LCD_SetCursor(Line,Column);for(i=0;String[i]!='\0';i++){LCD_WriteData(String[i]);}
}/*** @brief  返回值=X的Y次方*/
int LCD_Pow(int X,int Y)
{unsigned char i;int Result=1;for(i=0;i<Y;i++){Result*=X;}return Result;
}/*** @brief  在LCD1602指定位置开始显示所给数字* @param  Line 起始行位置,范围:1~2* @param  Column 起始列位置,范围:1~16* @param  Number 要显示的数字,范围:0~65535* @param  Length 要显示数字的长度,范围:1~5* @retval 无*/
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{unsigned char i;LCD_SetCursor(Line,Column);for(i=Length;i>0;i--){LCD_WriteData(Number/LCD_Pow(10,i-1)%10+'0');}
}/*** @brief  在LCD1602指定位置开始以有符号十进制显示所给数字* @param  Line 起始行位置,范围:1~2* @param  Column 起始列位置,范围:1~16* @param  Number 要显示的数字,范围:-32768~32767* @param  Length 要显示数字的长度,范围:1~5* @retval 无*/
void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length)
{unsigned char i;unsigned int Number1;LCD_SetCursor(Line,Column);if(Number>=0){LCD_WriteData('+');Number1=Number;}else{LCD_WriteData('-');Number1=-Number;}for(i=Length;i>0;i--){LCD_WriteData(Number1/LCD_Pow(10,i-1)%10+'0');}
}/*** @brief  在LCD1602指定位置开始以十六进制显示所给数字* @param  Line 起始行位置,范围:1~2* @param  Column 起始列位置,范围:1~16* @param  Number 要显示的数字,范围:0~0xFFFF* @param  Length 要显示数字的长度,范围:1~4* @retval 无*/
void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{unsigned char i,SingleNumber;LCD_SetCursor(Line,Column);for(i=Length;i>0;i--){SingleNumber=Number/LCD_Pow(16,i-1)%16;if(SingleNumber<10){LCD_WriteData(SingleNumber+'0');}else{LCD_WriteData(SingleNumber-10+'A');}}
}/*** @brief  在LCD1602指定位置开始以二进制显示所给数字* @param  Line 起始行位置,范围:1~2* @param  Column 起始列位置,范围:1~16* @param  Number 要显示的数字,范围:0~1111 1111 1111 1111* @param  Length 要显示数字的长度,范围:1~16* @retval 无*/
void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{unsigned char i;LCD_SetCursor(Line,Column);for(i=Length;i>0;i--){LCD_WriteData(Number/LCD_Pow(2,i-1)%2+'0');}
}

然后,再创建一个头文件LCD1602.h(方便主函数调用)    

#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

LCD模块制作完成后,进行矩阵键盘模块的设计

根据开发板所给的原理图,我们可以进行如下设计

创建一个.c文件,命名为MatrixKey.c

#include <REGX52.H>
#include "Delay.h"unsigned char MatrixKey(){unsigned char KeyNumber=0;P1=0xFF;P1_3=0;if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=1;}if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=4;}if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=7;}P1=0xFF;P1_2=0;if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=2;}if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=5;}if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=8;}if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=10;}P1=0xFF;P1_1=0;if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=3;}if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=6;}if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=9;}P1=0xFF;P1_0=0;if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=11;}return KeyNumber;  }

上述程序段采用逐列扫描

首先是将串口初始化,令P1=0XEF也就是二进制的11111111

再依次将每列赋值0

若该列某个按键按下则通过行也为0,则可以通过行列的交叉判断出按键的位置

最后再对该按键进行赋值

由于单片机弱上拉(也就是1的输出能力有限,而0的作用效果较好),所以即便按键按下,vcc直接到gnd(打个比方)也能够进行判断。

想详细了解的话可以去问问度娘

下面编辑头文件MatrixKey.c

#ifndef__MatrixKEY_H__
#define__MatrixKEY_H__unsigned char MatrixKey();#endif

下面献上之前模块要用到的Delay函数

Delay.c

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

Delay.h

#ifndef __DELAY_H__
#define __DELAY_H__void Delay(unsigned int xms);#endif

马上就是最后的主函数环节了(喜)

main.c

#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "MatrixKey.h"
int num,count=0;
unsigned int password=0;void main()
{LCD_Init();LCD_ShowString(1,1,"password:");while(1){num=MatrixKey();if(num){if(count<4){password*=10;password+=num%10;}count++;}LCD_ShowNum(2,1,password,4);if (num==11){if(password==1234){LCD_ShowString(1,12,"     ");LCD_ShowString(1,14,"OK");password=0;count=0;LCD_ShowNum(2,1,password,4);}else{LCD_ShowString(1,12,"     ");LCD_ShowString(1,12,"worse");password=0;count=0;LCD_ShowNum(2,1,password,4);}}}
}

这一段的处理是对输入数字进行左移,并把输入个数限制在4个,而之所以选择4位,是因为LCD的数字显示最多到65535,超了会生成乱码。

num==11就是之前提到的确定键(赋值为11)

最后,将文件烧录进单片机即可

结尾

本篇文章参考B站江科大单片机教程,如果有疑问可以直接去看视频

本人也是一枚新手小白,如文章中有错误,还请多多指教

感谢大家的阅读

也祝大家新年快乐

基于stc89c52单片机的密码锁制作相关推荐

  1. 基于STC89C52单片机的密码锁设计与实现

    目 录 一.引言 3 1.1 课题研究背景及意义 3 1.2 课题设计的目的以及主要内容 4 二.系统硬件设计 5 2.1.系统硬件总体设计 5 2.2 单片机型号的选择 6 1.STC89C52单片 ...

  2. 基于51单片机的密码锁

    本次的项目是基于51单片机的密码锁,适合用来作为课程设计 主要实现了:密码锁功能,通过矩阵按键输入密码,输入范围为0-F,共有四位:同时,也可以使用更改按键更改密码,在更改时需要输入原密码来进入更改模 ...

  3. 基于51单片机蓝牙密码锁

    目录 一.项目需求 二.原理图 三.设计思路 四.实物 五.代码 资料下载地址:基于51单片机蓝牙密码锁-单片机文档类资源-CSDN下载 一.项目需求 1.采用DS1302时钟模块,通过该模块可检测当 ...

  4. 基于51单片机的无线遥控器制作

    基于51单片机的无线遥控器制作 资源链接:https://download.csdn.net/download/qq_41676952/10965512 目前单片机渗透到我们生活的各个领域,几乎很难找 ...

  5. C语言智能窗帘编码,基于STC89C52单片机智能窗帘控制系统.doc

    基于STC89C52单片机智能窗帘控制系统 基于STC89C52单片机智能窗帘控制系统 [摘要] 本设计以STC89C52单片机为主控芯片,接收并处理BH1750FVI光照传感器的光强信号.DS18B ...

  6. 温度警报c语言,基于STC89C52单片机温度报警器.doc

    基于STC89C52单片机温度报警器 摘 要 温度的检测与控制是工业生产过程中比较典型的应用之一,随着传感器在生产和生活中的更加广泛的应用,利用新型单总线式数字温度传感器实现对温度的测试与控制得到更快 ...

  7. 基于STM32单片机的密码锁(Proteus仿真+程序+报告)

    3-基于STM32单片机的密码锁 功能描述如下: 由STM32F103单片机最小系统+ 4*4矩阵键盘+LCD1602液晶显示+蜂鸣器+继电器模块: 1.采用STM32F103为主控芯片. 2.通过4 ...

  8. stc89c51单片机音乐盒系统设计_基于STC89C52单片机的七彩迷你音乐盒

    基于STC89C52单片机的七彩迷你音乐盒.在单片机最小系统的基础上,对其他两个I/O口连接硬件电路.P1.0接一个七彩快闪LED灯.P1.5口接一个NPN型三极管的放大电路,再连接一个无源蜂鸣器(用 ...

  9. 基于STC89C52单片机的霓虹灯

    基于STC89C52单片机的霓虹灯 1.设计要求 使用PWM驱动8个LED灯         人眼不能观察到灯光全灭         灯光要有动画效果 2.设计概述         本实验所用芯片为S ...

最新文章

  1. 伸展树算法c语言,数据结构伸展树介绍及C语言的实现方法
  2. Atitit apache 和guava的反射工具
  3. 专业写博一天------ArrayList 线程安全
  4. 【数学与算法】牛顿法的两种应用:求根和最优化
  5. k8s argo workflow获取登录token的命令
  6. 【数据结构与算法】数据结构与算法最基础理论
  7. php中文网 日历,php小型日历类库
  8. Go 应用优化“指北”
  9. 韩顺平 jdbc 之 mysql,(韩顺平讲解)jdbc学习(四)---java连接mysql
  10. 基于自适应扰动的疯狂蝴蝶算法-附代码
  11. 78M05-ASEMI三端正线性稳压器78M05
  12. Wondershare Flash Gallery Factory
  13. ESP8266制作物联网万能遥控器
  14. linux编译cu文件,Linux编译安装RTL8192CU芯片驱动
  15. 移动安全规范 — 1 -WIFI连接安全规范
  16. 2021年煤矿井下爆破考试内容及煤矿井下爆破考试资料
  17. 微信小程序单行缩进与多行缩进
  18. canvas将图片转成点阵
  19. VMware虚拟机安装kali linux 系统时黑屏,左上角光标一直闪
  20. Linux下一代防火墙bpfilter是什么?让我演示给你看

热门文章

  1. 纸上得来终觉浅,绝知此事要躬行 javadec
  2. 如何在黑群晖中修改服务器名字,如何在安装前及安装后修改黑群晖的Mac地址和Sn系列号...
  3. 希腊字母、拉丁字母、Markdown、拼写与读音中英对照表
  4. 暴力破解宽带,版本2
  5. VScode连接Linux出现:Host key verification failed.过程试图写入的管道不存在。
  6. 学生专用计算机操作手册,学生综合素质评价平台操作手册(PC版).pdf
  7. 微软日本将试行“上4休3”制度;苹果专卖店人脸识别误把学生当盗贼;腾讯在泰国推出了当地首个AI云平台……...
  8. 利用其他工具(非ADT)开发Android上的应用程序
  9. kettle发送邮件(多个接收人)
  10. JDK是什么 JDK的作用