#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; }}
导读:目前正在解读《单片机按键密码锁源代码》的相关信息,《单片机按键密码锁源代码》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《单片机按键密码锁源代码》的详细说明。
简介:在这里和大家分享一个基于单片机按键密码锁的源代码。
提醒:《单片机按键密码锁源代码》最后刷新时间 2024-03-14 00:58:14,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《单片机按键密码锁源代码》该内容的真实性请自行鉴别。