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

📄 电子密码1.c

📁 51单片机实现的电子密码
💻 C
字号:
//**********************FileName:电子密码.c*******************************//
//**********************ICCAVR V6.30编译***********************************//
//**************************侯德平****************************************//



#include<io8535v.h>
#include<macros.h>
#include<stdio.h> 
#define uchar unsigned char
#define uint unsigned int
const uchar tab_d[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x71};
                  /*  0    1    2    3    4     5   6    7    8    9    f  */ 
const uchar tab_w[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; //位型码
uchar tab[]={8,8,8,8,8,8};
uchar pw[]={8,4,0,7,1,6};       //密码值 
uchar pwbuf[6];                //输入密码值
uchar count,pwflag,enterflag;

void delay(uint time)	    /*廷时子程序*/
{
 uchar i;
 for(;0<time;time--)
 {
  for(i=0;i<254;i++);
  }
}


uchar keyscan()           /*键扫子程序*/
{
 uchar key,rowkey,colkey;
 
 rowkey=PINB;
 DDRB=0x0f;
 PORTB=0xf0;
 asm("nop");            //廷时1μs
 //delay(1);
 colkey=PINB;
 key=rowkey|colkey;
 DDRB=0xf0;
 PORTB=0x0f;
 while(PINB!=0x0f);
 return(key);
}

void display()        /*显示子程序*/
{ 
  uchar i;
  
  for(i=0;i<6;i++)
  {
    PORTC = tab_w[i];
	PORTA = tab_d[tab[i]];
	delay(30);
   }
}
  

uchar pwcmp()       /*密码比较子程序*/
{
 uchar i,flag;
 for(i=0;i<6;i++)
 {
  if(pw[i]==pwbuf[i])
   {flag = 1;}
  else
   {flag = 0;}
  }
  return(flag);
} 
 
 
 void io_set()     /*I/O设置子程序*/
{
 DDRA=0xff;
 PORTA=0xff;
 DDRB=0xf0;
 PORTB=0x0f;
 DDRC=0xff;
 PORTC=0x00;
 DDRD=0xff;
 PORTD=0xff;
 }
 
void main()     
{
  uchar i,key; 

  io_set();                    //调用I/O设置子程序
 
 while(1)
 {
 
  while(PINB!=0x0f)
  {key = keyscan();}          //调用键扫子程序
  
  
  switch(key)
  {
    case 0x7d:               //4行2列,数字0
        if(count<6)
		 {
		  tab[count] = 10;  //对应密码位上显示"F"
		  pwbuf[count] = 0;
		  key=0;
		  count++;
		  }break;
	case 0xee:              //1行1列,数字1
        if(count<6)
		 {
		  tab[count] = 10;  //对应密码位上显示"F"
		  pwbuf[count] = 1;
		  key=0;
		  count++;
		  }break;
    case 0xed:              //1行2列,数字2
	    if(count<6)
		 {
		  tab[count] = 10;  //对应密码位上显示"F"
		  pwbuf[count] = 2;
		  count++;
		  key=0;
		  }break;
    case 0xeb:              //1行3列,数字3
	    if(count<6)
		 {
		  tab[count] = 10; //对应密码位上显示"F"
		  pwbuf[count] = 3;
		  count++;
		  key=0;
		  }break;
    case 0xde:             //2行1列,数字4
	    if(count<6)
		 {
		  tab[count] = 10; //对应密码位上显示"F"
		  pwbuf[count] = 4;
		  count++;
		  key=0;
		  }break;
    case 0xdd:             //2行2列,数字5
	    if(count<6)
		 {
		  tab[count] = 10; //对应密码位上显示"F"
		  pwbuf[count] = 5;
		  count++;
		  key=0;
		  }break;
    case 0xdb:             //2行3列,数字6
	    if(count<6)
		 {
		  tab[count] = 10; //对应密码位上显示"F"
		  pwbuf[count] = 6;
		  count++;
		  key=0;
		  }break;
    case 0xbe:             //3行1列,数字7
	   if(count<6)
		 {
		  tab[count] = 10; //对应密码位上显示"F"
		  pwbuf[count] = 7;
		  count++;
		  key=0;
		  }break;
    case 0xbd:             //3行2列,数字8
	   if(count<6)
		 {
		  tab[count] = 10; //对应密码位上显示"F"
		  pwbuf[count] = 8;
		  count++;
		  key=0;
		  }break;
    case 0xbb:             //3行3列,数字9
	    if(count<6)
		 {
		  tab[count] = 10; //对应密码位上显示"F"
		  pwbuf[count] = 9;
		  count++;
		  key=0;
		  }break;
    case 0x7e:        //4行1列,取消键
	    key=0;
        count = 0;    //密码计数清零
		DDRD=0xff;
        PORTD=0xff;
		for(i=0;i<6;i++)
		 {
		  tab[i] = 8;
		  pwbuf[i] = 10;
		  }break;
    case 0x7b:         //4行3列,确认键
	    key=0;
	    enterflag = 1; //确认键按下
		if(count==6)   //只有输入6个密码后按确认键才作密码比较
		 {pwflag = pwcmp();}
		else
		 pwflag = 0;   //否则直接pwflag赋0
		 break; 
     default:break;
  }
  
  display();
  if(enterflag==1)   //如果确认键按下
   {
    enterflag = 0;   //确认键标志位回0
	count = 0;       //密码计数清零
    
	if(pwflag==1)   
	      {PORTD=0x7f;}  
    else
	     { PORTD=0xbf;}
   }
  }
}
	  	

⌨️ 快捷键说明

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