"); //-->
#include"reg51.h" #include"intrins.h" #define uchar unsigned char #define uint unsigned int uchar keyvalue,keytemp[7],keyflag,password[6]; uchar romflag,doorflag,adr9346,order,coder,readtemp,codetemp[3],code_case; const uchar keyin[]={0xee,0xed,0xeb,0xe7,0xde,0xdd,0xdb,0xd7,0xbe,0xbd,0xbb,0xb7,0x7e,0x7d,0x7b,0x77}; const uchar value[]={0x03,0x07,0x0b,0x0f,0x02,0x06,0x0a,0x0e,0x01,0x05,0x09,0x0d,0x00,0x04,0x08,0x0c}; sbit door=P1^0; sbit next=P1^1; sbit cs=P3^7; sbit clk=P3^6; sbit di=P3^5; sbit doi=P3^4; //变量说明: //keyvalue:键值(1次的) //keytemp[7]:输入的键值存放处(第7为按下ENTER键设计) //keyflag:按键标志位,当此位为1时有键按下,否则无 //romflag:93C46的密码标志位,当此位为1时有存有密码,否则无 //doorflag:门标志位,即密码是否正确,当此位为1时开门(或密码正确),否则不开(或不正确) //adr9346:要写入或要读出93C46的地址 //order:要送入93C46的信息 //code:读出的密码(1次的) //readtemp:读取数据的临时存放处 //codetemp[3]:读取的密码的临时存放处 //code_case:选择密码存放地址情况(1表示从0x01开始的密码,2表示从0x04开始的备用密码,3表示从0x07开始的身份密码)
void delay(uint j) //延时 { uchar i; for(;j>0;j--) { for(i=0;i<125;i++) {;} } } //延时32us void delay1() { uchar i; for(i=0;i<4;i++) {;} } //键盘扫描 void scan() { uchar i,j,m,first,key,temp; first=0xef; m=0; keyflag=0; for(i=0;i<4;i++) { P2=first; key=P2; if(key!=first) { delay(10); temp=P2; if(key=temp) { for(j=0;j<16;j++) { if(key=keyin[m]) { keyvalue=value[m]; break; } else m++; } keyflag=1; } } if(keyflag==1) break; else first=_crol_(first,1); } } //密码打包存入codetemp[3] void pack() { uchar codepack,packtemp,i; char n=-1; for(i=0;i<3;i++) { keytemp[n++]=codepack; keytemp[n++]=packtemp; codepack=codepack<<4; codepack=codepack+packtemp; codetemp[i]=codepack; } } //密码解包存入password[6] void undo() { uchar codeundo,undotemp,dotemp,i,m; char n=-1; for(i=0;i<3;i++) { codetemp[i]=codeundo; for(m=0;m<4;m++) { codeundo=codeundo>>1; dotemp=CY; undotemp=undotemp+dotemp; undotemp=_crol_(undotemp,1); } password[n++]=codeundo; password[n++]=undotemp; } } //确认比较处理 void enter() { uchar i; for(i=0;i<6;i++) { if(keytemp[i]!=password[i]) break; } if(i==5) doorflag=1; } //发出指令到93C46 void send9346() { uchar i; for(i=0;i<8;i++) { order=order>>1; di=CY; clk=~clk; delay1(); clk=~clk; delay1(); } } //读出93C46的数据 void read9346() { uchar i; coder=0; for(i=0;i<8;i++) { clk=~clk; delay1(); clk=~clk; delay1(); readtemp=doi; coder=coder+readtemp; coder=_cror_(coder,1); } } //从93C46读出密码 void readpassword(uchar adr_case) { uchar i,n; P3=0xf0; delay1(); clk=0; delay1(); if(adr_case==0) {adr9346=0x00;n=1;} else if(adr_case==1) {adr9346=0x01;n=3;} else if(adr_case==2) {adr9346=0x04;n=3;} else if(adr_case==3) {adr9346=0x07;n=3;} order=adr9346+0x80; //加入读指令 for(i=0;i<n;i++) { send9346(); read9346(); codetemp[i]=coder; } cs=0; } //把密码写入93C46 void writepassword(uchar adr_case) { uchar i,n; P3=0xf0; //写使能 delay1(); clk=0; delay1(); order=0x80; send9346(); cs=0; P3=0xf0; //写入数据 delay1(); clk=0; delay1(); if(adr_case==0) {adr9346=0x00;n=1;} else if(adr_case==1) {adr9346=0x01;n=3;} else if(adr_case==2) {adr9346=0x04;n=3;} else if(adr_case==3) {adr9346=0x07;n=3;} for(i=0;i<n;i++) { order=adr9346+0x40; //加入写指令 send9346(); order=codetemp[i]; send9346(); adr9346++; } cs=0; order=0x00; //写禁止 send9346(); cs=0; } //输入处理2 void keytwo() { uchar i=0,led=0xfb; for(;i<7;i++) { while(1) { scan(); if(keyflag==0x01) break; } P1=led; if(keyvalue==0x02) enter(); //判断是否按下确认键 else if(keyvalue==0x00) i=i-1; //判断是否按下清除键 else keytemp[i]=keyvalue; if(doorflag==1) break; led=_crol_(led,1); } } //修改现有密码 void repassword() { uchar i=0,led=0xfb; readpassword(3); undo(); keytwo(); enter(); if(doorflag==1) { next=0; keytwo(); pack(); writepassword(code_case); } } //输入处理 void key() { uchar i=0,led=0xfb; for(;i<7;i++) { while(1) { scan(); if(keyflag==0x01) break; } P1=led; if(keyvalue==0x0b) repassword(); //判断是否按下修改密码键 else if(keyvalue==0x02) enter(); //判断是否按下确认键 else if(keyvalue==0x00) i=i-1; //判断是否按下清除键 else keytemp[i]=keyvalue; if(doorflag==1) break; led=_crol_(led,1); } } //93C46有无密码判断处理 void sign() { readpassword(0); romflag=coder; if(romflag==0x00) { codetemp[0]=0x00; codetemp[1]=0x00; codetemp[2]=0x00; writepassword(1); writepassword(2); writepassword(3); writepassword(0); } } //主函数 void main() { //sign(); doorflag=0; while(1) { P1=0xff; scan(); if(keyflag==0x01) { if(keyvalue==0x03) //按下了输入密码键 { code_case=1; readpassword(code_case); key(); if(doorflag==1) door=0; delay(1000); //开门动作时间1S } else if(keyvalue==0x07) //按下了输入备用密码键 { code_case=2; readpassword(code_case); key(); if(doorflag==1) door=0; delay(1000); //开门动作时间1S } else if(keyvalue==0x0f) //按下了修改身份验证密码键 { code_case=3; readpassword(code_case); undo(); key(); enter(); if(doorflag==1) { next=0; key(); pack(); writepassword(code_case); } } } } }
专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们
相关推荐
LBC817-40LT1G 在电子设计中的未来趋势与应用
选用合适的MOSFET:下一项目的核心选型要点
S3C44B0X中文数据手册第十四章
Meta推出Muse Spark多模态推理模型
TLV320AIC3254 社区视频
三星无惧DRAM崩盘恐慌:一季度涨价翻倍后,二季度再提价 30%
那位能介绍一下HDLC应用方面的知识?
微控制器对比:用于指导你下一个项目的真实基准测试数据
接手人类不愿做的工作:人形机器人充满讽刺的承诺
S3C44B0X中文数据手册第十章
全球芯片大战先抢人只是其一更要抢「台积认证」供应链
分析FPGA收发器的互操作性和信号完整性
555发电机启动蓄电池全自动监控装置电路图
555汽车雨刷自动控制器电路图
S3C44B0X中文数据手册第十一章
怎么样才能让一个网络接口同时有两个ip address?
WS157构成的+12V、0.5A单片开关稳压电源电路
英特尔、马斯克与那条引爆沉寂行业的推文
智能体AI(Agentic AI)不止需要GPU
日本功率半导体整合之谜:确定抱团 但不确定谁和谁抱团
为何我的vxworks反复重启(老站转)
S3C44B0X中文数据手册第十三章
预热式沐浴水箱水位自控器
分析FPGA收发器的互操作性和信号完整性
555钟控定时运行节电插座电路图
各位来的真早,小弟问安啦!
在FPGA上开发嵌入式系统软件
Hitool?IAR Embedded Workbench?
Interfacing High-Speed ADCs to FPGAs with Embedded Transceivers
S3C44B0X中文数据手册第一章