单片机按键密码锁源代码

来源:本站
导读:目前正在解读《单片机按键密码锁源代码》的相关信息,《单片机按键密码锁源代码》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《单片机按键密码锁源代码》的详细说明。
简介:在这里和大家分享一个基于单片机按键密码锁的源代码。

#include <reg52.h>#define uchar unsigned char#define uint  unsigned int#define KeyPort P1sbit Dula=P2^2;   //段选sbit Wela=P2^3;   //位选sbit Led =P2^0;uchar code smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};   //段码uchar code smg_we[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};      //位码uchar password[8];uchar dis_smg[8];bit Flag=0;uchar KeyScan(void);uchar KeyPro(void);/***********************************************************************************************************  延 时 函 数   *****************************************************************************************************************************/void delayus(uchar t){ while(--t);}void delayms(uchar t){ while(t--) {  delayus(245);  delayus(245); }}/***********************************************************************************************************  显 示 函 数   *****************************************************************************************************************************/void Display(uchar Firstbit ,uchar Num){ static uchar i; P0=0x00; Dula=1;Dula=0; P0=smg_we[i+Firstbit]; Wela=1;Wela=0; P0=dis_smg[i]; Dula=1;Dula=0; i++; if(i==Num)  i=0;}/*************************************************************************************************************  定时初始化   *****************************************************************************************************************************/void Timer0_Init(void){ TMOD|=0X01; TR0=1; ET0=1; EA=1;}/***********************************************************************************************************  设 置 密 码   *****************************************************************************************************************************/void SetPassword(uchar KeyNum){ static uchar i=0; uchar j,n; uchar tempcode[8]; if((KeyNum>=0)&&(KeyNum<=9)) {  Led=1;  if(i==0)  {         for(j=0;j<8;j++)   tempcode[j]=0;  }  if(i<8)  {   tempcode[i]=smg_du[KeyNum];   for(j=0;j<=i;j++)     dis_smg[7-i+j]=tempcode[j];   }  i++;  if(i==8)   i=0; } if(KeyNum==15)      //密码修改确认键 {  KeyNum=0xff;  for(n=0;n<8;n++)  {    password[n]=tempcode[n];    dis_smg[n]=0;  }  dis_smg[0]=0x3f;  dis_smg[1]=0x76;  Flag=0;  i=0;      //静态变量清零,下次进入时可以从新开始 }}/***********************************************************************************************************  输 入 密 码   *****************************************************************************************************************************/void KeyControl(uchar Keynum){ static uchar i=0; uchar j; uchar temp[8]; bit flag; if((Keynum>=0)&&(Keynum<=9))    //数字输入按键 {  Led=0;  if(i==0)  {         for(j=0;j<8;j++)   dis_smg[j]=0;  }  if(i<8)  {   temp[i]=smg_du[Keynum];   for(j=0;j<=i;j++)    dis_smg[7-i+j]=temp[j];   }  i++;  if(i==8)   i=0; } if(Keynum==15)       //确认键 {  Keynum=0xff;  flag=1;  for(j=0;j<8;j++)  {   flag=flag&&(temp[j]==password[j]);//比较八位密码数字是否全正确   dis_smg[j]=0;  }  if(flag)  {    dis_smg[0]=0x3f; // "o"          dis_smg[1]=0x73; // "p"    dis_smg[2]=0x79; // "E"    dis_smg[3]=0x37; // "n"  }  else  {    dis_smg[0]=0x79; // "E"          dis_smg[1]=0x50; // "r"    dis_smg[2]=0x50; // "r"  }  i=0;   //清零,准备下次输入密码 } if(Keynum==14)        //修改密码键 {  Flag=1;  for(i=0;i<8;i++)  {   dis_smg[i]=0x40;  }  i=0;      //静态变量清零,下次进入时可以从新开始 }}/***********************************************************************************************************  控 制 函 数   *****************************************************************************************************************************/void Dominate(void){ uchar keynum; keynum=KeyPro(); if(keynum!=0xff) {  if(Flag==0)   KeyControl(keynum);  else   SetPassword(keynum); }}/***********************************************************************************************************   main 函 数   *****************************************************************************************************************************/void main(){ Timer0_Init(); while(1) {   Dominate(); }}/*********************************************************************************************************** 中断服务函数   *****************************************************************************************************************************/void Timer0(void) interrupt 1{ TH0=0XF8; TL0=0X30; //2ms  Display(0,8);}/***********************************************************************************************************  按 键 扫 描(反复式扫描法)   *************************************************************************************************************/uchar KeyScan(void){ uchar cord_h,cord_l; KeyPort=0x0f; cord_l=KeyPort&0x0f; if(cord_l!=0x0f) {  delayms(10);  if((KeyPort&0x0f)!=0x0f)  {   cord_l=KeyPort&0x0f;   KeyPort=cord_l|0xf0;   cord_h=KeyPort&0xf0;   while((KeyPort&0xf0)!=0xf0);   return (cord_h+cord_l);  } }return (0xff);}uchar KeyPro(void){  switch(KeyScan())  {    case 0x7e:return 0;break;//0 按下相应的键显示相对应的码值    case 0x7d:return 1;break;//1    case 0x7b:return 2;break;//2    case 0x77:return 3;break;//3    case 0xbe:return 4;break;//4    case 0xbd:return 5;break;//5    case 0xbb:return 6;break;//6    case 0xb7:return 7;break;//7    case 0xde:return 8;break;//8    case 0xdd:return 9;break;//9    case 0xdb:return 10;break;//a    case 0xd7:return 11;break;//b    case 0xee:return 12;break;//c    case 0xed:return 13;break;//d    case 0xeb:return 14;break;//e    case 0xe7:return 15;break;//f    default:return 0xff;break;  }}

提醒:《单片机按键密码锁源代码》最后刷新时间 2024-03-14 00:58:14,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《单片机按键密码锁源代码》该内容的真实性请自行鉴别。