⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mima.c

📁 基于89s51单片机开发板创建的密码锁程序
💻 C
字号:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
//////////////////////////////////////////////////////////
//LED显示段码显示
#define a 0x80
#define b 0x40
#define c 0x20
#define d 0x10
#define e 0x08
#define f 0x04
#define g 0x02
#define dp 0x01
////////////////////////////////////////////////
//LED显示位数
uint weishu;
///////////////////////////////////////////////////////
//延时程序
/*void delay1ms(uint count)
	{
		uint i,j;
		for(i=0;i<count;i++)
			for(j=0;j<120;j++)
				;
	}*/
void delay10ms(uint count)
	{
		uint i,j,k;
		for(i=0;i<count;i++)
			for(j=0;j<10;j++)
				for(k=0;k<120;k++)
					;
	}
/*void delay100ms(uint count)
	{
		uint i,j,k;
		for(i=0;i<count;i++)
			for(j=0;j<100;j++)
				for(k=0;k<120;k++)
					;
	}*/
/////////////////////////////////////////////////
//数据显示字模(共阴)
uchar const disp_code[16]={a+b+c+d+e+f,
                           b+c,
                           a+b+d+e+g,
						   a+b+c+d+g,
						   b+c+f+g,
						   a+c+d+f+g,
						   a+c+d+e+f+g,
						   a+b+c,
						   a+b+c+d+e+f+g,
						   a+b+c+d+f+g,
                           a+b+c+e+f+g,
                           c+d+e+f+g,
                           a+d+e+f,
                           b+c+d+e+g,
                           a+d+e+f+g,
                           a+e+f+g};
///////////////////////////////////////////////////
//16进制转换为10进制的子程序
uchar disp_busf[4];
/*void hex_bcd(uint i)
	{
		uchar j;
		for(j=0;j<4;j++)
			{
				disp_busf[j]=i%10;
				i=i/10;
			}
	}*/
/////////////////////////////////////////////////////
//动态显示子程序                   
void display(void)
	{
		switch(weishu)							  //利用switch控制LED四个的显示位数,如果我们只用了2位,则只显示2位
		{
		case 4:
			P0&=~0x08;
    	    P2=~disp_code[disp_busf[0]];									
			delay10ms(3);
			P0|=0x0f;
		case 3:
    	    P0&=~0x04;
			P2=~disp_code[disp_busf[1]];
			delay10ms(3);
			P0|=0x0f;
		case 2:
			P0&=~0x02;
     	    P2=~disp_code[disp_busf[2]];
			delay10ms(3);
			P0|=0x0f;
		case 1:
			P0&=~0x01;
			P2=~disp_code[disp_busf[3]];
			delay10ms(3);
			P0|=0x0f;
		default:
			P0&=~0x00;
			delay10ms(3);
		}
	}
///////////////////////////////////////////////////////////
//键盘扫描子程序(反转法)
uchar key_scan(void)
	{
		uchar i,j;
    	P1=0x0f;
        i=P1;
        i&=0x0f;
        if(i==0x0f)
			return(0xff);
        delay10ms(1);
        P1|=0x0f;
        i=P1;
        i&=0x0f;
        if(i==0x0f)
			return(0xff);
        P1=0xf0;
        j=P1;
        j&=0xf0;
        return(i+j);
	}
//////////////////////////////////////////////////////////
//键盘键值
uchar const key_code[16]={0x77,0x7b,0x7d,0x7e,0xb7,0xbb,0xbd,0xbe,
                         /*k1   k2   k3   k4   k5   k6   k7   k8*/
                          0xd7,0xdb,0xdd,0xde,0xe7,0xeb,0xed,0xee};
                         /*k9   k10  k11  k12  k13  k14  k15  k16*/ 
////////////////////////////////////////////////////////////
//键盘扫描与键值译码子程序
uchar key(void)
	{
		uchar i,j;
        i=key_scan();
        if(i==0xff)
			return(0xff);
	loop:
		j=key_scan();
        if(j!=0xff) goto loop;
        for(j=0;j<16;j++)
			{
				if(i==key_code[j])
					break;
			}
		return(j);
	}
//////////////////////////////////////////////////
//定时器0的中断服务程序
void xianshi(void) interrupt 1 using 1///中断方式显示数据
     {
	 	TH0=50000/256;
      	TL0=50000%256;
      	display();
	}
/*//////////////////////////////////////////////////
//定时器1的中断服务程序
void alarm(void) interrupt 3 using 2///中断方式控制蜂鸣器
     {
		P3&=0xbf;
	}*/
uchar key_busf;
/*////////////////////////////////////////////////////
//16进制高低位分解子程序
void hex_fen(uchar i)
	{
		disp_busf[0]=i&0x0f;
		disp_busf[1]=i&0xf0;
		disp_busf[1]>>=4;
	}*/
////////////////////////////////////////////////////
//密码设置
uchar mima[4];
int config;					 //验证修改密码是否有足够的权限
void mima_setup(void)
	{
		uchar i,twice=0;
		uchar mima1[4];
		weishu=0;
		if(config==0)
		{
			P0&=0x0f;
			return;
		}
	loop:
		i=key();
        if(i==0xff)
			goto loop;
        else if(i<10&&weishu<4)
			{
				disp_busf[3]=disp_busf[2];
				disp_busf[2]=disp_busf[1];
				disp_busf[1]=disp_busf[0];
				disp_busf[0]=i;
				weishu++;
			}
	     else if(i==0x0d)
			{
				if(weishu!=0)
				{
					disp_busf[0]=disp_busf[1];
					disp_busf[1]=disp_busf[2];
					disp_busf[2]=disp_busf[3];
					weishu--;
				}
			}
		else if(i==0x0f&&weishu==4)
				{
					if(twice==0)
					{
						for(i=0;i<4;i++)
                    	    {mima1[i]=disp_busf[i];}
						twice=1;
					}
					P0|=0xf0;
					if(twice==1)
					{
						for(i=0;i<4;i++)
							{
								if(mima1[i]!=disp_busf[i])
									break;
							}
						if(i==4)
						{
							for(i=0;i<4;i++)
                    	  	  {
							  	mima[i]=disp_busf[i];
								P0|=0xf0;
							  }
							config=0;
							return;
						}
					}
				}
			else
				goto loop;
	}
//////////////////////////////////////////////////////
//输入数据子程序
void shuru(void)
	{
		uchar i,wrong=0;
	loop:
		i=key();
        if(i==0xff)
			goto loop;
        else if(i<10)
			{
				if(weishu!=4)
				{
					disp_busf[3]=disp_busf[2];
					disp_busf[2]=disp_busf[1];
					disp_busf[1]=disp_busf[0];
					disp_busf[0]=i;
					weishu++;
				}
			}
	     else if(i==0x0d)
			{
				if(weishu!=0)
				{
					disp_busf[0]=disp_busf[1];
					disp_busf[1]=disp_busf[2];
					disp_busf[2]=disp_busf[3];
					weishu--;
				}
			}
			else if(i==0x0f&&weishu==4)
				{
					for(i=0;i<4;i++)
                        {if(disp_busf[i]!=mima[i]) break;}
					if(i!=4)
						{
							P0&=0x0f;
							wrong++;
							if(wrong==3)
								{
									P3|=0x40;
//									TH1=10000/256;
//      							TL1=10000%256;
									for(i=0;i<10000;i++)
										{
											i=key();
											if(i==0x0c)
												break;
										}
									P3&=0xbf;
									wrong=0;
								}
						}
					else
						{ 
							P0|=0xf0;
							config=1;
							wrong=0;
						}
					return;
				}
			else if(i==0x0e)
				{
					mima_setup();
					return;
				}
			else
				goto loop;
	}
//////////////////////////////////////////////////////////////
//主程序                        
void main(void)
	{
		TMOD=0x11;
		TH0=50000/256;
		TL0=50000%256;
		ET0=1;
		TR0=1;
		EA=1;
		mima[0]=1;//密码初始化
		mima[1]=0;
		mima[2]=2;
		mima[3]=5;
		config=0;
		weishu=0;//LED初始状态不显示
	loop:
		shuru();
		goto loop;
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -