logo资料库

单片机按键密码锁源代码.pdf

第1页 / 共4页
第2页 / 共4页
第3页 / 共4页
第4页 / 共4页
资料共4页,全文预览结束
单片机按键密码锁源代码 单片机按键密码锁源代码 在这里和大家分享一个基于单片机按键密码锁的源代码。 #include #define uchar unsigned char #define uint unsigned int #define KeyPort P1 sbit 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; } }
分享到:
收藏