定义一个数g,初始化为0,每按下一次键盘g都加1,把第一次的数赋给b显示在数码管上,第二次的数赋给c显示在数码管上,依次类推直到第四位。定义一个确认按键按下后检查密码是否为1112,如果是就。。。。。。如果不是就。。。。。。(必要时可用中断)。用//引起来的程序不对知道方法后要会改程序。
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit dun=P2^6;//数码管段选
sbit wei=P2^7;//数码管位选
//sbit beep=P2^3;//定义蜂鸣器IO口
uchar code table[]={//数码管显示数组
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delayms(uint);//延时函数
void jianpan();//键盘扫描函数
void liushuideng();//流水灯
void shumaguan(uchar,uchar,uchar,uchar);//数码管显示函数
uchar aa,bb,cc,g,key,temp,qian,bai,shi,ge,b,c,d,e,a,ee,ff,kk,gg,dd,hh,zz;
uint shu,num,num1;
void main()
{ //先初始化
// TMOD=0x11;
// TH0=(65536-45872)/256;
// TL0=(65536-45872)%256;
// TH1=(65536-45872)/256;
// TL1=(65536-45872)%256;
// EA=1;
// ET0=1;
// ET1=1;
while(1)
{
jianpan(); //不断扫描键盘
if(g==1) //按下第一次
b=a;
if(g==2) //按下第二次
c=a;
if(g==3) //按下第三次
d=a;
if(g==4) //按下第四次
e=a;
if(cc!=1)
shumaguan(b,c,d,e); //不断扫描数码管把按下的四个数分别显示在数码管上
// if((cc==1)&&(b==1)&&(c==1)&&(d==1)&&(e==2)) //按下确认键(十六进制时那个A键)如果密码为1112
// shumaguan(qian,bai,shi,ge);
// if((cc==1)&&((b!=1)||(c!=1)||(d!=1)||(e!=2)))//如果按下确认键密码错误蜂鸣器响流水灯亮
// {
// beep=hh;
// liushuideng();
// }
}
}
void jianpan()
{
P3=0xfe;
temp=P3;
temp=P3&0xf0;
if(temp!=0xf0)
{
delayms(10);
temp=P3;
temp=P3&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xee:a=0;
g++;
break;
case 0xde:a=1;
g++;
break;
case 0xbe:a=2;
g++;
break;
case 0x7e:a=3;
g++;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xed:a=4;
g++;
break;
case 0xdd:a=5;
g++;
break;
case 0xbd:a=6;
g++;
break;
case 0x7d:a=7;
g++;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb:a=8;
g++;
break;
case 0xdb:a=9;
g++;
break;
// case 0xbb: //确认键打开中断 然后干中断中的事
// {
// TR0=1;
// cc=1;
// shu=b*1000+c*100+d*10+e;
// break;
// }
// case 0x7b: //按下蜂鸣器不再响流水灯不再流水
// {
// hh++;
// dd=1;
// dd++;
// break;
// }
}
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
void shumaguan(uchar qian,uchar bai,uchar shi,uchar ge)//数码管显示函数
{
dun=1;
P0=table[qian];
dun=0;
P0=0xff;
wei=1;
P0=0xfe;
wei=0;
delayms(1);
dun=1;
P0=table[bai];
dun=0;
P0=0xff;
wei=1;
P0=0xfd;
wei=0;
delayms(1);
dun=1;
P0=table[shi];
dun=0;
P0=0xff;
wei=1;
P0=0xfb;
wei=0;
delayms(1);
dun=1;
P0=table[ge];
dun=0;
P0=0xff;
wei=1;
P0=0xf7;
wei=0;
delayms(1);
}
void delayms(uint xms) //延时函数
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
//void T0time() interrupt 1 //中断
//{
// TH0=(65536-45872)/256;
// TL0=(65536-45872)%256;
// num++;
// if(num==20)
// {
// num=0;
// ff++;
// ee--;
// qian=ee/1000;
// bai=ee%1000/100;
// shi=ee%1000%100/10;
// ge=ee%10;
// if(ff==5)
// TR1=1;
//}
//}
// void T1time() interrupt 3 //中断二进制自减
//{
// TH0=(65536-45872)/256;
// TL0=(65536-45872)%256;
// num1++;
//
// if(num1==20)
// {
// num1=0;
// TR0=0;
// kk--;
// qian=kk/2/2/2%2;
// bai=kk/2/2%2;
// shi=kk/2%2;
// ge=kk%2;
// if(kk==0)
// {
// TR1=0;
// }
// }
//}
//void liushuideng()
//{
// gg=0xfe;
// while(dd<=1)
// {
// jianpan();
// beep=hh;
// P1=gg;
// delayms(500);
// gg=_crol_(gg,1);
// }
// P1=0xff;
// wei=1;
// P0=0xf0;
// wei=0;
// dun=1;
// P0=0x3f;
//}
|