完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
#include /*****************************************************************************/ //变量定义 /*****************************************************************************/ ***it wei1=P3^1; ***it wei2=P3^4; ***it wei3=P3^5; ***it wei4=P3^6; //定义位选 ***it led=P3^0; //定义led灯 //模拟开锁功能 ***it buzzer=P3^7; //定义蜂鸣器 //模拟提示报警功能 unsigned char pwnum=0; //密码位选 //用来记录此时的键值已经在哪个密码位 bit err=0; //密码错误标志位 //err=0时 //密码没有错误 //err=1 //进入密码有误状态,接下执行密码错误函数 unsigned char count=0; //错误次数 //记录输入键值的错误次数 unsigned char key=12; //键值 //默认12,一直进入数码显示中断 bit restart=0; //密码重置标志 //restart=0 //普通输入状态 //restart=1 //密码重置状态 unsigned char rsright=0; //密码修改标志 //rsright=0 //退出密码修改状态 //rsright=1 /*****************************************************************************/ //定义数组 /*****************************************************************************/ unsigned char password[]={0,0,0,0}; //密码数组 //记录密码 unsigned char keynum[]={14,14,14,14} ; //键值数组 //记录按下的键值,组成一个四位数组 unsigned char key_mod[]={0xd7,0xee,0xde,0xbe,0xed, 0xdd,0xbd,0xeb,0xdb,0xbb, 0xe7,0xb7} ; //键模 //0~9 //重启键 退出重启键 unsigned char mod1[]={0x3f,0x06,0x1b,0x0f,0x26, 0x2d,0x3d,0x07,0x3f,0x2f, 0x39,0x76,0x3f,0x33,0xc0}; //低八位字模 //0~9 //10:E 11: N 12:O 13:R 14:* unsigned char mod2[]={0x00,0x00,0x22,0x22,0x22, 0x22,0x22,0x00,0x22,0x22, 0x22,0x04,0x00,0x26,0x3f}; //高八位字模 //0~9 //10:E 11: N 12:O 13:R 14:* 函数包 #include #include /*---------------------------------------------------------------------------*/ //ms级delay函数 /*---------------------------------------------------------------------------*/ void delay(int i){ unsigned char k; while (i--) for(k=0;k<110;k++) ; } /*---------------------------------------------------------------------------*/ //数码管动态显示函数 //动态显示键值数组的值 /*---------------------------------------------------------------------------*/ void led_show(){ if(key==12){ wei1=0; P0=mod1[keynum[0]]; P2=mod2[keynum[0]]; delay(5); wei1=1; //显示第一位的键值数组的值 wei2=0; P0=mod1[keynum[1]]; P2=mod2[keynum[1]]; delay(5); wei2=1; //显示第二位的键值数组的值 wei3=0; P0=mod1[keynum[2]]; P2=mod2[keynum[2]]; delay(5); wei3=1; //显示第三位的键值数组的值 wei4=0; P0=mod1[keynum[3]]; P2=mod2[keynum[3]]; delay(5); wei4=1; //显示第四位的键值数组的值 } } /*---------------------------------------------------------------------------*/ //密码输入函数 //通过key将按下键值记录,检测key的值 //如果按下的键等于密码: //按键提示音 //密码位+1:使下一次的密码位右移 //key置12:即清零键值,为下次中断做准备 //如果按下的键不等于密码: //err置1,代表此处密码输入存在错误,为密码错误函数的进入做准备 //其它同正确 /*---------------------------------------------------------------------------*/ void pwin(){ if(key<10&&key>=0){ if(password[pwnum]==key){ //检测按键是否对应正确的密码 buzzer=0; delay(500); buzzer=1; //按键提示音 pwnum++; //密码位右移 key=12; //重置键值 }else { unsigned char i ; for(i=0;i<50;i++) led_show(); err=1; //输入中存在错误 buzzer=0; delay(500); buzzer=1; //按键提示音 pwnum++; //密码位右移 key=12; //重置键值 } } } /*****************************************************************************/ //密码正确函数 //err=0即为密码正确:此次密码无错误 //若处于普通输入状态: //开锁:led亮 //开锁提示:鸣叫,显示"ON" //按键数组清零 //密码位清零:为下次中断初始化 //若处于密码重置状态 //进入密码修改状态 //重置密码时,输入密码正确时的提示 //按键数组清零 //密码重置标志位清零:退出密码重置状态 //密码位清零:为下次中断初始化 /*****************************************************************************/ void pwright(){ while(pwnum==4&&err==0) { if(restart==0){ unsigned char m=10; led=1; //灯亮:开锁功能 buzzer=0; while(m--){ //显示"ON" wei1=1; wei2=1; wei3=0 ; P0=mod1[12]; P2=mod2[12]; delay(50); wei3=1; wei4=0; P0=mod1[11]; P2=mod2[11]; delay(50); wei4=1; }buzzer=1; delay(100); led=0; //开锁提示 keynum[0]=14; keynum[1]=14; keynum[2]=14; keynum[3]=14; //按键数组清零,清除密码输入痕迹 pwnum=0; //密码位清零 }else{ rsright=1; //密码修改状态 buzzer=0; P0=mod1[14]; P2=mod2[14]; //字模:* wei1=0; wei2=0; wei3=0; wei4=0; //位选全开 delay(500); wei1=1; wei2=1; wei3=1; wei4=1; buzzer=1; //重置密码时,输入密码正确时的提示 keynum[0]=14; keynum[1]=14; keynum[2]=14; keynum[3]=14; //按键数组清零,清除密码输入痕迹 restart=0; //密码重置标志位清零 pwnum=0; //密码位清零 } } } /*****************************************************************************/ //密码错误函数 //当密码位等于4时(即密码完整输入一次),且此次输入中存在错误(err=1): //记录错误次数 //密码错误提示 //按键数组清零,清除密码输入痕迹 //密码位清零:为下次中断初始化 //当错误次数累计到3时 //模拟报警 //错误次数清零 /*****************************************************************************/ void pwerror(){ if(pwnum==4&&err==1){ count++; //每四位一次,记录密码输入错误次数 buzzer=0; P0=0x40; P2=0x15; wei1=0; wei2=0; wei3=0; wei4=0; delay(500); wei1=1; wei2=1; wei3=1; wei4=1; buzzer=1; //显示"XXXX" keynum[0]=14; keynum[1]=14; keynum[2]=14; keynum[3]=14; //按键数组清零,清除密码输入痕迹 pwnum=0; //密码位清零 err=0; //重置"存在错误" } while(count==3){ unsigned char n=1000; buzzer=0; P0=0x40; P2=0x15; //显示X,表示错误 while(n--){ //显示*ERR wei1=0; P0=0xc0; P2=0xff; delay(10); wei1=1; wei2=0; P0=mod1[10]; P2=mod2[10]; delay(10); wei2=1; wei3=0; P0=mod1[13]; P2=mod2[13]; delay(10); wei3=1; wei4=0; P0=mod1[13]; P2=mod2[13];; delay(10); wei4=1; } delay(30000); //设置报警时长 buzzer=1; //报警装置 count=0; //错误次数清零 }} /*****************************************************************************/ //密码重置函数 //当key=10时(密码重置键) //进入密码重置状态 //提示进入密码重置状态 //key置12:即清零键值,为下次中断做准备 //密码位清零:为下次中断初始化 /*****************************************************************************/ void repw(){ unsigned char cnt=0; if( key==10){ restart=1; //进入密码重置状态 buzzer=0; P0=mod1[14]; P2=mod2[14]; //字模:* wei1=0; wei2=0; wei3=0; wei4=0; //位选全开 delay(2000); wei1=1; wei2=1; wei3=1; wei4=1; buzzer=1; //显示**** key=12; //key置12:即清零键值,为下次中断做准备 pwnum=0; //位选重新计数 } } /*****************************************************************************/ //退出重置密码状态函数 /*****************************************************************************/ void backre(){ if(key==11) restart=0; key=12; } 3.主函数 #include #include /*****************************************************************************/ //取键中断 //高级中断,打断显示中断 //利用key获取按键键值和修改密码 //执行密码的输入和相应的函数 /*****************************************************************************/ void get_key(void) interrupt 0{ char keys[]={0xfe,0xfd,0xfb,0xf7}; unsigned char i,k; for(i=0;i<4;i++){ delay(10);//led_show(); //消抖 P1=keys; if((P1&0xf0)!=0xf0){ //判断按键是否按下 for(k=0;k<12;k++){ if(key_mod[k]==P1) { key=k; //改变默认值位12的key值 keynum[pwnum]=k; //记录键值 if(rsright!=0&&rsright<=4){ //重置密码正确时进入密码修改状态 rsright++; password[pwnum]=key; //修改密码 } else {rsright=0;} //将rsright清零,退出重置密码正确状态 } } pwin(); //密码输入函数 repw(); //密码重置函数 pwerror(); //密码错误函数 pwright(); //密码正确函数 backre(); //退出重置密码模式 } } } /*****************************************************************************/ //数码管显示中断 /*****************************************************************************/ void ledshow() interrupt 2 { led_show(); IE0=1; //打开取键函数的中断 } /*****************************************************************************/ //主程序 /*****************************************************************************/ void main(){ led=0; IT1=1; IT0=1; //中断触发方式:下降沿触发 IE1=1; IE0=1; //中断请求标志 EX0=1; EX1=1; //中断允许 EA=1; //总中断允许 PX0=1; PX1=0; //中断优先级 while(1)IE1=1; } |
|
|
|
只有小组成员才能发言,加入小组>>
3277 浏览 9 评论
2950 浏览 16 评论
3454 浏览 1 评论
8983 浏览 16 评论
4044 浏览 18 评论
1093浏览 3评论
567浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
564浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2298浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1855浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-19 19:25 , Processed in 1.185485 second(s), Total 81, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号