/*
* GccApplication7.c
*
* Created: 2013/8/18 14:13:52
* Author: sky
*/
#include <avr/io.h>
#include <util/delay.h>
#define uchar unsigned char
#pragma data: code
uchar const table[10]={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90 }; //段码表
uchar const weitable[4] ={ 0xFE, 0xFD,0xFB,0xF7}; //选通值
uchar key[4],temp,num,i=0xff,j=0xff;
uchar const good[]={0xc2,0xc0,0xc0,0xa1};
uchar const keytodoor[]={0xF9,0xB0,0xF9,0x99};
void keys()
{
uchar key1=(PIND&(1<<PD2)),key2=(PIND&(1<<PD3)),key3=(PINA&(1<<PA4)),key4=(PINA&(1<<PA5));
DDRD=0x00;
PORTD=0x05;
DDRA=0x00;
PORTA=0xff;
if(key1==0)
{
_delay_ms(10);
if(key1==0)
{
temp=1;
while(PIND!=0xff);
}
}
if(key2==0)
{
_delay_ms(10);
if(key2==0)
{
temp=2;
while(PIND!=0xff);
}
}
if(key3==0)
{
_delay_ms(10);
if(key3==0)
{
temp=3;
while(PIND!=0xff);
}
}
if(key4==0)
{
_delay_ms(10);
if(key4==0)
{
temp=4;
while(PIND!=0xff);
}
}
}
int main(void)
{
for(num=0;num<4;num++)
{
DDRD=0x00;
DDRA=0x00;
PORTA=0xff;
PORTD=0xff;
while(1){keys();if(temp!=0)break;}
key[num]=table[temp];
DDRA=0x0f;
DDRB=0xff;
PORTB=key[num];
PORTA=weitable[num];
_delay_ms(5000);
temp=0;
}
for(num=0;num<4;num++)
{
if(key[num]!=keytodoor[num])break;
}
if(num==4)
{
while(1)
for(num=0;num<4;num++)
{
DDRA=0xff;
DDRB=0xff;
PORTA=weitable[num];
PORTB=good[num];
_delay_ms(10);
}
}
else
{
DDRB=0xff;
DDRA=0xff;
PORTB=0xbf;
PORTA=0x00;
while(1);
}
}