标题:
新手设计的简易单片机密码锁 LCD1602显示
[打印本页]
作者:
huwenxuan
时间:
2017-11-11 16:57
标题:
新手设计的简易单片机密码锁 LCD1602显示
新手设计的简易密码锁
单片机源程序如下:
/**************************************************************************************
* LCD1602液晶显示实验 *
实现现象: 具体接线操作请参考视频教程
下载程序后插上LCD1602液晶在开发板上,即可显示
注意事项:
***************************************************************************************/
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
#include "lcd.h"
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
#define GPIO_DIG P0
#define GPIO_KEY P1
sbit beep=P3^5;
sbit motor=P3^6;
u8 KeyValue; //用来存放读取到的键值
int count=0; //用来存放按键的次数
u8 Disp[]="set initial code";
u8 DispCode[]="input code";
u8 Dispcorrect[]="welcome back";
u8 Disperror[]="catch thief";
char code1[8],inicode[8];
/*******************************************************************************
* 函 数 名 : delay
* 函数功能 : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
while(i--);
}
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //显示0~F的值
/****************************************************
函数名: DigDisplay 数码管显示函数
函数功能: 输入显示的数字和点亮的数码管x,i;在对应的数码管上显示对应的数
*****************************************************/
void DigDisplay(int x,int i) //输入显示的数字和点亮的数码管x,i
{
switch(i) //位选,选择点亮的数码管,
{
case(0):
LSA=0;LSB=0;LSC=0; break;//显示第0位
case(1):
LSA=1;LSB=0;LSC=0; break;//显示第1位
case(2):
LSA=0;LSB=1;LSC=0; break;//显示第2位
case(3):
LSA=1;LSB=1;LSC=0; break;//显示第3位
case(4):
LSA=0;LSB=0;LSC=1; break;//显示第4位
case(5):
LSA=1;LSB=0;LSC=1; break;//显示第5位
case(6):
LSA=0;LSB=1;LSC=1; break;//显示第6位
case(7):
LSA=1;LSB=1;LSC=1; break;//显示第7位
}
P0=smgduan[x];//发送段码
P0=0x00;//消隐
delay(100); //间隔一段时间扫描
}
/***************************************************
函数名:KeyDown
矩阵键盘
1 2 3 A
4 5 6 B
7 8 9 C
* 0 # D
函数功能:
注意重点:成功按下一次后count记一次数,count初值为0
***************************************************/
void KeyDown()
{
int a=0;
int i=0;
GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f) //读取按键是否按下
{
delay(1000); //延时10ms进行消抖
if(GPIO_KEY!=0x0f) //再次检测键盘是否按下
{
count++; //按键按下一次记一次数
//测试列
GPIO_KEY=0X0F;
switch(GPIO_KEY)
{
case(0X07): KeyValue=1;break;
case(0X0b): KeyValue=2;break;
case(0X0d): KeyValue=3;break;
case(0X0e): KeyValue=10;break;
}
}
}
//测试行
/* 找出第四列单独处理*/
if(GPIO_KEY==0X0e)
{
GPIO_KEY=0XF0;
switch(GPIO_KEY)
{
case(0X70): KeyValue=KeyValue;break;
case(0Xb0): KeyValue=KeyValue+1;break;
case(0Xd0): KeyValue=KeyValue+2;break;
case(0Xe0): KeyValue=KeyValue+3;break;
}
}
//第一二三列的处理
else
{
GPIO_KEY=0XF0;
//单独处理第四行
if(GPIO_KEY==(0Xe0)&&KeyValue==1)
KeyValue='*';
if(GPIO_KEY==(0Xe0)&&KeyValue==2)
KeyValue=0;
if(GPIO_KEY==(0Xe0)&&KeyValue==3)
KeyValue='#';
switch(GPIO_KEY)
{
case(0X70): KeyValue=KeyValue;break;
case(0Xb0): KeyValue=KeyValue+3;break;
case(0Xd0): KeyValue=KeyValue+6;break;
}
}
while((a<50)&&(GPIO_KEY!=0xf0)) //检测按键松手检测
{
delay(1000);
a++;
}
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
u8 i;
int inicount;
int j,flag=0,count1=0,j1=0;
LcdInit();
for(i=0;i<16;i++) //显示set initial code
{
LcdWriteData(Disp[i]);
delay(1000000);
}
delay(100000000);
LcdWriteCom(0x01); //清屏
KeyValue=0; //给KeyValue一个初值,避免乱码
motor=0; //给motor一个初值,避免乱转
while(KeyValue!='#'||count<8)
{ //按键判断函数 输入初始密码 并存入inicode
KeyDown();
if(inicount!=count)
{
inicode[count1]=KeyValue;
count1++;
beep=0;
delay(200);
beep=1;
}
DigDisplay(count1,4);
DigDisplay(KeyValue,0);
inicount=count;
}
i=0;
while(i<200) //在数码管显示inicode
{
for(j=0;j<8;j++)
DigDisplay(inicode[j],j);
i++;
}
while(1)
{
for(i=0;i<10;i++)
{
LcdWriteData(DispCode[i]);
delay(10000);
}
KeyValue=0;
count=0;
count1=0;
inicount=0;
P0=0X00;
flag=0;
while(KeyValue!='#'||count<8)
{ //按键判断函数 输入密码并存入code1
KeyDown();
if(inicount!=count)
{
code1[count1]=KeyValue;
count1++;
beep=0;
delay(200);
beep=1;
}
DigDisplay(count1,4);
DigDisplay(KeyValue,0);
inicount=count;
}
i=0;
while(i<200)
{
for(j=0;j<8;j++)
DigDisplay(code1[j],j);
i++;
}
P0=0X00; LcdWriteCom(0x01); //清屏
flag=1;
for(j=0;j<8;j++)
{
if(code1[j]==inicode[j]) //密码匹配
++flag;
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
密码锁.zip
(51.32 KB, 下载次数: 55)
2017-11-11 16:56 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
qq43528494
时间:
2018-5-17 22:37
学习一下
作者:
萌新哦
时间:
2018-5-21 23:02
新手来学习学习
作者:
唐肃徊
时间:
2018-5-23 16:44
为啥子下不来,505
作者:
142857
时间:
2018-5-23 22:35
我来看下下
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1