久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

AVR單片機(jī)密碼鎖程序(原創(chuàng))

作者:佚名   來源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2012年06月02日   【字體:
這是一款用AVR單片機(jī)實(shí)現(xiàn)的密碼鎖,它分別由硬件16個(gè)矩陣鍵盤、數(shù)碼管以及蜂鳴器組成的。系統(tǒng)正確的初始密碼為0123。當(dāng)我們按下按鍵次數(shù)在4次以內(nèi),系統(tǒng)才判斷密碼對與否,當(dāng)輸入密碼正確時(shí),蜂鳴器報(bào)響起,即表示密碼是正確的,當(dāng)我們按下按鍵的次數(shù)超過4次,即使按下的密碼正確,蜂鳴器也不響,還有按下密碼順序必須是0123,如果按下0213或者是其它的,都不能正常開蜂鳴器。如果按鍵次數(shù)超過4次了,密碼就無法正常輸入了,此時(shí)只要按下第16個(gè)按鍵時(shí),就可以回到初始狀態(tài),即清除我們以前按鍵按下的次數(shù),(因?yàn)槊艽a輸入時(shí)必須在4次以內(nèi)完成的,超過了4次你怎么輸,也進(jìn)入密碼判斷模式)此時(shí)就可以重新輸入正確的密碼了。另外當(dāng)按下按鍵時(shí),可以在數(shù)碼管上顯示我們按下的數(shù),以方便我們看我們按下的數(shù)是否正確。
硬件連接:矩陣按鍵接PD口,數(shù)碼管段接PB口,位控制端接PC4位,蜂鳴器接PA1口。
以下是完整程序下載地址:http://www.zg4o1577.cn/f/mmsavr.rar


#include<iom16v.h>
#include<macros.h>
#define uchar unsigned char
#define uint unsigned int
#define setb(val,bitn) (val|=(1<<(bitn)))//設(shè)置某IO口某位為1,即設(shè)置IO口進(jìn)行位操縱
#define clr(val,bitn) (val&=~(1<<(bitn)))//設(shè)置某IO口某位為0  即設(shè)置IO口進(jìn)行位操縱
#define get(val,bitn) (val&(1<<(bitn)))//讀取某位狀態(tài)如if(get(PORTC,7))即判斷PC7口是否為1 即設(shè)置IO口進(jìn)行位操縱
#pragma data:code//定義程序存在ROM里面
uchar yin,yin1,yin2,yin3;//4位密碼初始變量
uchar qing,qing1,qing2,qing3;//4位密碼比較變量
uchar num;//按鍵按下次數(shù)變量
uchar temp;//比較標(biāo)志位變量,即按下后比較變量與初始密碼變量比較,如果是相等,則些標(biāo)志位生效,它自動變量加1
const table[]={
0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90,
0x88,0x83,0xc6,0xa1,0x86,
0x8e,0xff
};
/***********************************************/
/*******************延時(shí)子程序******************/
/***********************************************/
void delay(uint z)
{
   uint x,y;
  for(x=0;x<50;x++)
  for(y=0;y<z;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;//設(shè)置PD口全為輸出
  PORTD=0XF0;//設(shè)置PD高四位為高電平,以便進(jìn)行判斷
  DDRD=0X0F;//設(shè)置高4位為輸入,低4位為輸出
  i=PIND;//讀出IO口狀態(tài)
  if(i==0XF0)//如果它等于0XF0就執(zhí)返回0
  {
    DDRD=0XFF;//將IO口值讀回來
    return 0;
  }
  else//否則它就執(zhí)返回1
  {
    DDRD=0XFF;
    return 1;
  }
}
/***********************************************/
/***************按鍵鍵值處理程序***************/
/***********************************************/
uchar key_scan()
{
    uchar key,i=0X7F,j;//將變量I設(shè)置為01111111B
 if(key_press())//判斷按鍵是否被按下了
 {
      delay(10);//如果被按下了,消下抖
   if(key_press())//再次判斷下按鍵是否被按下了
   {

     do//先執(zhí)行一次
  {
   i=(i<<1|i>>7);/*將變量I內(nèi)容左移1位,11111110
   然后將I右移7位,11111110,即實(shí)現(xiàn)11111110
   11111101 11111011 11110111*/
   PORTD=i;//將移位后的值給PD口
   DDRD=0X0F;//將PD口高位設(shè)為輸入,低位設(shè)為輸出
   key=PIND;//將IO口高位值讀一下
   j=key&0XF0;//只需要讀高4位
    }
  while(j==0XF0);//如果按鍵沒有按下,則再執(zhí)行上面的do語句

  while(key_press());//如果有按下則釋放一下
  num++;//計(jì)數(shù)改變變量值
  //if(num>3)
  //num=0;
  switch(key)//確定有按鍵按下了就判斷下到底是哪個(gè)值
  {
   
          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;//返回按鍵值
}
/******************************************************/
/*******************密碼判斷子程序*********************/
/******************************************************/
void mi()
{
   switch(num)
   {
     case 1://只有按鍵標(biāo)志位為1時(shí),說明按下的是第1次
   if(qing==yin)//此時(shí)第1位密碼比較變量與初始密碼變量比較,是否相等
   {
     temp++;//如果相等則將比較標(biāo)志位加1,以作記號
    qing=0xff;//作完記號后,將比較變量賦值,以便它再次記數(shù)標(biāo)志位變量
   }
   break;//返回
   case 2://只有按鍵標(biāo)志位為2時(shí),說明按下的是第2次
   if(qing1==yin1)
   {
     temp++;
    qing1=0xff;
   }
   break;
   case 3://只有按鍵標(biāo)志位為3時(shí),說明按下的是第3次
   if(qing2==yin2)
   {
     temp++;
    qing2=0xff;
   }
   break;
   case 4://只有按鍵標(biāo)志位為4時(shí),說明按下的是第4次
   if(qing3==yin3)
   {
     temp++;
    qing3=0xff;
   }
   break;
   }
   if(temp==4)//如果比較標(biāo)志位變量為4,則說明以上4個(gè)密碼是對的,此時(shí)蜂鳴器響起
   bbt();//調(diào)用蜂鳴器響起子程序
}
/***********************************************/
/*******************主程序*********************/
/***********************************************/
void main()
{
   uchar ik=16;//定義局部變量
  temp=0;//蜂鳴器計(jì)數(shù)變量變0
  num=0;//計(jì)數(shù)器清0
  yin=0;//密碼1
  yin1=1;//密碼2
  yin2=2;//密碼3
  yin3=3;//密碼4
  qing=qing1=qing2=qing3=0;//密碼比較變量清0
   DDRB=0xff;//設(shè)置PB口為輸出
  DDRC=0xff;//設(shè)置PC口為輸出
  while(1)
  {
     ik=key_scan();//將按鍵返回值給變量IK
/*****************第15個(gè)鍵按下時(shí)處理的程序*****************/
   if(ik==15)//如果按下了第15個(gè)鍵,就將按下的次數(shù)清0,即進(jìn)入初始化
   {
   num=0;//清0計(jì)數(shù)器
   temp=0;//清0計(jì)數(shù)器
   qing=qing1=qing2=qing3=0;//密碼比較變量清0
   }
/*****************數(shù)碼管顯示部分*****************/
     if(ik<16)//如果返回值小于16就在數(shù)碼
   xian(ik); //調(diào)用顯示子程序
   else//如果返回值不小于16,就顯示黑屏
   xian(16);
/*****************密碼判斷部分*****************/
                 mima();
  }
}

關(guān)閉窗口

相關(guān)文章

主站蜘蛛池模板: 3级毛片 | 成年人黄色免费视频 | 在线观看成人免费视频 | 国产精品一区二 | 日韩欧美高清dvd碟片 | 午夜影院在线观看视频 | 欧美精品一二三 | 成人久久久久久久久 | 日韩中文字幕在线观看视频 | www.888www看片 | 欧美综合久久 | 精品久久久久一区二区国产 | 免费黄色在线观看 | 艹逼网 | 国产激情一区二区三区 | 国产98色在线 | 日韩 | 亚洲人成在线播放 | 欧美日韩视频在线 | 亚洲国产精品美女 | 黄色网络在线观看 | 日韩在线资源 | 色婷婷综合久久久久中文一区二区 | 七七婷婷婷婷精品国产 | 人人做人人澡人人爽欧美 | 精品免费看 | 欧美日韩一 | av网站在线播放 | 中文字幕国产日韩 | 久久色视频| 欧美成年人视频在线观看 | 精品一区二区三区中文字幕 | 91久久久久久 | 都市激情亚洲 | 国产国产精品 | 欧美日一区二区 | 久久青 | 久草视频观看 | 北条麻妃av一区二区三区 | 亚洲精品国产成人 | 在线播放亚洲 | 欧美成人性生活 |