找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1467|回复: 1
打印 上一主题 下一主题
收起左侧

单片机密码锁

[复制链接]
跳转到指定楼层
楼主
ID:272436 发表于 2018-1-6 17:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg51.h>
#include <intrins.h>
sbit DX=P2^0;
sbit WX=P2^1;
sbit red=P2^2;
sbit green=P2^3;
unsigned char flag=0,esc=0;
unsigned char admin[8]={0,1,2,3,4,5,6,7};
unsigned char password[8]={16,16,16,16,16,16,16,16};//存放输入的按键,初始为16,不显示
unsigned char code table[] = {
0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x00};
unsigned char code keycode[]={
0xee,0xde,0xbe,0x7e,
0xed,0xdd,0xbd,0x7d,
0xeb,0xdb,0xbb,0x7b,
0xe7,0xd7,0xb7,0x77
};
void delay(unsigned int xms)//延时xms 毫秒
{
  unsigned int i,j;
  for(i=0;i<=xms;i++)
  for(j=0;j<=110;j++);
}
unsigned char cmpstr(unsigned char p[],unsigned char q[])
{
unsigned char j=1;
int i;
for(i=7;i>=0;i--)
if(p[i]!=q[i])
{
   j=0;
  break;
}
  return j;
}
unsigned char keyscan()//4*4矩阵按键扫描函数:(要去抖) 扫描哪个键被按下。若有按键按下,返回对应的按键值(0-15),否则返回16
{ unsigned char i=16,hang,temp;//初值设置为16,目的是:没有按键按下时返回16;
                               //若不设初值(默认值为0) ,没有按键按下时,将返回0,会显示0,误认为0被按下
P1=0x0f;//列输出全0,行输出全1
temp=P1;//读行列输入
if(temp!=0x0f) //若无按键按下,输入仍为0x0f ;若有按键按下对应行输入变为0,其他不变
{ delay(10);//去抖
  temp=P1;//再次读行列输入
if(temp!=0x0f)
{ hang=temp^0xf0;
P1=hang;//输出行扫描信号
temp=P1;//读行列输入
for(i=0;i<16;i++)
if(temp==keycode[i])
break;
P1=0x0f;//检测按键是否释放
while((temp=P1)!=0x0f);
}
}
return(i);
}
void display()//数码管动态显示一个字符串(不超过8位)函数*/
{
unsigned char i;
unsigned char wtemp=0xfe;//位选
  unsigned char tag=0;//高位连续0标记
for(i=1;i<=8;i++)
{
  P0=0xff;//位选消影
  WX=1;//开位选
  P0=wtemp;//送位选
  WX=0;//锁存位选
  wtemp=_crol_(wtemp,1);//更新位选变量
  P0=0x00; //段选消影
  DX=1;//开段选
  P0=table[password[i-1]]; //送段选
  DX=0;//锁存段选
  delay(1);
}
}
void clear()
{
unsigned char i;
for(i=0;i<8;i++)
  password[i]=16;
  display();
}
void main()
{
//外部中断初始化
EA=1;//总中断允许
EX0=1;//INT0中断允许
IT0=1;//下降沿触发中断
while(1)
{
P1=0xf0;//送测试信号,若有按键按下,与门输出0,触发外部中断,否则与门输出1,不会产生外部中断
display(); //显示输入的数据
if(flag==1)
{
if(cmpstr(password,admin)==1)
  {
    green=0;
  }
  else
  {
          red=0;
  }
clear();
delay(3000);
flag=0;
}
else
{
green=1;
red=1;
}
if(esc==1)
{  
clear();
esc=0;
}
}
}
void EX_INT0() interrupt 0
{
unsigned char i,y;
y=keyscan();
if(y<10)
{
for(i=0;i<7;i++)
{
password[i]=password[i+1];//左移
}
password[7]=y;
}
if(y==10)
    esc=1;
if(y==11)
  flag=1;
}

评分

参与人数 1黑币 +5 收起 理由
BH2RSJ + 5

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:272436 发表于 2018-1-6 18:02 | 只看该作者
代码是对的,大家可以看看
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表