您的位置 首页 制造

AVR单片机密码锁程序(原创)

这是一款用AVR单片机实现的密码锁,它分别由硬件16个矩阵键盘、数码管以及蜂鸣器组成的。系统正确的初始密码为0、1、2、3。当我们按下按键

这是一款用AVR单片机完结的暗码锁,它分别由硬件16个矩阵键盘、数码管以及蜂鸣器组成的。体系正确的初始暗码为0、1、2、3。当咱们按下按键次数在4次以内,体系才判别暗码对与否,当输入暗码正确时,蜂鸣器报响起,即表明暗码是正确的,当咱们按下按键的次数超越4次,即便按下的暗码正确,蜂鸣器也不响,还有按下暗码次序有必要是0、1、2、3,假如按下0、2、1、3或者是其它的,都不能正常开蜂鸣器。假如按键次数超越4次了,暗码就无法正常输入了,此刻只要按下第16个按键时,就能够回到初始状况,即铲除咱们曾经按键按下的次数,(由于暗码输入时有必要在4次以内完结的,超越了4次你怎样输,也进入暗码判别形式)此刻就能够从头输入正确的暗码了。别的当按下按键时,能够在数码管上显现咱们按下的数,以便利咱们看咱们按下的数是否正确。

硬件衔接:矩阵按键接PD口,数码管段接PB口,位操控端接PC低4位,蜂鸣器接PA1口。
以下是完好程序下载地址:http://www.51hei.com/f/mmsavr.rar

#include
#include
#define uchar unsigned char
#define uint unsigned int
#define setb(val,bitn) (val|=(1<<(bitn)))//设置某IO口某位为1,即设置IO口进行位操作
#define clr(val,bitn) (val&=~(1<<(bitn)))//设置某IO口某位为0 即设置IO口进行位操作
#define get(val,bitn) (val&(1<<(bitn)))//读取某位状况如if(get(PORTC,7))即判别PC7口是否为1 即设置IO口进行位操作
#pragma data:code//界说程序存在ROM里边
uchar yin,yin1,yin2,yin3;//4位暗码初始变量
uchar qing,qing1,qing2,qing3;//4位暗码比较变量
uchar num;//按键按下次数变量
uchar temp;//比较标志位变量,即按下后比较变量与初始暗码变量比较,假如是持平,则些标志位收效,它主动变量加1
const table[]={
0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90,
0x88,0x83,0xc6,0xa1,0x86,
0x8e,0xff
};
/***********************************************/
/*******************延时子程序******************/
/***********************************************/
void delay(uint z)
{
uint x,y;
for(x=0;x<50;x++)
for(y=0;y}
/***********************************************/
/*****************蜂鸣器响子程序****************/
/***********************************************/
void bbt()
{
setb(DDRA,1);
clr(PORTA,1);
delay(2550);
setb(PORTA,1);
delay(2550);
}
/***********************************************/
/*******************显现子程序******************/
/***********************************************/
void xian(uchar num)
{
uchar i;
PORTB=table[num];
PORTC=0x00;//翻开位选端
}
/***********************************************/
/***************按键按下处理程序***************/
/***********************************************/
uchar key_press()
{
uchar i;
DDRD=0XFF;//设置PD口全为输出
PORTD=0XF0;//设置PD高四位为高电平,以便进行判别
DDRD=0X0F;//设置高4位为输入,低4位为输出
i=PIND;//读出IO口状况
if(i==0XF0)//假如它等于0XF0就执回来0
{
DDRD=0XFF;//将IO口值读回来
return 0;
}
else//不然它就执回来1
{
DDRD=0XFF;
return 1;
}
}
/***********************************************/
/***************按键键值处理程序***************/
/***********************************************/
uchar key_scan()
{
uchar key,i=0X7F,j;//将变量I设置为01111111B
if(key_press())//判别按键是否被按下了
{
delay(10);//假如被按下了,消下抖
if(key_press())//再次判别下按键是否被按下了
{

do//先履行一次
{
i=(i<<1|i>>7);/*将变量I内容左移1位,11111110
然后将I右移7位,11111110,即完结11111110
11111101 11111011 11110111*/
PORTD=i;//将移位后的值给PD口
DDRD=0X0F;//将PD口高位设为输入,低位设为输出
key=PIND;//将IO口高位值读一下
j=key&0XF0;//只需要读高4位
}
while(j==0XF0);//假如按键没有按下,则再履行上面的do句子

while(key_press());//假如有按下则开释一下
num++;//计数改动变量值
//if(num>3)
//num=0;
switch(key)//确认有按键按下了就判别下到底是哪个值
{

case 0xEE:qing=0;
key=0x0;
break;
case 0xDE:qing1=1;
key=0x1;
break;
case 0xBE:qing2=2;
key=0x2;
break;
case 0x7E:qing3=3;
key=0x3;
break;
case 0xED:
key=0x4;
break;
case 0xDD:
key=0x5;
break;
case 0xBD:
key=0x6;
break;
case 0x7D:
key=0x7;
break;
case 0xEB:
key=8;
break;
case 0xDB:
key=9;
break;
case 0xBB:
key=0xA;
break;
case 0x7B:
key=0xB;
break;
case 0xE7:
key=0xC;
break;
case 0xD7:
key=0xD;
break;
case 0xB7:
key=0xE;
break;
case 0x77:
key=0xF;
break;
}
}
}
return key;//回来按键值
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/zhizao/255360.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部