#include "reg52.h"
typedef unsigned int u16;
typedef unsigned char u8;
u8 key;
u8 a,b,c,i,p=0;
u8 code Tab[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
#define DGIO_DIG P0 // 變數定義
#define DGIO_key P1
sbit beep=P2^0;
sbit led0=P2^1;
sbit led1=P2^2;
sbit led2=P2^3;
sbit led3=P2^4;
sbit L0=P3^7;
sbit L1=P3^6;
sbit relay=P3^5;
sbit k2=P3^2;
u8 tre=0;
void delay(u16 i) //延時1us
{
while(i--);
}
void dig() // 矩形按鍵 判斷
{
DGIO_key=0x0f;
if (DGIO_key!=0x0f && !tre)
{
delay(1000);
tre=1;
L0=0;
delay(2000);
L0=1;
if(DGIO_key!=0x0f)
{
switch(DGIO_key)
{
case(0x07): key=0; break; //檢查行
case(0x0b): key=1; break;
case(0x0d): key=2; break;
case(0x0e): key=3; break;
}
DGIO_key=0xf0;
switch(DGIO_key)
{
case(0x70): key=key;b++; break; //檢查列
case(0xb0): key=key+4;b++; break;
case(0xd0): key=key+8;b++;break;
case(0xe0): key=key+12; b++;break;
}
}
}
else if(DGIO_key==0x0f)
{tre=0;}
}
void LED()
{
if(b<5)
{
switch(b)
{
case(1): led0=0;led1=1;led2=1;led3=1; break; // 選擇數碼管的位
case(2): led0=1;led1=0;led2=1;led3=1; break;
case(3): led0=1;led1=1;led2=0;led3=1;break;
case(4): led0=1;led1=1;led2=1;led3=0; break;
}
P0=Tab[key]; // 數碼管輸出
delay(8000);
P0=0x00; //消隱
}
}
void int0() //外部中斷0 觸發方式下降沿
{
IT0=1;
EX0=1;
EA=1;
}
void main()
{
while(1)
{
relay=0;
dig();
LED();
if(key==1) //輸入正確密碼順序 開始計數
{
c=c+1;
delay(8000);
}
if(key==9) //輸入正確密碼順序 開始計數
{
c=c+1;
delay(8000);
}
if(key==6) //輸入正確密碼順序 開始計數
{
c=c+1;
delay(8000);
}
if(b==4) // 檢查按鍵是否達到4次
{
if(c!=4) //驗證密碼是否正常
{
while(a<10000) //如果密碼錯誤 蜂鳴器報警 紅燈急速閃速
{L0=1;
delay(3000);
L0=0;
delay(2000);
beep=0;
delay(5000);
beep=1;
delay(5000);
a++;
}
}
else if(c==4)
{for(i=0;i<100;i++) //回圈100次,也就是大約5S
relay=1; //開啟電機
delay(5000); //大約延時50ms
L1=0;
}
relay=0;
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/112876.html
標籤:單片機/工控
