#include<reg51.h>
#include"intrins.h"
void long_delay(void);
void short_delay(void);
void delay10ms(unsigned char);
void write7279(unsigned char, unsigned char);
unsigned char read7279(unsigned char);
void send_byte(unsigned char);
unsigned char receive_byte(void);
unsigned char keym(void);
void set_passward(void);
void input_passward(void);
void flash(void);
void new_a(void);
void new_c(void);
void write_Good(void);
void write_Error(void);
unsigned char key_number,j,k;
unsigned int tmr,n,m,a;
unsigned int code_a[8]={0},answer_a[8]={0};
unsigned long wait_cnter;
sbit cs=P2^2;
sbit clk=P1^2;
sbit dat=P1^3;
sbit key=P3^3;
#define CMD_RESET 0xa4
#define CMD_TEST 0xbf
#define DECODE0 0x80
#define DECODE1 0xc8
#define CMD_READ 0x15
#define UNDECODE 0x90
#define RTL_CYCLE 0xa3
#define RTR_CYCLE 0xa2
#define RTL_UNCYL 0xa1
#define RTR_UNCYL 0xa0
#define ACTCTL 0x98
#define SEGON 0xe0
#define SEGOFF 0xc0
#define BLINKCTL 0x88
//主程序
main()
{
while(1)
{
key_number=keym();
while(key_number==0)
{key_number=keym();}
switch(key_number)
{
case 0x0b:{input_passward;break;}
case 0x13:{set_passward;break;}
}
key_number=0;
}
}
void write7279(unsigned char cmd, unsigned char dta)
{
send_byte (cmd);
send_byte (dta);
}
unsigned char read7279(unsigned char command)
{
send_byte(command);
return(receive_byte());
}
void send_byte( unsigned char out_byte)
{
unsigned char i;
cs=0;
long_delay();
for (i=0;i<8;i++)
{
if (out_byte&0x80)
{
dat=1;
}
else
{
dat=0;
}
clk=1;
short_delay();
clk=0;
short_delay();
out_byte=out_byte*2;
}
dat=0;
}
unsigned char receive_byte(void)
{
unsigned char i, in_byte;
dat=1;
long_delay();
for (i=0;i<8;i++)
{
clk=1;
short_delay();
in_byte=in_byte*2;
if (dat)
{
in_byte=in_byte|0x01;
}
clk=0;
short_delay();
}
dat=0;
return (in_byte);
}
void long_delay(void)
{
unsigned char i;
for (i=0;i<0x30;i++);
}
void short_delay(void)
{
unsigned char i;
for (i=0;i<8;i++);
}
void delay10ms(unsigned char time)
{
unsigned char i;
unsigned int j;
for (i=0;i<time;i++)
{
for(j=0;j<0x390;j++)
{
if (!key)
{
key_int();
}
}
}
}
//密码设置
void set_passward(void)
{
input_passward();
if(a=1)
{
n=-1;
new_c();
write7279(0x98,0xff);
flash();
while(key_number!=0x03)
{
key_number=keym();
switch(key_number)
{
case 0x06:{
n++;
write7279(DECODE0+n,1);
write7279(0x88,n);
code_a[n]=key_number;break;}
case 0x0e:{
n++;
write7279(DECODE0+n,2);
write7279(0x88,n);
code_a[n]=key_number;break;}
case 0x16:{
n++;
write7279(DECODE0+n,3);
write7279(0x88,n);
code_a[n]=key_number;break;}
case 0x05:{
n++;
write7279(DECODE0+n,4);
write7279(0x88,n);
code_a[n]=key_number;break;}
case 0x0d:{
n++;
write7279(DECODE0+n,5);
write7279(0x88,n);
code_a[n]=key_number;break;}
case 0x15:{
n++;
write7279(DECODE0+n,6);
write7279(0x88,n);
code_a[n]=key_number;break;}
case 0x04:{
n++;
write7279(DECODE0+n,7);
write7279(0x88,n);
code_a[n]=key_number;break;}
case 0x0c:{
n++;
write7279(DECODE0+n,8);
write7279(0x88,n);
code_a[n]=key_number;break;}
case 0x14:{
n++;
write7279(DECODE0+n,9);
write7279(0x88,n);
code_a[n]=key_number;break;}
case 0x1e:{
n++;
write7279(DECODE0+n,0);
write7279(0x88,n);
code_a[n]=key_number;break;}
}
key_number=0;
a=0;
}
}
}
//输入密码
void input_passward(void)
{
write7279(0x98,0xff);
flash();
m=-1;
new_a();
while(key_number!=0x03)
{key_number=keym();}
switch(key_number)
{
case 0x06:{
m++;
write7279(DECODE0+m,1);
write7279(0x88,m);
answer_a[m]=key_number;break;}
case 0x0e:{
m++;
write7279(DECODE0+m,2);
write7279(0x88,m);
answer_a[m]=key_number;break;}
case 0x16:{
m++;
write7279(DECODE0+m,3);
write7279(0x88,m);
answer_a[m]=key_number;break;}
case 0x05:{
m++;
write7279(DECODE0+m,4);
write7279(0x88,m);
answer_a[m]=key_number;break;}
case 0x0d:{
m++;
write7279(DECODE0+m,5);
write7279(0x88,m);
answer_a[m]=key_number;break;}
case 0x15:{
m++;
write7279(DECODE0+m,6);
write7279(0x88,m);
answer_a[m]=key_number;break;}
case 0x04:{
m++;
write7279(DECODE0+m,7);
write7279(0x88,m);
answer_a[m]=key_number;break;}
case 0x0c:{
m++;
write7279(DECODE0+m,8);
write7279(0x88,m);
answer_a[m]=key_number;break;}
case 0x14:{
m++;
write7279(DECODE0+m,9);
write7279(0x88,m);
answer_a[m]=key_number;break;}
case 0x1e:{
m++;
write7279(DECODE0+m,0);
write7279(0x88,m);
answer_a[m]=key_number;break;}
}
key_number=0;
if(code_a[0]==answer_a[0]&code_a[1]==answer_a[1]&code_a[2]==answer_a[2]
&code_a[3]==answer_a[3]&code_a[4]==answer_a[4]&code_a[5]==answer_a[5]
&code_a[6]==answer_a[6]&code_a[7]==answer_a[7])
{write_Good();a=1;}
else
{write_Error();a=0;}
}
//输出“GOOD”
void write_Good(void)
{
write7279(0x98,0x3c);
write7279(0x92,0xa7);
write7279(0x93,0x35);
write7279(0x94,0x35);
write7279(0x95,0x75);
}
//输出“Error”
void write_Error(void)
{
write7279(0x98,0x7c);
write7279(0x91,0x4f);
write7279(0x92,0x66);
write7279(0x93,0x66);
write7279(0x94,0x7e);
write7279(0x95,0x66);
}
//按键防抖处理
unsigned char keym(void)
{
unsigned char keyv;
if(key)
return(0);
delay10ms(1);
if(key)
return(0);
else
{
keyv=read7279(CMD_READ);
for(;;)
{
if(key)
break;
}
return(keyv);
}
}
//待输入闪烁显示
void flash(void)
{
write7279(BLINKCTL,0x08);
write7279(UNDECODE,0x08);
write7279(UNDECODE+1,0x08);
write7279(UNDECODE+2,0x08);
write7279(UNDECODE+3,0x08);
write7279(UNDECODE+4,0x08);
write7279(UNDECODE+5,0x08);
write7279(UNDECODE+6,0x08);
write7279(UNDECODE+7,0x08);
}
//数组初始化
void new_a(void)
{
answer_a[0]=0;
answer_a[1]=0;
answer_a[2]=0;
answer_a[3]=0;
answer_a[4]=0;
answer_a[5]=0;
answer_a[6]=0;
answer_a[7]=0;
}
void new_c(void)
{
code_a[0]=0;
code_a[1]=0;
code_a[2]=0;
code_a[3]=0;
code_a[4]=0;
code_a[5]=0;
code_a[6]=0;
code_a[7]=0;
}