新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > AVR单片机密码锁程序

AVR单片机密码锁程序

作者:时间:2012-08-02来源:网络收藏

这是一款用单片机实现的,它分别由硬件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

#includeiom16v.h>
#includemacros.h>
#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;x50;x++)
for(y=0;yz;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=(i1|i>>7);/*将变量I内容左移1位,11111110
然后将I右移7位,11111110,即实现11111110
11111101 11111011 11110111*/
PORTD=i;//将移位后的值给PD口
DDRD=0X0F;//将PD口高位设为输入,低位设为输出
key=PIND;//将IO口高位值读一下
j=key0XF0;//只需要读高4位
}
while(j==0XF0);//如果按键没有按下,则再执行上面的do语句

while(key_press());//如果有按下则释放一下
num++;//计数改变变量值
//if(num>3)
//num=0;

蜂鸣器相关文章:蜂鸣器原理

上一页 1 2 下一页

关键词: AVR 密码锁 矩阵键盘

评论


相关推荐

技术专区

关闭