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

📄 jianpantongxunckou.c

📁 密码锁程序,可以设置四位密码
💻 C
字号:
/*扫面键盘程序,pc0-pc3接行,pc4-pc7接列,1带上拉电阻 ,其本身的上拉电压太小*/
#include<avr/io.h>

void delayms(char i) 
	{int j;
	for(j=1000;j>1;j--)
	   for(;i>1;i--);
	}

void Init_Io_1(void)
	{
	 DDRA=0xf0; PORTA=0x0f;  //先让高位输出,低位输入且上拉
	}

void Init_Io_2(void)
	{
	 DDRA=0x0f;  PORTA=0xF0;//与上相反
	}
int getkey(void)
	{
	 int key=0;//不让key具有记忆性
	 unsigned char temp;
	 if((~(PINA|0xf0))!=0)  // 有键按下
	   {    
	     delayms(30);
	   if((~(PINA|0xf0))!=0)     
	    {  temp=PINA|0xf0;
	         temp=~temp  ;
	         if(temp==1) key=1;
	         else  if(temp==2) key=5;
	         else  if(temp==4) key=9;
	         else  if(temp==8) key=13;
	         Init_Io_2();
	         asm("nop");//2时间不能太长			 
	         temp=PINA|0x0f;       
	         temp=~temp;
	         temp=(temp>>4);
	        if(temp==1) key+=0;
	        else  if(temp==2) key+=1;
	        else  if(temp==4) key+=2;
	        else  if(temp==8) key+=3;
	       Init_Io_1(); 
      
	      }
	   }
 
	   return key;  //返回1~16键值 
	}


int display(int x)
{
 int i,k,t;
 unsigned char duan[]={0x0C,0xCF,0x25,0x85,0xC6,0x94,0x14,0xCD,0x04,0x84};
  
 unsigned char wei[]={0x01,0x02,0x04,0x08,0x10,0x20};//共有六位
   
 unsigned char  w[6];//设定扫描的个数
  
 
   DDRC=0xff;//置PC口为输入,为段选线
   DDRD=0xff;//置PD口为输入,为位选线

   w[2]=x/1000;//千位
   w[3]=x%1000/100;//百位
   w[4]=x%100/10;//十位
   w[5]=x%10;//个位
   
      for(i=0;i<10;i++)
	            for(k=2;k<6;k++)
	           {
	            PORTD=wei[k];

	            PORTC=duan[w[k]];
               // delay_ms(2);
	
	         for(t=0;t<100;t++);//调节数码管的亮度		
	           }
       
}

void lossen_key(void)

	{
	
	}
int change(unsigned char b[])
    {unsigned  int i;
	 i=b[0]*1000+b[1]*100+b[2]*10+b[3];
	return i;
	}
/*int clear(unsigned int i)
    {
	if(PINB&(1<<1)==0)
	   {i=0;}
	
	return i;
	
	}*/
int main(void)
{   unsigned int code=1986;
    unsigned int i,j,k=0;
    unsigned int flage=0;
	Init_Io_1();
	delayms(2);
	DDRD=0xff;
	DDRB&=~(1<<1);
    PORTB|=(1<<1); //上拉

	 while(1)
	     { 
	     i=getkey();
 	//   k+=i;  //记忆上次的值
	     k=k*10+i;
          while(PINA!=0x0f)
	     {display(k);}//等待按键时放函数
	      delayms(30);      //去除抖动;
          while(PINA==0x0f)
	     {
		  //k=change(a[4]);
		   
		   if(!(PINB&(1<<1)))//随时清零
	       {k=0;}
		   if(k>10000)//溢出清零
		   {k=0;}
		   
		   if(k==code)//密码匹配
		     {PORTD|=(1<<7);}
           else{PORTD&=~(1<<7);}
		   display(k);//无按键按下锁定显示内容	 
		   }
		  
         }
  }

⌨️ 快捷键说明

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